PHP发送邮件 技术详解

PHP对邮件的操作处理可能大部分开发者都已经了解,但是对于邮件处理在PHP中到底有几种方式可能只有一个模糊的概念,今天我们针对PHP发送邮件的技术做一次详细的解析,以供大家学习和交流

jesen
1
2020-04-12 19:41:49
文档目录
我的书签
 

PHP 使用内置函数mail发送邮件

PHP为我们提供了内置函数mail,可以直接用来发送邮件,但是它有一定的限制条件:使用内置mail()函数来发送邮件,必须要有一台不需要验证的SMTP服务器(也就是需要在本地搭建一个SMTP服务器,邮件服务器位于网络上必须要有登录验证机制,否则风险就太大了),对于使用虚拟主机或者VPS的开发者来说就可以不用考虑此方法了。如下代码为发送一份纯文本邮件:
$to = "w3capi@163.com"; //收件人 
$subject = "this is a test"; //邮件主题 
$message = "this is a body to test "; //邮件正文
mail($to,$subject,$message);

PHP 使用PEAR mail发送邮件

在PEAR扩展中的提供的Mail类,功能非常强大:可支持纯文本、HTML格式的内容;各协议字段都可设置编码,正确配置可避免中文乱码的问题;也可以支持附件等功能,官方地址:https://pear.php.net/package/Mail,在安装有pear工具的服务器中可以直接使用命令:pear install -a Mailpear install -a Mail_mime快速安装,没有命令权限或者没有安装pear工具的朋友也可以直接下载此类的PHP源码,然后引入就可以了。(注:Mail类依赖 Net/SMTP.php 和 Mail/mime.php,可以到官网搜查并下载:https://pear.php.net/,最好还是使用pear工具进行安装,这样可以一次性安装所有依赖,否则就需要查找这些Mail接口的依赖并一块下载下来,pear工具的安装及使用请参考《PEAR(PHP Extension and Application Repository) 安装详解》)。如下代码为下载相应类源码并引入的使用示例:
// 引入Pear Mail
/*
//如果使用pear则直接这样写就可以
require_once "Mail.php"; 
require_once "Mail/mime.php";
*/

require_once('Mail.php');
require_once('Mail/mime.php');
require_once('Net/SMTP.php');

$emailInfo = array();
$emailInfo["host"] = "smtp.163.com";//SMTP服务器
$emailInfo["port"] = "25"; //SMTP服务器端口
$emailInfo["username"] = "w3capi@163.com"; //发件人邮箱
$emailInfo["password"] = "password";//发件人邮箱密码
$emailInfo["timeout"] = 10;//网络超时时间,秒
$emailInfo["auth"] = true;//登录验证
$emailInfo["debug"] = true;//调试模式

$mailAddr = array('receiver@163.com'); // 收件人列表
$from = "w3capi@163.com"; // 发件人显示信息,这里必须和发件人邮箱保持一致
$to = implode(',',$mailAddr); // 收件人显示信息

$subject = "这是一封测试邮件"; // 邮件标题
$content = "<h3>this is test.</h3>"; // 邮件正文
$contentType = "text/html; charset=utf-8"; // 邮件正文类型,格式和编码
$crlf = PHP_EOL; //换行符号 Linux: \n Windows: \r\n
$mime = new Mail_mime($crlf);
$mime->setHTMLBody($content);

$param['text_charset'] = 'utf-8';
$param['html_charset'] = 'utf-8';
$param['head_charset'] = 'utf-8';
$body = $mime->get($param);

$headers = array();
$headers["From"] = $from;
$headers["To"] = $to;
$headers["Subject"] = $subject;
$headers["Content-Type"] = $contentType;
$headers = $mime->headers($headers);

$smtp = Mail::factory("smtp", $emailInfo);
$mail = $smtp->send($mailAddr, $headers, $body);
$smtp->disconnect();
if (PEAR::isError($mail)) {
    echo 'Email sending failed: ' . $mail->getMessage()."\n";  //发送失败
} else{
    echo "success!\n"; //发送成功
}
注:此方式需要我们注册一个邮箱账号,并开启这个账号的SMTP协议,所有的主流邮箱都支持 SMTP 协议,但并非所有邮箱都默认开启,您可以在邮箱的设置里面手动开启。第三方服务在提供了账号和密码之后就可以登录 SMTP 服务器,通过这个账号就可以发送邮件了。

PHP 使用PHPMailer发送邮件

使用开源的PHPMailer来发送邮件也是一个不错的选择,源代码开源直接再github中找到,官方也给出了它所有的功能特色如下:
  1. 可能是全球最受欢迎的用于从PHP发送电子邮件的代码
  2. 已被许多开源项目使用:WordPress,Drupal,1CRM,SugarCRM,Yii和Joomla!还有很多
  3. 集成的SMTP支持-在没有本地邮件服务器的情况下发送
  4. 发送带有多个“收件人”,“抄送”,“密件抄送”和“回复”地址的电子邮件
  5. 不能阅读HTML电子邮件的邮件客户端提供 多种选择
  6. 添加附件,包括内联附件
  7. 支持UTF-8内容以及8位,base64,二进制和带引号的可编码
  8. 通过SSL和SMTP + STARTTLS传输使用LOGIN,PLAIN,CRAM-MD5和XOAUTH2机制进行SMTP身份验证
  9. 自动验证电子邮件地址
  10. 防止标题注入攻击
  11. 超过50种语言的错误消息
  12. DKIM和S / MIME签名支持
  13. 与PHP 5.5及更高版本兼容
  14. 命名空间以防止名称冲突
  15. 更多的功能
下面我们看一下如何使用它,按照如下操作步骤即可:
1、打开网址:https://github.com/PHPMailer/PHPMailer/下载PHPMailer,PHPMailer 可能需要 PHP 的 sockets 扩展支持,而有的SMTP服务器还强制使用SSL加密链接,如:QQ邮箱,那就还需要包含 openssl 扩展。可以使用 phpinfo() 函数查看当前PHP环境是否开启了 socket 和 openssl 扩展模块,如下图所示:
2、将下载下来的源码压缩包解压,然后把src目录移动到项目中改名为PHPMailer即可(这里根据自己需求改写名称即可,放到项目中的路径也根据自己使用的框架来决定,我直接放入了根目录)
3、编写发送邮件代码,我直接使用的源码引入方式,没有使用官方推荐的composer方式:
require __DIR__.'/PHPMailer/Exception.php'; 
require __DIR__.'/PHPMailer/PHPMailer.php'; 
require __DIR__.'/PHPMailer/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //smtp 服务配置
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //打开调试
    $mail->isSMTP();                                            // 使用smtp发送
    $mail->Host       = 'smtp.163.com';                    // smtp 服务器地址,我使用的是163的,所以设置为smtp.163.com
    $mail->SMTPAuth   = true;                                   // 是否进行smtp账号认证
    $mail->Username   = 'user@example.com';                     // SMTP 用户名
    $mail->Password   = 'secret';                               // SMTP 登录密码
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // 使用的数据传输安全协议
    $mail->Port       = 25;                                    // SMTP服务器的端口号,一般为25,安全连接为465

    //接收人配置
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // 添加接收人
    $mail->addAddress('ellen@example.com');               // 添加一个名称缺省的接收人
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // 添加一个附件
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // 添加一个自定义名称的附件

    // Content
    $mail->isHTML(true);                                  // 设置邮件内容格式为HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
注:此方式需要我们注册一个邮箱账号,并开启这个账号的SMTP协议
友情提示