第13章电子邮件类
第13章 电子邮件类
电子邮件,相信这个词对于正处在互联网时代的人们为说是最熟悉不过的字眼了。从第一封电子邮件发送成功到现在几乎人人都有一个电子邮箱,可想而知,电子邮件在互联网中扮演的角色有多么重要。本章就来详细讲解如何使用PHP发送电子邮件。
13.1 用mail函数发送邮件
PHP提供mail()函数,允许直接从脚本中发送电子邮件。其使用语法如下:
bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )
其中的to参数是电子邮件收件人,或收件人列表。subject是电子邮件的主题(不能包含任何换行符,否则邮件可能无法正确发送)。message表示需要发送的信息,行之间必须以一个LF(\n)分隔。每行不能超过70个字符。
虽然使用mail()函数发送邮件很简单,但是需要注意一个前提:要使邮件函数可用,PHP需要有已安装且正在运行的邮件系统。要使用的程序是由php.ini文件中的配置设置定义的。
以下是对相关配置选项的简要解释。
- SMTP:仅用于Windows,PHP在mail()函数中用来发送邮件的SMTP服务器的主机名称或者IP地址。
- smtp_port:仅用于Windows,SMTP服务器的端口号,默认为25。自PHP 4.3.0起可用。
- sendmail_from:Windows专用,规定从PHP发送的邮件中使用的"from"地址。
- sendmail_path:UNIX系统专用,规定sendmail程序的路径(通常是/usr/sbin/sendmail或/usr/lib/sendmail)
下面的代码13-1演示了如何使用mail()来发送一封简单的电子邮件。
代码13-1 使用mail发送电子邮件
<?php
$message = "第一行\n第二行\n第三行"; // 需要发送的信息
$message = wordwrap($message, 70); // 为了防止其中一行的字符数大于70
mail("test@example.com", "我的主题", $message); // 发送电子邮件
?>
这段代码首先创建需要发送的信息,因为内容的每行不能超过70个字符,所以使用wordwrap()来进行换行操作。最后使用mail()函数发送这个电子邮件。
但是通常发送的邮件不单单包含文字,更多的时候含有图片等信息。这个时候就可以使用mail()来发送一个HTML内容的电子邮件,如代码13-2所示。
代码13-2 发送一个HTML格式的邮件
<?php
$to = "mary@example.com" . ", "; //收件人
$subject = "生日快乐"; //主题
$message = "
<html>
<head>
<title>祝你生日快乐</title>
</head>
<body>
<p>小美,祝你生日快乐!</p>
<p>今天是你17岁的生日,希望你能像花儿一样成长,快乐!</p>
</body>
</html>
";// HTML格式的内容
// 必须设置发送的header
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=gb2312" . "\r\n";
// 附加的一些headers
$headers .= "To: Mary <mary@example.com>" . "\r\n";
$headers .= "From: Andy <andy@example.com>" . "\r\n";
mail($to, $subject, $message, $headers);
?>
以上代码中首先设置了收件人、主题和含HTML内容的邮件信息。与代码13-1不同的是,这段代码还设置了header头信息,并规定了允许发送HTML格式的内容。最后直接调用mail()函数,带上相应的入参,即可发送邮件。
注意 使用mail()函数发送电子邮件,需要系统本身就已安装电子邮件系统且在运行中,还需要在php.ini做好相应的配置。在发送HTML格式的文件时,需要加上如代码13-2所示的特定header的内容。
13.2 使用SMTP发送邮件
上一节中已经介绍了使用mail()来发送电子邮件,但是通常情况下服务器是没有安装电子邮件系统的,所以有很大的局限性。如果使用SMTP来发送电子邮件的话,就没有这个烦恼了。而且现在很多网站的电子邮件系统都是提供SMTP服务的。本节就针对这个问题,介绍如何使用SMTP来发送电子邮件。
本节使用的代码需要用到一个PHP开源的发送电子邮件类叫做PHPMailer。就如它的名字一样,PHPMailer是一个使用PHP编写的邮件发送类,同时,PHPMailer也是一个功能强大的类。不但提供含有SMTP类用来发送邮件,而且还提供相应的POP3类可以用来收取邮件。从其官方网站(http://phpmailer.worxware.com)下载成功后会得到一个压缩包,因为只需要用到它的SMTP功能,所以只解压缩其中的主文件(class.phpmailer.php)和SMTP类文件(class.smtp.php)到网站相应的目录即可。
代码13-3演示了使用SMTP发送邮件的例子。
代码13-3 使用SMTP发送邮件
<span class="kindle-cn-bold">使用SMTP发送邮件</span><hr />
<?php
if(isset($_POST["submit"])) {
include("class.phpmailer.php"); //包含phpmailer类
$from = $_POST["from"];
$to = $_POST["to"];
$subject = $_POST["subject"];
$send_body = $_POST["send_body"];
$smtp = "smtp.gmail.com"; //使用的smtp服务器
$port = 465; //端口号
$username = "username@gmail.com"; //账户
$password = "password"; //密码
$mail= new PHPMailer(); //建立新对象
$mail->IsSMTP(); //设定使用SMTP方式寄信
$mail->SMTPAuth = true; //设定SMTP需要验证
$mail->SMTPSecure = "ssl"; // Gmail的SMTP主机需要使用SSL连接
$mail->Host = $smtp; //SMTP服务器地址
$mail->Port = $port; //端口号
$mail->CharSet = "gb2312"; //邮件的编码格式
$mail->Username = $username; //邮箱账号
$mail->Password = $password; //邮箱密码
$mail->From = $from; //寄件者信箱
$mail->FromName = $from; //寄件者姓名
$mail->Subject = $subject; //邮件标题
$mail->Body = $send_body; //邮件内容
$mail->IsHTML(true); //邮件内容
$mail->AddAddress($to); //收件者
if(!$mail->Send()) {
echo "发送错误: " . $mail->ErrorInfo;
} else {
echo "<div align=center>邮件发送成功,请注意查收!</div>";
}
die();
}
?>
<form id="form1" name="form1" method="post" action="">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td align="right">收件人:</td>
<td><input type="text" name="to" id="to" /></td>
</tr>
<tr>
<td align="right">主题:</td>
<td><input type="text" name="subject" id="subject" /></td>
</tr>
<tr>
<td align="right">内容:</td>
<td><textarea name="send_body" id="send_body" cols="45" rows="5"></textarea></td>
</tr>
<tr>
<td align="right">来自:</td>
<td><input type="text" name="from" id="from" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit" id="submit" value="提交" /></td>
</tr>
</table>
</form>
因为使用PHPMailer类,所以程序在开始的时候使用include()函数将这个类的主文件包含进来。然后用new方法创建一个PHPMailer实例。对其赋值相关的参数,最后调用该对象的send函数即可发送电子邮件。
Tips 现在很多时候都是用gmail或者qq等支持ssl的smtp邮箱来发送电子邮件。这时需要将php.ini中“;extension=php_openssl.dll”前的分号去掉,重启系统后就能开启openssl模块。且在使用PHPMailer类发送邮件时,需要特别设置一个参数SMTPSecure的值为ssl。
首先当没有数据提交的时候,显示的是一个发送电子邮件的表单,如图13.1所示。输入相应的数据并单击“提交”按钮后,该程序就能发送电子邮件,成功后的结果如图13.2所示。
![]() |
![]() |
| 图13.1 使用SMTP发送电子邮件表单 | 图13.2 使用SMTP发送电子邮件结果 |
13.3 典型实例
【实例13-1】发送一个带附件的邮件。
在使用电子邮件的时候常常需要附带一些图片或者文字,这时就要求发送邮件时能有带上附件的功能。同样地,本节也是用开源的PHPMailer类来实现发送一个带附件的邮件,下面就来具体讲解。
当然使用PHPMailer类来发送一个带附件的邮件是非常简单的。如同上一节发送SMTP邮件一样,对其设置必要的信息后,只要调用PHPMailer对象的AddAttachment()函数,传入相应附件的路径即可。具体如代码13-4所示。
代码13-4 发送一个带附件的邮件
<span class="kindle-cn-bold">使用SMTP发送邮件</span><hr />
<?php
if(isset($_POST["submit"])) {
include("class.phpmailer.php"); //包含phpmailer类
$from = $_POST["from"];
$to = $_POST["to"];
$subject = $_POST["subject"];
$send_body = $_POST["send_body"];
$smtp = "smtp.gmail.com"; //使用的smtp服务器
$port = 465;//端口号
$username = "username@gmail.com"; //账户
$password = "password"; //密码
$mail= new PHPMailer(); //建立新对象
$mail->IsSMTP(); //设定使用SMTP方式寄信
$mail->SMTPAuth = true; //设定SMTP需要验证
$mail->SMTPSecure = "ssl"; // Gmail的SMTP主机需要使用SSL连接
$mail->Host = $smtp; //SMTP服务器地址
$mail->Port = $port; //端口号
$mail->CharSet = "gb2312"; //邮件的编码格式
$mail->Username = $username; //邮箱账号
$mail->Password = $password; //邮箱密码
$mail->From = $from; //寄件者信箱
$mail->FromName = $from; //寄件者姓名
$mail->Subject = $subject; //邮件标题
$mail->Body = $send_body; //邮件内容
$mail->IsHTML(true); //邮件内容
$mail->AddAddress($to); //收件者
$uploaddir = "upload/"; //上传附件放置的路径
$uploadfile = $uploaddir . basename($_FILES["userfile"]["name"]);
if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) {//如果上传成功
$mail->AddAttachment($uploadfile); //添加附件
}
if(!$mail->Send()) {
echo "发送错误: " . $mail->ErrorInfo;
} else {
echo "<div align=center>带附件的邮件发送成功,请注意查收!</div>";
}
die();
}
?>
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td align="right">收件人:</td>
<td><input type="text" name="to" id="to" /></td>
</tr>
<tr>
<td align="right">主题:</td>
<td><input type="text" name="subject" id="subject" /></td>
</tr>
<tr>
<td align="right">内容:</td>
<td><textarea name="send_body" id="send_body" cols="45" rows="5"></textarea></td>
</tr>
<tr>
<td align="right">来自:</td>
<td><input type="text" name="form" id="form" /></td>
</tr>
<tr>
<td align="right">附件:</td>
<td><input type="file" name="userfile" id="userfile" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit" id="submit" value="提交" /></td>
</tr>
</table>
</form>
以上代码基本与代码13-3一致,只是这里的表单中多了一个可以选择附件的文件域,用来上传附件用。然后发送邮件的服务器代码中,使用PHPMailer对象的AddAttachment()函数将上传上来的文件作为一个附件发送。
首次运行该代码后,得到一个发送电子邮件的表单,如图13.3所示。填入相关信息,选择附件并单击提交按钮以后,便开始发送带附件的邮件。成功以后返回消息,如图13.4所示。
![]() |
![]() |
| 图13.3 发送一个带附件的邮件表单 | 图13.4 发送一个带附件的邮件结果 |
13.4 小结
读者也许会问,PHP不是已经内置了mail()函数了吗,为什么要用PHPMailer呢?确实,mail()函数更快,但是,PHPMailer却可以使发送邮件变得更加便捷,发送附件和HTML邮件也成为可能。同时,可以使用你自己喜欢的SMTP服务器来发送邮件,而不是仅限于UNIX平台(mail()函数就有这个限制,对于广大Windows主机用户来说,简直是噩梦)。总之,PHPMailer能带来更加便捷的体验。
13.5 习题
一、填空题
1. 在PHP中内置发送电子邮件的函数是_____。要使这个函数能正常运行,需要在本机配置_____服务。
2. 开源的PHPMailer不但提供了发送电子邮件使用的_____类,同时也提供了用于接收邮件的_____类。
3. 通过PHPMailer来发送带支持ssl功能的电子邮件时,需要打开PHP的_____模块。
4. 如果使用PHPMailer来发送带附件的电子邮件,则需要使用到它的_____函数。
二、选择题
1. 以下不是合法的电子邮件地址的是( )。
A. john@php.net
B. "John Coggeshall" <someone@internetaddress.com>
C. joe@example.com
D. jean-cóggeshall@php.net
2. 以下哪种情况会用到mail函数的第五个(最后一个)参数$additional_parameters( )
A. 从UNIX或Windows/Novell发送邮件时都会用到。
B. 只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时。
C. 只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时。
D. PHP里用不到这个参数。
3. 以下哪种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)( )
A. 只有在发送非普通文本(ASCII)数据时。
B. 需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)。
C. 任何时候都可以用它来指出MIME的编码类型。
D. 只能用来指定特殊的编码格式(例如base64)。
4. 使用PHPMailer类来发送电子邮件时,它的哪个属性是用来指定邮件编码的( )
A. SMTPAuth
B. Subject
C. Body
D. CharSet
三、简答题
1. 使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
2. 简单描述一下使用PHPMailer发送SMTP电子邮件的一般步骤。




