在 wp_mail 中将 Datauri 字符串作为附件发送

Send Datauri string as attachment in wp_mail

我们有一个 DATAURL pdf 文件,我们正在尝试将其转换并作为附件发送 wp_mail() 作为,

$str = "data:application/pdf;base64,JVBERi0xLjMKJf////8KNSAwIG9iago8PAovVHlwZSAvUGFnZQovUGFyZW50IDEgMCBSCi9NZWRpYUJveCBbMCAwIDU5NS4yOCA4NDEuODldCi9Db250ZW50cyAzIDAgUgovUmVzb3VyY2VzIDQgMCBSCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9Qcm9jU2V0IFsvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJXQovRm9udCA8PAovRjEgNiAwIFIKPj4KPj4KZW5kb2JqCjcgMCBvYmoKPDwKL1Byb2R1Y2VyIChwZGZtYWtlKQovQ3JlYXRvciAocGRmbWFrZSkKL0NyZWF0aW9uRGF0ZSAoRDoyMDE4MDcwODA1MTE0OVopCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL0lCV0dRQStSb2JvdG8tUmVndWxhcgovRmxhZ3MgNAovRm9udEJCb3ggWy03MzYuODE2NDA2IC0yNzAuOTk2MDk0IDExNDguNDM3NSAxMDU2LjE1MjM0NF0KL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MjcuNzM0Mzc1Ci9EZXNjZW50IC0yNDQuMTQwNjI1Ci9DYXBIZWlnaHQgNzEwLjkzNzUKL1hIZWlnaHQgNTI4LjMyMDMxMwovU3RlbVYgMAovRm9udEZpbGUyIDggMCBSCj4+CmVuZG9iagoxMCAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvQ0lERm9udFR5cGUyCi9CYXNlRm9udCAvSUJXR1FBK1JvYm90by1SZWd1bGFyCi9DSURTeXN0ZW1JbmZvIDw8Ci9SZWdpc3RyeSAoQWRvYmUpCi9PcmRlcmluZyAoSWRlbnRpdHkpCi9TdXBwbGVtZW50IDAKPj4KL0ZvbnREZXNjcmlwdG9yIDkgMCBSCi9XIFswIFs5MDggNzEyLjg5MDYyNSA1MjkuNzg1MTU2IDI0Mi42NzU3ODEgNTcwLjMxMjUgMjU3LjMyNDIxOV1dCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMAovQmFzZUZvbnQgL0lCV0dRQStSb2JvdG8tUmVndWxhcgovRW5j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"; 
$str =  explode(',', $str)[1];
$pdf = base64_decode($str);
$eol = PHP_EOL;
$uid = md5(uniqid(time()));
$to = 'toemail';
$attachment_content = chunk_split($pdf);

////Email content
$headers[] = 'Content-Type: text/html; charset=UTF-8';
$email_body = "--" . $uid . $eol;
$email_body .= "Content-Transfer-Encoding: 7bit" . $eol;
$email_body .= "Test Mail" . $eol;

////Attachment
$email_body .= "--" . $uid . $eol;
$email_body .= "Content-Type: application/pdf; name=\"test.pdf\"" . $eol;
$email_body .= "Content-Transfer-Encoding: base64" . $eol;
$email_body .= "Content-Disposition: attachment; filename=\"test.pdf\"" . $eol. $eol;
$email_body .= $attachment_content . $eol;
$email_body .= "--" . $uid . $eol;

wp_mail($to, "Test Email", $email_body, $headers);

但是电子邮件仅通过字符串传送。这里有什么错误?

如果您在 body 中发送包含不同 "Content-Types" 的电子邮件,您必须在 header 中声明 "Main Content-Type"。

这个 "Main Content-Type" 可能是:

  • multipart/alternative => 替代内容,例如以纯文本和另一种格式发送的消息,例如 HTML
  • multipart/mixed => 文字加附件
  • multipart/related => 内容属于同一类,例如带有嵌入图像的 HTML 消息

你这边应该是multipart/mixed.

