0

We have a DATAURL pdf file and we are trying to convert it and send as attachment with wp_mail() as,

$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);

But email is delivering with string only. What is the mistake here?

mpsbhat
  • 2,733
  • 12
  • 49
  • 105

1 Answers1

2

If you send an email with different "Content-Types" in the body you must declaire a "Main Content-Type" in the header.

This "Main Content-Type" could be:

  • multipart/alternative => alternative content, such as a message sent in both plain text and another format such as HTML
  • multipart/mixed => text plus attachments
  • multipart/related => the content belongs together, such as a HTML message with embedded image

In your part it should be multipart/mixed.

The Problem is that after this post "Sending multipart (text/html) emails via wp_mail() will likely get your domain banned" on Stackoverflow and the associated post "wp_mail() sets Content-Type header twice for multipart emails" on trac the PhpMailer detects not correct the "Content-Type" from the email body.

To fix this the Stackoverflow user "bonger" built an workaround by override the pluggable function "wp_mail". In his workaround the variable "message" could be an associative array and with the array keys you can control the content types.

You find the orginal code under this link: https://wordpress.stackexchange.com/a/191974

I extend bonger's code a little bit so that an Base64 coded attachment can be send.

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);
        }
    }
}

Test case:

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');

Usefull links:

Multipurpose Internet Mail Extensions - Wikipedia

Send PHP HTML mail with attachments - Stackoverflow

user141080
  • 212
  • 3
  • 10
  • Nice hack method and well explained. Thank you especially for mentioning `multipart/mixed`. BTW, we triend with our code given in question and included multipart/mized but still unable to send both html & attachments. Without html, if there is only attachments are delivering successfully by setting header to `application/pdf`. – mpsbhat Jul 10 '18 at 03:42