我有一个问题。
我想将图片附加到电子邮件中,并将其内联显示,以及其他一些由php生成的内容。问题是我没有最简单的想法如何使用内联wp_mail使用的文件附件数组来附加。
我的解决方案是在base64中对图像进行编码,并将它们内嵌到html中,如下所示:
<img alt="The Alt" src="data:image/png;base64,*etc*etc*etc" />
但问题是Gmail / Outlook会从图片中删除src数据。所以它落在了
<img alt="The Alt" />
有什么线索要修改(与base64一起使用的标头)或如何使用附件将它们嵌入内联?
谢谢, 拉杜。
答案 0 :(得分:17)
wp_mail
使用PHPMailer
类。此类具有内联附件所需的所有功能。
要在wp_mail()发送电子邮件之前更改phpmailer对象,您可以使用过滤器phpmailer_init
。
$body = '
Hello John,
checkout my new cool picture.
<img src="cid:my-cool-picture-uid" width="300" height="400">
Thanks, hope you like it ;)';
这是如何在您的电子邮件正文中插入图片的示例。
$file = '/path/to/file.jpg'; //phpmailer will load this file
$uid = 'my-cool-picture-uid'; //will map it to this UID
$name = 'file.jpg'; //this will be the file name for the attachment
global $phpmailer;
add_action( 'phpmailer_init', function(&$phpmailer)use($file,$uid,$name){
$phpmailer->SMTPKeepAlive = true;
$phpmailer->AddEmbeddedImage($file, $uid, $name);
});
//now just call wp_mail()
wp_mail('test@example.com','Hi John',$body);
就是这样。
答案 1 :(得分:3)
如果出现意外的T_FUNCTION错误,则是由于PHP版本&lt; 5.3。在这种情况下,创建一个以更传统的方式执行此操作的函数:
function attachInlineImage() {
global $phpmailer;
$file = '/path/to/file.jpg'; //phpmailer will load this file
$uid = 'my-cool-picture-uid'; //will map it to this UID
$name = 'file.jpg'; //this will be the file name for the attachment
if (is_file($file)) {
$phpmailer->AddEmbeddedImage($file, $uid, $name);
}
}
add_action('phpmailer_init','attachInlineImage');
答案 2 :(得分:1)
我需要更好的方式,因为我只需一步发送多封邮件,并非所有邮件都应该具有相同的嵌入图像。所以我使用康斯坦丁的这个解决方案,但我的修改: - )
wp_mail('test@example.org', 'First mail without attachments', 'Test 1');
$phpmailerInitAction = function(&$phpmailer) {
$phpmailer->AddEmbeddedImage(__DIR__ . '/img/header.jpg', 'header');
$phpmailer->AddEmbeddedImage(__DIR__ . '/img/footer.png', 'footer');
};
add_action('phpmailer_init', $phpmailerInitAction);
wp_mail('test@example.org', 'Mail with embedded images', 'Example <img src="cid:header" /><br /><img src="cid:footer" />', [
'Content-Type: text/html; charset=UTF-8'
], [
__DIR__ . '/files/terms.pdf'
]);
remove_action('phpmailer_init', $phpmailerInitAction);
wp_mail('test@example.org', 'Second mail without attachments', 'Test 2');
第一个wp_mail
将没有附件。
第二个wp_mail
将包含嵌入的图像。
第三个wp_mail
将没有附件。
现在工作正常
答案 3 :(得分:1)
我创建了此类,以管理向电子邮件正文添加图像并对其进行清理。
此外,如果您定义SENDGRID_PASSWORD
,它将使用Sendgrid而不是服务器来发送电子邮件
本文是有关如何使用wordpress将图像嵌入电子邮件正文中的逐步指导
https://codewriteups.com/embed-images-in-email-body-using-wp_mail-and-phpmailer
<?php
/*
* Send HTML Emails with inline images
*/
class Custom_Mailer
{
public $email_attachments = [];
public function send($to, $subject, $body, $headers, $attachments)
{
/* Used by "phpmailer_init" hook to add attachments directly to PHPMailer */
$this->email_attachments = $attachments;
/* Setup Before send email */
add_action('phpmailer_init', [$this, 'add_attachments_to_php_mailer']);
add_filter('wp_mail_content_type', [$this, 'set_content_type']);
add_filter('wp_mail_from', [$this, 'set_wp_mail_from']);
add_filter('wp_mail_from_name', [$this, 'wp_mail_from_name']);
/* Send Email */
$is_sent = wp_mail($to, $subject, $body, $headers);
/* Cleanup after send email */
$this->email_attachments = [];
remove_action('phpmailer_init', [$this, 'add_attachments_to_php_mailer']);
remove_filter('wp_mail_content_type', [$this, 'set_content_type']);
remove_filter('wp_mail_from', [$this, 'set_wp_mail_from']);
remove_filter('wp_mail_from_name', [$this, 'wp_mail_from_name']);
return $is_sent;
}
public function add_attachments_to_php_mailer(&$phpmailer)
{
$phpmailer->SMTPKeepAlive=true;
/* Sendgrid */
if (defined('SENDGRID_PASSWORD')) {
$phpmailer->IsSMTP();
$phpmailer->Host="smtp.sendgrid.net";
$phpmailer->Port = 587;
$phpmailer->SMTPAuth = true;
$phpmailer->SMTPSecure = 'tls';
$phpmailer->Username="apikey";
$phpmailer->Password = SENDGRID_PASSWORD; /* api key from sendgrid */
}
/* Add attachments to mail */
foreach ($this->email_attachments as $attachment) {
if (file_exists($attachment['path'])) {
$phpmailer->AddEmbeddedImage($attachment['path'], $attachment['cid']);
}
}
}
public function set_content_type()
{
return "text/html";
}
public function set_wp_mail_from($email)
{
//Make sure the email is from the same domain
//as your website to avoid being marked as spam.
return strip_tags(get_option('admin_email'));
}
public function wp_mail_from_name($name)
{
return get_bloginfo('name');
}
}
/* Set mail parameters */
$to = 'test@example.com';
$subject = 'Inline Img';
$body = '<h1>Image:</h1> <img src="cid:my_img_cid"/>';
$headers = "";
$my_attachments = [
[
"cid" => "my_img_cid", /* used in email body */
"path" => plugin_dir_path(__FILE__) . '/my_img.png',
],
];
$custom_mailer = new Custom_Mailer();
$custom_mailer->send($to, $subject, $body, $headers, $my_attachments);
答案 4 :(得分:0)
AddEmbeddedImage只接受两个参数,因此请确保不包含示例中的$ name参数。
答案 5 :(得分:0)
将以下代码添加到functions.php中,以将您的图像包含在所有电子邮件中(例如签名徽标)。
function attachInlineLogo() {
global $phpmailer;
if (!( $phpmailer instanceof PHPMailer )) {
require_once ABSPATH . WPINC . '/class-phpmailer.php';
require_once ABSPATH . WPINC . '/class-smtp.php';
$phpmailer = new PHPMailer(true);
}
$strFilePath = 'ABSOLUTE LOGO PATH';
$strFileUID = 'UNIQUE-UID'; //UID TO USE IN HTML TEMPLATE
$strFileName = 'LOGO NAME';
if (is_file($strFilePath)) {
$phpmailer->SMTPKeepAlive = true;
$phpmailer->AddEmbeddedImage($strFilePath, $strFileUID, $strFileName);
}
}
add_action('phpmailer_init', 'attachInlineLogo');
在您的HTML代码中
<img src='cid:UNIQUE-UID' />
谢谢。