繁体   English   中英

在php中发送HTML电子邮件?

[英]Sending HTML Email in php?

这是代码。

$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";
?>

我做得不好。 希望有人可以帮我一个忙。

  1. 为什么要生成随机哈希?

  2. 为什么必须在标头中添加边界字符串和mime类型规范?

  3. 为什么要使用ob_start();?

4。

--PHP-alt-<?php echo $random_hash; ?> 
 Content-Type: text/html; charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit

这些行是什么意思? 我可以删除它们吗? 谢谢。

  1. 生成随机散列是为了避免它与您的内容冲突。

  2. “边界字符串”告诉电子邮件客户端标题开始和停止的位置以及实际电子邮件内容的开始位置。 由于要发送HTML电子邮件,因此必须明确告知电子邮件客户端它将接收HTML,而不仅仅是任何内容。

  3. 否则,HTML和内容将直接发送到浏览器,即用户正在查看您的网站。 相反,您想将HTML存储在变量中,并使用它。

  4. Content-Type告诉电子邮件客户端您要发送哪种内容以及如何对其进行编码

当然您不能删除它们。 这就像向您发送PDF文件而没有说它是PDF且没有适当的扩展名-您将不知道如何处理。

注意

电子邮件,网站,任何具有结构(包括大多数文件)的结构通常都以“标头”和“正文”结构布置。

标头告诉文件阅读器“正文”中应包含的内容。 “正文”是读者应该做的实际内容。

我不确定为什么在这里使用随机哈希,但是我认为确保唯一的边界字符串,防止部件之间的名称冲突只是额外的安全性。

关于内容类型:您需要指定该类型以告知邮件客户端它应该呈现HTML,并指示您的邮件是多部分的。 多部分表示有多个部分,在您的情况下,这是一个基于文本的部分和一个HTML部分。

边界部分用于将一个部分的内容与另一部分的内容以及标题分开。

根本不需要使用PHP输出缓冲区(ob_start和ob_end_clean),也可以只使用引号或HEREDOC输入字符串。 使用输出缓冲区的一个优点是可以结束PHP(使用?> ),并让IDE帮助您编写HTML。 确保添加ob_end_clean(); 但是,它尚未包含在您的代码中。

  1. 不用了 只是它使事情变得简单:分隔符必须是不属于邮件内容的字符串。

  2. 您需要一个边界以将消息分成几部分。 电子邮件就是字符流。 您需要一个MIME类型,以便电子邮件客户端可以知道每个部分包含的内容。 否则,它不知道它是否为HTML(或JPEG图片或PowerPoint演示文稿...)。

  3. 老实说,它看起来像是对常规字符串分配的过度复杂替换。 而不是做$message = 'Hello World!'; ,它会打印Hello World! 到标准输出,并将标准输出捕获到变量中。

  4. 这些行表示您正在完成消息的一部分,并且正在开始一个包含HTML的新消息。 如果您不想添加包含HTML但又不是...的消息部分,则可以删除它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM