如何以编程方式设置SMTP

时间:2012-12-13 作者:Eugene Manuilov

假设我们有一个空白的WP站点,并且希望在插件或主题中以编程方式设置SMTP设置。在不更改核心文件的情况下,最简单的方法是什么?

3 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

首先,如果我们看看wp_mail 函数,我们将看到此函数使用PHPMailer 类发送电子邮件。我们还可以注意到有硬编码的函数调用$phpmailer->IsMail();, 使用PHP的mail() 作用这意味着我们不能对其使用SMTP设置。我们需要打电话isSMTP 的功能PHPMailer 班此外,我们还需要设置SMTP设置。

为了实现这一目标,我们需要获得$phpmailer 变量现在我们来看看phpmailer_init 发送电子邮件之前调用的操作。因此,我们可以通过编写动作处理程序来完成所需的工作:

add_action( \'phpmailer_init\', \'wpse8170_phpmailer_init\' );
function wpse8170_phpmailer_init( PHPMailer $phpmailer ) {
    $phpmailer->Host = \'your.smtp.server.here\';
    $phpmailer->Port = 25; // could be different
    $phpmailer->Username = \'[email protected]\'; // if required
    $phpmailer->Password = \'yourpassword\'; // if required
    $phpmailer->SMTPAuth = true; // if required
    // $phpmailer->SMTPSecure = \'ssl\'; // enable if required, \'tls\' is another possible value

    $phpmailer->IsSMTP();
}
仅此而已。

SO网友:kaiser

添加至@EugeneManuilov答案。

SMTP设置

默认情况下,只能在附加到do_action_ref_array(). Source/core.

<?php
defined( \'ABSPATH\' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer SMTP Settings
 * Description: Enables SMTP servers, SSL/TSL authentication and SMTP settings.
 */

add_action( \'phpmailer_init\', \'phpmailerSMTP\' );
function phpmailerSMTP( $phpmailer )
{
    # $phpmailer->IsSMTP();
    # $phpmailer->SMTPAuth   = true;  // Authentication
    # $phpmailer->Host       = \'\';
    # $phpmailer->Username   = \'\';
    # $phpmailer->Password   = \'\';
    # $phpmailer->SMTPSecure = \'ssl\'; // Enable if required - \'tls\' is another possible value
    # $phpmailer->Port       = 26;    // SMTP Port - 26 is for GMail
}
默认情况下,WordPress不会为您提供任何调试输出。相反,它只是返回FALSE 如果发生错误。以下是修复此问题的小插件:

<?php
defined( \'ABSPATH\' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer Exceptions & SMTP
 * Description: WordPress by default returns <code>FALSE</code> instead of an <code>Exception</code>. This plugin fixes that.
 */

add_action( \'phpmailer_init\', \'WCMphpmailerException\' );
function WCMphpmailerException( $phpmailer )
{
    if ( ! defined( \'WP_DEBUG\' ) OR ! WP_DEBUG )
    {
        $phpmailer->SMTPDebug = 0;
        $phpmailer->debug = 0;
        return;
    }
    if ( ! current_user_can( \'manage_options\' ) )
        return;

    // Enable SMTP
    # $phpmailer->IsSMTP();
    $phpmailer->SMTPDebug = 2;
    $phpmailer->debug     = 1;

    // Use `var_dump( $data )` to inspect stuff at the latest point and see
    // if something got changed in core. You should consider dumping it during the
    // `wp_mail` filter as well, so you get the original state for comparison.
    $data = apply_filters(
        \'wp_mail\',
        compact( \'to\', \'subject\', \'message\', \'headers\', \'attachments\' )
    );

    current_user_can( \'manage_options\' )
        AND print htmlspecialchars( var_export( $phpmailer, true ) );

    $error = null;
    try
    {
        $sent = $phpmailer->Send();
        ! $sent AND $error = new WP_Error( \'phpmailerError\', $sent->ErrorInfo );
    }
    catch ( phpmailerException $e )
    {
        $error = new WP_Error( \'phpmailerException\', $e->errorMessage() );
    }
    catch ( Exception $e )
    {
        $error = new WP_Error( \'defaultException\', $e->getMessage() );
    }

    if ( is_wp_error( $error ) )
        return printf(
            "%s: %s",
            $error->get_error_code(),
            $error->get_error_message()
        );
}
存储库中都有插件Gist on GitHub, 因此,考虑从那里检查这些插件以获取任何更新。

SO网友:butlerblog

这篇文章的其他答案虽然提供了一个可行的解决方案,但没有解决将SMTP凭据存储在插件文件或函数中的安全问题。php。在某些情况下,这可能还可以,但最佳做法要求以更安全的方式存储此信息。在保护您的凭据时,没有理由不遵循最佳做法。

有些人建议将其作为一个选项保存到DB中,但也会根据站点的管理用户数量以及这些用户是否应该能够看到这些登录凭据来提供相同的安全问题。这也是不使用插件的原因。

最好的方法是在wp配置中为phpmailer信息定义常量。php文件。这实际上是discussed as a feature in the Mail Component, 但目前还没有被视为真正的增强。但您可以通过将以下内容添加到wp config中来自己完成。php:

/**
 * Set the following constants in wp-config.php
 * These should be added somewhere BEFORE the
 * constant ABSPATH is defined.
 */
define( \'SMTP_USER\',   \'[email protected]\' );    // Username to use for SMTP authentication
define( \'SMTP_PASS\',   \'smtp password\' );       // Password to use for SMTP authentication
define( \'SMTP_HOST\',   \'smtp.example.com\' );    // The hostname of the mail server
define( \'SMTP_FROM\',   \'[email protected]\' ); // SMTP From email address
define( \'SMTP_NAME\',   \'e.g Website Name\' );    // SMTP From name
define( \'SMTP_PORT\',   \'25\' );                  // SMTP port number - likely to be 25, 465 or 587
define( \'SMTP_SECURE\', \'tls\' );                 // Encryption system to use - ssl or tls
define( \'SMTP_AUTH\',    true );                 // Use SMTP authentication (true|false)
define( \'SMTP_DEBUG\',   0 );                    // for debugging purposes only set to 1 or 2
一旦在wp config中定义了这些。php,通过使用定义的常量,它们可以在任何地方使用。因此,您可以在插件文件或函数中使用它们。php。(特定于OP,请使用插件文件。)

/**
 * This function will connect wp_mail to your authenticated
 * SMTP server. Values are constants set in wp-config.php
 */
add_action( \'phpmailer_init\', \'send_smtp_email\' );
function send_smtp_email( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = SMTP_HOST;
    $phpmailer->SMTPAuth   = SMTP_AUTH;
    $phpmailer->Port       = SMTP_PORT;
    $phpmailer->Username   = SMTP_USER;
    $phpmailer->Password   = SMTP_PASS;
    $phpmailer->SMTPSecure = SMTP_SECURE;
    $phpmailer->From       = SMTP_FROM;
    $phpmailer->FromName   = SMTP_NAME;
}
这里有更多的细节in this post 和agist on github here.

结束

相关推荐

Email from new comments

我的博客电子邮件运行良好。我收到所有的电子邮件时,新的帖子和新的注册。但当有人发表评论时,我没有收到任何电子邮件。是的,我勾选了管理设置。有什么想法吗?