如何在WordPress的函数中使用PHPmaizer

时间:2019-07-30 作者:Rob H

我在WordPress函数中有一个函数。php文件,它在用户元中搜索条件,并根据找到的内容向用户发送电子邮件。我目前使用wp\\u mail()发送电子邮件,这很有效。但是,我想使用包含的PHPMailer类来完成这项工作,以便可以通过SMTP发送消息。

我想我有一个解决方案:https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init, 然而,这似乎只适用于系统生成的消息,而不适用于自定义消息。

此时我只是猜测,但我尝试了这个,但没有运气(WP此时停止加载,没有错误消息):

function my_function() {
    //if things are found send an email
    global $phpmailer;
    $phpmailer->IsSMTP();
    $phpmailer->Host = \'smtp.google.com\';
    $phpmailer->Port = \'587\';
    $phpmailer->SMTPSecure = \'tls\';
    $phpmailer->SMTPAuth = true;
    $phpmailer->Username = \'[email protected]\';
    $phpmailer->Password = \'11111111\';

    $phpmailer->addAddress(\'[email protected]\', \'Joe User\');
    $phpmailer->setFrom(\'[email protected]\', \'Mailer\');
    $phpmailer->addReplyTo(\'[email protected]\', \'Information\');
    $phpmailer->isHTML(true);
    $phpmailer->Subject = \'Here is the subject\';
    $phpmailer->Body    = \'This is the HTML message body <b>in bold!</b>\';              
    $phpmailer->send();
    // Email sent; function over
}
仅供参考,我在标题中调用此函数。我不是将其添加为操作,因为我想控制它的使用位置。

有没有办法直接从我的函数访问PHPMailer类?我想我可以单独加载PHPMailer,但这似乎很愚蠢。

2 个回复
SO网友:izaak

要求“wp包括/类PHP编译器”。php’;修复了我的问题,但我使用代码创建pdf,然后以相同的方式发送。

SO网友:butlerblog

无需使用PHPMailer类代替wp_mail(). wp_mail() 本质上是类的包装器。它只是简化了打包和发送信息的方式。

您可以在初始化PHPMailer元素时访问它,以便wp_mail() 通过SMTP而不是web服务器发送。

你说你不是在添加一个动作来控制它的使用位置,但这正是动作挂钩的目的——它允许你在你想要的时候,在你想要的地方,准确地挂钩。

在这种情况下,需要在初始化PHPMailer时设置所有这些PHPMailer元素。这有一个动作钩-phpmailer_init

使用该挂钩初始化PHPMailer时,可以定义设置:

add_action( \'phpmailer_init\', \'send_smtp_email\' );
function send_smtp_email( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = \'smtp.google.com\';
    $phpmailer->Port       = \'587\';
    $phpmailer->SMTPSecure = \'tls\';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Username   = \'[email protected]\';
    $phpmailer->Password   = \'11111111\';
    $phpmailer->From       = \'[email protected]\';
    $phpmailer->FromName   = \'From Name\';
    $phpmailer->addReplyTo(\'[email protected]\', \'Information\');
}
您需要HTML格式的邮件。你可以把它放进去wp_mail()\'s标头参数,但您可以/应该使用wp_mail_content_type 过滤器;

add_filter( \'wp_mail_content_type\',\'set_my_mail_content_type\' );
function set_my_mail_content_type() {
    return "text/html";
}
正确完成设置后,现在您可以使用wp_mail() 要发送您的消息,您可以在任何地方执行此操作-我建议将此功能挂接到有意义的东西上-例如“template\\u redirect”,以便在消息头发送到下游之前执行此操作:

function my_function() {

    $to = \'[email protected]\';
    $subject = \'Here is the subject\';
    $message = \'This is the HTML message body <b>in bold!</b>\';              

    wp_mail( $to, $subject, $message );

}

Update: Alternate (Contained) Method:

因此,扩展上面概述的内容,假设以下设置是not 你每次开火都想要什么wp_mail() 并且您只需要特定电子邮件的这些设置。

您仍然需要打破设置并适当地钩住它们(否则它们将无法在正确的时间处理)。注意到phpmailer_initwp_mail_content_type 钩子被击中时wp_mail() 正在运行时,您可以在主要功能中设置这些挂钩,运行电子邮件,然后删除它们,这样您就回到了默认状态。

function send_smtp_email( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = \'smtp.google.com\';
    $phpmailer->Port       = \'587\';
    $phpmailer->SMTPSecure = \'tls\';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Username   = \'[email protected]\';
    $phpmailer->Password   = \'11111111\';
    $phpmailer->From       = \'[email protected]\';
    $phpmailer->FromName   = \'From Name\';
    $phpmailer->addReplyTo(\'[email protected]\', \'Information\');
}

function set_my_mail_content_type() {
    return "text/html";
}

function my_function() {

    $to = \'[email protected]\';
    $subject = \'Here is the subject\';
    $message = \'This is the HTML message body <b>in bold!</b>\'; 

    add_filter( \'wp_mail_content_type\',\'set_my_mail_content_type\' );
    add_action( \'phpmailer_init\', \'send_smtp_email\' );

    wp_mail( $to, $subject, $message );

    remove_filter( \'wp_mail_content_type\',\'set_my_mail_content_type\' )
    remove_action( \'phpmailer_init\', \'send_smtp_email\' );

}

相关推荐

Functions.php上未定义$_GET和&_REQUEST索引

我最近尝试学习为我的自定义主题创建一个主题选项页面,这是按照stackoverflow和其他资源的教程进行的。但脚本显示错误if ($_GET[\'page\'] == basename(__FILE__)) { if (\'save\' == $_REQUEST[\'formaction\']) { foreach ($options as $value) { if( isset( $_REQUEST[ $value[\'id\']