文本和 HTML 电子邮件的 MIME

Posted

技术标签:

【中文标题】文本和 HTML 电子邮件的 MIME【英文标题】:MIME for Text and HTML emails 【发布时间】:2014-09-26 04:14:05 【问题描述】:

如何修改此代码以添加 MIME 并包含电子邮件的文本版本?就像代码成功发送了 html 格式的电子邮件一样。我正在使用文本编辑器、php、HTML 和 mysql 数据库。 (此代码的目的是向新注册的用户发送一个链接,用于验证注册过程中提供的电子邮件地址。)

$first_name =$register_data['first_name'];
$to         =$register_data['email'];
$from       ='support@mysite.com';
$subject    = 'Verify email address to activate account';
$email_code =$register_data['email_code'];

$headers    = "From: $from\r\n";
$headers    .= "Content-type: text/html\r\n";

$path       ="activate.php?email=" . $to . "&email_code=" . $email_code . "";

$message    = <<<EOF
    <html>
        <head>
            <base href="https://mysite.com">
        </head>
        <header>
            <img src="images/logo.png"><br>
            <img src="images/header.png">
        </header>
        <body>
            <br>
            <table style="width:600px">
                <tr>
                    <td style="width:10px"></td>
                    <td>Dear $first_name,</td> 
                    <td style="width:10px"></td>
                </tr>
                <tr></tr>
                <tr>
                    <td></td>
                    <td>Thank you for registering!  To activate your account, please verify your email address address by clicking on the verify button below.</td>
                    <td></td>
                </tr>
            </table>
            <p>
            <table style="width:600px">
                <tr>
                    <td style="width:10px"></td>
                    <td><center><a href =$path><img src="images/verify_button.png"></a></center></td>
                    <td style="width:10px"></td>
                </tr>
            </table>
            </p>
            <p>
            <table style="width:600px">
                <tr>
                    <td style="width:10px"></td>
                    <td>Thanks for registering!</td> 
                    <td style="width:10px"></td>
                </tr>
                <tr>
                    <td style="width:10px"></td>
                    <td>-- mysite</td> 
                    <td style="width:10px"></td>
                </tr>
            </table>
            </p>
        </body>
    </html>
EOF;

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

【问题讨论】:

考虑使用PHP Mailer:github.com/PHPMailer/PHPMailer 【参考方案1】:

MIME 语法

根据 RFC 2046(BNF 语法,稍微简化),这是多部分消息正文的结构:

multipart-body := [序言 CRLF] 虚线边界CRLF 身体部分 *封装 闭合分隔符 [CRLF 结语] dash-boundary := "--" 边界 body-part := MIME-part-headers [CRLF *OCTET] 封装 := 分隔符 CRLF 身体部位 delimiter := CRLF 破折号边界 close-delimiter := 分隔符“--”

另请注意,消息中的每一行必须CRLF-pair 结束(例如"\r\n")并且不得超过 1000 个字符(包括CRLF)。这通常不是text/plaintext/html 的问题,但如果有疑问,请在body-part 上使用chunk_split (base64_encode ()) 并为该部分添加Content-transfer-encoding: base64 标头。

代码

下面的代码是不言自明的:

$first_name =$register_data['first_name'];
$to         =$register_data['email'];
$from       ='support@mysite.example';
$subject    = 'Verify email address to activate account';
$email_code =$register_data['email_code'];

$boundary = md5(uniqid()); /* Unlikely to match any of body parts. */

$headers = "From: $from\r\n"
         . "MIME-Version: 1.0\r\n"
         . "Content-Type: multipart/alternative; boundary=\"$boundary\"\r\n";

$text_msg = <<<EOF
Your text message.
EOF;

$html_msg = <<<EOF
<html><title>Title</title><p>Your HTML message.
EOF;

$body = "--$boundary\r\n"         /* dash-boundary */
      . "Content-Type: text/plain\r\n"
      . "\r\n"
      . $text_msg
      . "\r\n--$boundary\r\n"     /* delimiter */
      . "Content-Type: text/html\r\n"
      . "\r\n"
      . $html_msg
      . "\r\n--$boundary--\r\n";  /* close-delimiter */

mail ($to, $subject, $body, $headers);

参考文献

完整的细节可以在以下位置找到:

RFC 5322 Internet Message Format RFC 2045 (MIME) Part One: Format of Internet Message Bodies RFC 2046 (MIME) Part Two: Media Types

【讨论】:

以上是关于文本和 HTML 电子邮件的 MIME的主要内容,如果未能解决你的问题,请参考以下文章

使用 MIME::Entity 将 HTML 电子邮件转换为纯文本

仅发送纯文本电子邮件,正文中包含 Rails mime 部分

带有纯文本部分、html 部分和附件的电子邮件

只获取 MIME 电子邮件的“文本/纯文本”部分

将一些文件附加到 MIME 多部分电子邮件

MIME php邮件仅显示文本/纯文本版本[关闭]