PHP 的mail函数可用于从 PHP 应用程序发送电子邮件,但应避免使用裸函数。
一般情况下,建议不要依赖裸mail() 函数进行更广泛的使用,了解原因很重要。
所以,请花点时间阅读它。
官方 php.net 参考中提到的一个问题与发送大量电子邮件时的性能有关。
但是,还有更重要的原因可以避免自己摆弄邮件功能。
你可能认为从 PHP 发送电子邮件很容易,因为它看起来很容易,甚至在发送带有附件的 HTML 电子邮件时也是如此。
这是我想了很长时间,直到我注意到标题重复没有明显的原因。
这让我阅读了 RFC,突然我意识到我可能会遇到其他问题。
电子邮件可能会在我们没有意识到的情况下“悄悄地”变得格式错误,即使我们在代码中做对了,这种情况也可能发生。
从 PHP 发送 HTML 电子邮件的正确方法:
$from = 'John Doe <john@example.com>'; $to = 'John Doe 1 <john1@example.com>'; //Can be a comma separated list $headers = array(); $headers[] = 'MIME-Version: 1.0'; $headers[] = 'Content-type: text/html; charset=UTF-8'; $headers[] = 'From: ' . $from; $headers[] = 'Reply-To: ' . $from_email; //$headers[] = 'Cc: '; //Everyone can see these recipients //$headers[] = 'Bcc: '; //Secret recipients mail($to, $subject, $message, implode(PHP_EOL, $headers));
标题格式
每个标头必须以 CRLF 结尾。
Postfix 会自动替换 EOL,因此使用 "\r\n" 或者仅使用 "\n" 都没有关系。
在 PHP 脚本中,它可以通过双引号字符串添加:“\r\n”,但是,为了最大的可移植性,可以使用 PHP_EOL。
此外,在使用 postfix 时,我们必须在整个脚本中保持一致,并且如果我们一直使用“\r\n”,不要突然开始只使用“\n”。
Postfix 的创建者 Wietse Venema 写道:
- Postfix 接收(LF 或者 CRLF)格式的本地提交,SMTP 格式(CRLF)的 SMTP 提交,以及不使用 CR 或者 LF 格式的 QMQP 提交。
具体来说,Postfix 接受 UNIX 格式 (LF) 或者 MSDOS 格式 (CRLF) 格式的本地提交,但我们不知道混合格式。 - Postfix 将邮件以不使用 CR 或者 LF 的格式存储在队列中。
- Postfix 以 UNIX (LF) 格式传送本地邮件,以 SMTP 格式 (CRLF) 传送 SMTP 邮件。
如果 PHP 应用程序程序员格式化了,那就太好了
以一致的方式发送电子邮件。例如,他们可以使用
包含 END-OF-LINE 终止符的变量,而不是
到处都是硬编码的 LF 或者 CRLF 行终止符。
那是基本的软件工程实践。
作者:Wietse Venema
因此,在代码中,标头的格式应如下所示:
$headers = array(); $headers[] = 'MIME-Version: 1.0' . PHP_EOL; $headers[] = 'Content-type: text/html; charset=UTF-8' . PHP_EOL; $headers[] = 'To: ' . $to . PHP_EOL; $headers[] = 'From: ' . $from . PHP_EOL; $headers[] = 'Reply-To: ' . $from_email . PHP_EOL;
注意使用 PHP_EOL 而不是 "\r\n"。 Postfix 对 "\r\n" 和 "\n" 都有效,但是为了让脚本也能在 Windows 上运行,PHP_EOL 是比在脚本中硬编码更好的选择。
PHP_EOL 将匹配 Windows 上使用的 "\r\n" 换行符,以及 Linux 上使用的 "\n"。 Postfix 可以同时使用两者,并且会在发送电子邮件时使用“\r\n”自动分隔标题。
限制和最大行长度
不幸的现实是,电子邮件是一个非常古老的标准,受到许多限制和糟糕的实现。使电子邮件与常用的电子邮件客户端广泛兼容并不是一项小任务。除了发送带有正确格式和标题的电子邮件的问题外,HTML 的支持也很差,虽然基本格式很好,但由于客户端处理 HTML 和 CSS 的方式不同,更复杂的布局可能会中断。
正文行的最大长度为 998 个字符,如果折叠在错误的位置,这可能会破坏 HTML 电子邮件的格式。
邮件头字段的最大行长度很小。我认为它只有大约 72 个字符,此时应该“折叠”标题。其工作方式是在 PHP 中插入 ([CRLF] + [SPACE]) 或者 "\r\n "。