从PHP发送电子邮件
本教程将介绍如何轻松地从启用PHP的Web服务器发送电子邮件。 它可以用于处理表单数据,发送警报等。它还解释了有关电子邮件头格式化的一点。
系统配置
显然你需要一个web服务器与PHP一起安装。 您还需要确保您的操作系统安装了一些电子邮件代理(例如,在Linux上的Sendmail或IIS下的SMTP服务)。 并确保端口25没有被阻塞。 即使您通过第二台服务器中继邮件,也是必需的。
默认情况下,PHP已启用邮件功能。 但是,您可以在[邮件功能]部分(行#约700)中的'php.ini'文件中指定其他选项。
句法
以下是mail()命令的完整语法:
bool mail ( string $email_address_to, string $subject, string $message_contents [, string $additional_headers [, string $additional_parameters]] );
前3个参数不需要任何解释:收件人电子邮件地址,消息的主题,消息的内容。 $ additional_headers参数包括稍后将列出的电子邮件标题。 $ additional_parameters用于传递特定于用于发送电子邮件的程序(例如sendmail)的选项,很少使用。 您需要检查sendmail的手册页以获取选项列表。
绝对最小值要求您指定以下内容:
mail ( $email_address_to , $subject, $message_contents );
但是,由于合规性原因,建议定义附加标头。 电子邮件消息必须与RFC#822兼容。
下面的示例显示了可以使用的一些电子邮件标题:
- 来自:发件人的电子邮件地址。
- 回复:应答发送到的电子邮件地址。
- 返回路径:这是用于在不传递消息的情况下,必须返回。
- 主题:电子邮件主题。
- CC:碳复写。 所有其他收件人将看到的更多收件人的逗号分隔列表。
- BCC:盲碳复制。 更多收件人的逗号分隔列表,不会被任何其他收件人看到。
- Content-type:定义消息的MIME类型。
- X-Mailer:指定用于发送消息的电子邮件客户端。
要记住的重要事情是,头名称区分大小写,并且每个标题必须以返回和换行符结尾。
每条消息都通过最少2个电子邮件服务器(发件人和收件人)路由。 然而,路由中可能会有更多的电子邮件服务器,例如中继服务器,反垃圾邮件服务器等。每个服务器都将自己的邮件头添加到邮件中。 您还必须记住,根据设置,您的Web服务器可能会交换一些标题字段,例如Return-Path 。 请注意,此字段不会影响回复地址。
例
这是一个简单的例子,它将发送一封电子邮件:
<?php $email_address_to = "recipient@demo.com"; $subject = "Test email subject"; $message_contents = "Hi! This is the content of the test message."; $header = "From: sender@demo.com\r\n"; $header .= "Reply-To: sender@demo.com\r\n"; $header .= "Return-Path: sender@demo.com\r\n"; mail($email_address_to,$subject,$message_contents,$header); ?>
完整例子
此示例显示更多有组织的结构,具有更多选项和更多标题:
<?php // --- CONFIG PARAMETERS --- // // $email_recipient = "recipient@demo.com"; $email_sender = "Sender Name "; $email_return_to = "sender@demo.com"; $email_content_type = "text/html; charset=us-ascii"; $email_client = "PHP/" . phpversion(); // // ------------------------- // // --- DEFINE HEADERS --- // // $email_header = "From: " . $email_sender . "\r\n"; $email_header .= "Reply-To: " . $email_return_to . "\r\n"; $email_header .= "Return-Path: " . $email_return_to . "\r\n"; $email_header .= "Content-type: " . $email_content_type . "\r\n"; $email_header .= "X-Mailer: " . $email_client . "\r\n"; // // ---------------------- // // --- SUBJECT AND CONTENTS --- // // $email_subject = "Test email subject"; $email_contents = "<html>"; $email_contents .= "<h2>Test Email</h2>"; $email_contents .= "<br><b>Sender: " . $email_sender; $email_contents .= "<br><b>Recipient: " . $email_recipient; $email_contents .= "</html>"; // // ---------------------------- // $email_result = mail($email_recipient, $email_subject, $email_contents, $email_header); if ($email_result) echo "Email has been sent!"; else echo "Email has failed!"; ?>
- 注意: Mail()的Windows实现在许多方面与Unix实现不同。 首先,它不使用本地二进制文件来编写消息,而只能在直接套接字上操作,这意味着需要在网络套接字(可以在本地主机或远程机器上)监听MTA。 第二,自定义头像,如From :, Cc :, Bcc:和Date:首先不被MTA解释,但是由PHP解析。 因此,to参数不应该是“Something <someone@example.com>”的形式的地址。 与MTA通话时,邮件命令可能无法正确解析。
- 注意:值得一提的是,mail()函数不适合循环中较大量的电子邮件。 此功能打开和关闭每个电子邮件的SMTP套接字,这不是很有效率。