这是代码。
$to = 'youraddress@example.com';
$subject = 'Test HTML email';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"";
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Hello World!!!
This is simple text email message.
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
<h2>Hello World!</h2>
<p>This is something with <b>HTML</b> formatting.</p>
--PHP-alt-<?php echo $random_hash; ?>--
<?
//copy current buffer contents into $message variable and delete current output buffer
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
?>
我不遵循它。期待有人可以帮我一个忙。
为什么要生成随机哈希?
为什么我必须在标题中添加边界字符串和mime类型规范?
为什么要使用ob_start();?
4
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
这些线是什么意思?我可以删除它们吗?谢谢。
答案 0 :(得分:1)
生成随机哈希是为了避免它与您的内容发生冲突。
“边界字符串”告诉电子邮件客户端标题的开始和停止位置以及实际电子邮件内容的开始位置。由于您要发送HTML电子邮件,因此您必须明确告知电子邮件客户端它将接收HTML,而不仅仅是任何内容。
否则HTML和内容将直接发送到浏览器,即用户查看您的网站。相反,您希望将HTML存储在变量中并使用它。
Content-Type告诉电子邮件客户端您要发送的kind of content内容以及encoded的内容。
当然你不能删除它们。这就像发送PDF文件而不说它是PDF并没有适当的扩展名 - 你不会知道如何处理它。
注意强>
电子邮件,网站,任何具有结构(包括大多数文件)的内容通常都以“标题”和“正文”结构排列。
标题告诉文件阅读器“body”中的内容。 “身体”是读者应该做的实际内容。
答案 1 :(得分:0)
我不确定为什么在这里使用随机哈希,但我认为确保唯一的边界字符串只是额外的安全性,防止部件之间的名称冲突。
关于内容类型:您需要指定告诉邮件客户端它应该呈现HTML,并指示您的邮件是多部分。 Multipart意味着有多个部分,在您的情况下是基于文本的部分和HTML部分。
边界部分用于将一个部分的内容从另一个部分的内容和标题中分离出来。
根本不需要使用PHP输出缓冲区(ob_start和ob_end_clean),您也可以使用引号或使用HEREDOC输入字符串。使用输出缓冲区的一个优点是您可以结束PHP(使用?>
)并让IDE帮助您编写HTML。确保添加ob_end_clean();
,但它还没有出现在您的代码中。
答案 2 :(得分:0)
你不必。只是它使事情变得更容易:分隔符必须是不属于邮件内容的字符串。
您需要一个边界来分割部分消息。电子邮件消息不是一个字符流。您需要MIME类型,以便电子邮件客户端可以知道每个部分包含的内容。否则,它无法知道它是否是HTML(或JPEG图片,或PowerPoint演示文稿......)
老实说,它似乎是常规字符串赋值的过度复杂的替代品。它不是$message = 'Hello World!';
,而是将Hello World!
打印到标准输出,并将标准输出捕获到变量中。
这些行表示您正在完成邮件的一部分,并且您正在开始一个包含HTML的新邮件。如果您不想添加包含HTML的其他消息部分但是...不是您想要做的,可以删除它们吗?