问题是在post“Sending multipart (text/html) emails via wp_mail() will likely get your domain banned" on Whosebug and the associated post "wp_mail() sets Content-Type header twice for multipart emails”之后,PhpMailer 检测到电子邮件 body.

中的 "Content-Type" 不正确

为了解决这个问题,Whosebug 用户“bonger”通过覆盖可插入函数 "wp_mail" 构建了一个解决方法。在他的解决方法中,变量 "message" 可以是一个关联数组,使用数组键可以控制内容类型。

你在这个link下面找到原码:https://wordpress.stackexchange.com/a/191974

我稍微扩展了 bonger 的代码,以便可以发送 Base64 编码的附件。

elseif ( is_array($message) ) {

    foreach ($message as $type => $body) 
    {    
        if ($type === 'text/html') {
            $phpmailer->Body = $body;
        }
        elseif ($type === 'text/plain') {
            $phpmailer->AltBody = $body;
        }
        elseif ( $type === 'base64')
        {   
            $phpmailer->addStringAttachment( $body['content'], $body['name'] );
        }
        else 
        {
            $phpmailer->AddAttachment($body, '', 'base64', $type);
        }
    }
}

测试用例:

function my_test_func()
{
$to = "test@gmail.com";

$subject = 'wp_mail testing multipart';

// your pdf as base64
$str = "data:application/pdf;base64,JVBERi0xLjMKJf////8KNSAwIG9iago8PAovVHlwZSAvUGFnZQovUGFyZW50IDEgMCBSCi9NZWRpYUJveCBbMCAwIDU5NS4yOCA4NDEuODldCi9Db250ZW50cyAzIDAgUgovUmVzb3VyY2VzIDQgMCBSCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9Qcm9jU2V0IFsvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJXQovRm9udCA8PAovRjEgNiAwIFIKPj4KPj4KZW5kb2JqCjcgMCBvYmoKPDwKL1Byb2R1Y2VyIChwZGZtYWtlKQovQ3JlYXRvciAocGRmbWFrZSkKL0NyZWF0aW9uRGF0ZSAoRDoyMDE4MDcwODA1MTE0OVopCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL0lCV0dRQStSb2JvdG8tUmVndWxhcgovRmxhZ3MgNAovRm9udEJCb3ggWy03MzYuODE2NDA2IC0yNzAuOTk2MDk0IDExNDguNDM3NSAxMDU2LjE1MjM0NF0KL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MjcuNzM0Mzc1Ci9EZXNjZW50IC0yNDQuMTQwNjI1Ci9DYXBIZWlnaHQgNzEwLjkzNzUKL1hIZWlnaHQgNTI4LjMyMDMxMwovU3RlbVYgMAovRm9udEZpbGUyIDggMCBSCj4+CmVuZG9iagoxMCAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvQ0lERm9udFR5cGUyCi9CYXNlRm9udCAvSUJXR1FBK1JvYm90by1SZWd1bGFyCi9DSURTeXN0ZW1JbmZvIDw8Ci9SZWdpc3RyeSAoQWRvYmUpCi9PcmRlcmluZyAoSWRlbnRpdHkpCi9TdXBwbGVtZW50IDAKPj4KL0ZvbnREZXNjcmlwdG9yIDkgMCBSCi9XIFswIFs5MDggNzEyLjg5MDYyNSA1MjkuNzg1MTU2IDI0Mi42NzU3ODEgNTcwLjMxMjUgMjU3LjMyNDIxOV1dCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMAovQmFzZUZvbnQgL0lCV0dRQStSb2JvdG8tUmVndWxhcgovRW5j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"; 
$str =  explode(',', $str)[1];

$message['text/plain'] = 'Hello world! This is plain text...';

$message['base64'] = array('content' => base64_decode($str), 'name' => 'test.pdf');

$message['text/html'] = '<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

<p>Hello World! This is HTML...</p> 

</body>
</html>';

// send email
wp_mail( $to, $subject, $message );
}

add_action('init', 'my_test_func');

有用 links:

Multipurpose Internet Mail Extensions - Wikipedia

Send PHP HTML mail with attachments - Whosebug