文本和 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/plain
或text/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 电子邮件转换为纯文本