从WordPress向网站用户发送包含自定义域的HTML电子邮件

时间:2018-06-22 作者:Frank Santaguida

我希望在我的WordPress网站/系统中向用户发送电子邮件。我想收到一些邮件,上面写着:

你还有X个学分来完成Y。

你的最后期限是Z。

十、 Y,Z是从我在系统中创建的自定义字段和/或sql查询中提取的信息。

我正在寻找一个插件或一些关于如何通过代码手动完成这项工作的提示。我会按需发送这些邮件,也会按月发送,等等。

感谢您的指导,如果您需要更多信息,请告诉我。我尽量使它尽可能简单。也许wp mail是一种方式?

1 个回复
SO网友:Andy Macaulay-Brook

基本信息

您可以使用wp_mail():

wp_mail( $to, $subject, $message, $headers, $attachments )
$to 可以是多个收件人的字符串或数组。任何符合RFC 2822的地址都可以使用,因此您可以包括真实姓名和电子邮件地址。

$subject &;$message 是字符串,$message可以是HTML字符串。

或者,$headers 可以是字符串或其他电子邮件标题的数组,以及$attachments 可以是要附加的文件数组。

HTML电子邮件

如果您对内容使用HTML,那么在发送电子邮件之前,您可以向过滤器添加一个简单的功能,该功能将为您正确设置mime类型:

function wpse306737_set_html_content_type($content_type){
    return \'text/html\';
}

add_filter( \'wp_mail_content_type\', \'wpse306737_set_html_content_type\' );
发送电子邮件后,最好再次删除此过滤器,以免影响以后在WP代码运行中发送的任何电子邮件:

remove_filter( \'wp_mail_content_type\', \'wpse306737_set_html_content_type\' );
默认情况下,发件人地址电子邮件来自wordpress@sitename.您可以使用筛选器更改此设置:

add_filter( \'wp_mail_from\', \'wpse306737_mail_from\' );
add_filter( \'wp_mail_from_name\', \'wpse306737_mail_from_name\' );

function wpse306737_mail_from() {
    return \'[email protected]\';
}

function wpse306737_mail_from_name() {
    return \'John Smith\';
}
如果愿意,也可以设置标题,

$headers[] = \'From: John Smith <[email protected]>\';
但WP过滤器似乎更符合WP的方式。

其他标题

$headers[] = \'Cc: The Shop <[email protected]>\';
$headers[] = \'Bcc: Jane Jones <[email protected]>\';
构建消息消息消息只是一个字符串,所以要连接纯文本、HTML和WP中的任何数据。如果我们使用的是post meta字段,并且处于循环中,那么:

$message = \'\';
$custom_fields = get_post_custom();
$message .= \'You have \' . $custom_fields[\'X\'] . \' credits remaining to fulfill \' . $custom_fields[\'Y\'] . \'.\';
$message .= \'Your deadline is \' . $custom_fields[\'Z\'] . \'.\';
关于元数据检索的一点注记get_post_custom() 在循环中返回当前帖子的所有自定义字段。您可以使用post ID调用它,以获取特定post的元数据:get_post_custom(3) 例如

get_post_custom() 将返回一个包含所有post meta的数组,其中一些可能已序列化,一些可能在数组中,因此您可能会发现使用多个调用get_post_meta() 这将允许您通过元键获取数据,并指定它是单个值还是多个值:get_post_meta( 3, \'total_points\', true ) 将为带有键的元字段返回单个值total_points 附在ID为3的帖子上。

您没有说明要使用的数据是如何存储的,但有用于检索用户元、术语元和注释元的等效函数。get_user_meta(), get_term_meta() &;get_comment_meta() 所有工作方式与get_post_meta().

事实上,如果您查看源代码,只要有一个数据库表,WP就会很高兴地返回任何元数据,因此如果您的表有合适的名称,您甚至可以使用内置函数并利用WordPress元缓存来创建自己的数据库表。这个get_{type}_meta() 我提到的所有调用函数get_metadata(). 使命感get_metadata( \'thing\', 3 ) 将检查名为thingmeta 并将使用它检索元数据。get_metadata() 还有一个过滤器get_{$meta_type}_metadata 以缩短此数据库查找,从而允许您替换所需的任何数据源。

通过发送邮件,您可以获得:

add_filter( \'wp_mail_from\', \'wpse306737_mail_from\' );
add_filter( \'wp_mail_from_name\', \'wpse306737_mail_from_name\' );

function wpse306737_mail_from() {
    return \'[email protected]\';
}

function wpse306737_mail_from_name() {
    return \'John Smith\';
}

$headers = array(); // let\'s be safe
$headers[] = \'Cc: The Shop <[email protected]>\';
$headers[] = \'Bcc: Jane Jones <[email protected]>\';

$message = \'\';
$custom_fields = get_post_custom();
$message .= \'<p>You have \' . $custom_fields[\'X\'] . \' credits remaining to fulfill \' . $custom_fields[\'Y\'] . \'.</p>\';
$message .= \'<p><strong>Your deadline is \' . $custom_fields[\'Z\'] . \'.</strong></p>\';

$to = \'Site User <[email protected]>\';
$subject = \'Meet your deadline!\';

function wpse306737_set_html_content_type($content_type){
    return \'text/html\';
}

add_filter( \'wp_mail_content_type\', \'set_html_content_type\' );

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

remove_filter( \'wp_mail_content_type\', \'set_html_content_type\' );
发送大量电子邮件您可能希望通过有效的SMTP帐户或事务性电子邮件服务发送电子邮件,以保持服务器的声誉并提高可交付性,这样您就可以利用SPF、DKIM和DMARC。

结束