假设我们有空白的WP网站,并且我们想以编程方式在插件或主题中设置SMTP设置。在不更改核心文件的情况下最简单的方法是什么?
假设我们有空白的WP网站,并且我们想以编程方式在插件或主题中设置SMTP设置。在不更改核心文件的情况下最简单的方法是什么?
Answers:
首先,如果我们看一下wp_mail
函数的实现,我们将看到该函数使用PHPMailer
类来发送电子邮件。我们还可以注意到有一个硬编码的函数call $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 = 'your_username@example.com'; // 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();
}
就这样。
wp_mail
功能的最佳实践。
除了@EugeneManuilov答案。
默认情况下,只能在附加到的回调期间通过@EugeneManuilov已经得到答复的方式进行设置do_action_ref_array()
。源/核心。
<?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()
);
}
插件都可以在GitHub的Gist中使用,因此请考虑从那里检查这些插件以获取任何更新。
这篇文章的其他答案虽然提供了可行的解决方案,但并未解决将SMTP凭据存储在插件文件或functions.php中的安全性问题。在某些情况下可能还可以,但是最佳实践将要求以更安全的方式存储此信息。在保护您的凭据时,确实没有充分的理由不遵循最佳做法。
有人建议将其作为选项保存到数据库中,但是还会提供相同的安全性问题,具体取决于站点拥有的管理用户数以及这些用户是否应该能够看到这些登录凭据。这也是不为此使用插件的相同原因。
最好的方法是在wp-config.php文件中为phpmailer信息定义常量。实际上,这已作为邮件组件中的功能进行了讨论,但目前尚未被接受为实际的增强功能。但是您可以自己添加以下内容到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', 'user@example.com' ); // 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', 'website@example.com' ); // 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中定义了它们,就可以通过使用定义的常量在任何地方使用它们。因此,您可以在插件文件或functions.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;
}
.env
文件。但是wp-config.php
无论如何,没有谁对任何敏感的东西使用版本控制…