在PHP项目开发中,邮件自动发送是非常实用的功能,很多业务场景都需要用到。下面先通过一张示意图了解邮件发送的基本流程。

一、PHP发送邮件的两种常见方案
PHP实现邮件发送主要有两种思路,开发者可以根据项目需求选择:
- 使用PHP原生的
mail()函数,依赖服务器本地的邮件服务配置,稳定性较差,容易被判为垃圾邮件 - 使用第三方邮件发送库结合SMTP协议,比如PHPMailer,配置灵活,发送成功率高,是生产环境的首选方案
二、原生mail函数发送邮件(不推荐生产使用)
1. 配置服务器邮件服务
如果使用原生mail()函数,需要先配置服务器的邮件发送服务,以Linux系统为例,需要安装sendmail或者postfix服务,修改php.ini中的配置:
; php.ini 邮件相关配置 [mail function] ; 仅Windows系统需要配置SMTP服务器地址 ; SMTP = smtp.ipipp.com ; smtp_port = 25 ; 非Windows系统配置sendmail路径 sendmail_path = /usr/sbin/sendmail -t -i
2. 原生函数发送示例代码
配置完成后可以通过以下代码发送简单邮件:
<?php
// 邮件接收方地址
$to = 'test@ipipp.com';
// 邮件主题
$subject = 'PHP原生mail函数测试邮件';
// 邮件内容
$message = '这是使用PHP原生mail函数发送的测试邮件内容';
// 邮件头信息
$headers = 'From: sender@ipipp.com' . "\r\n" .
'Reply-To: sender@ipipp.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// 发送邮件
if (mail($to, $subject, $message, $headers)) {
echo '邮件发送成功';
} else {
echo '邮件发送失败';
}
?>三、PHPMailer+SMTP方案(推荐生产使用)
1. 安装PHPMailer依赖
推荐使用Composer安装PHPMailer,执行以下命令:
composer require phpmailer/phpmailer
如果没有Composer,也可以手动下载PHPMailer源码,放到项目目录中引入。
2. SMTP服务配置准备
需要提前准备以下SMTP相关信息,以常见的邮箱服务为例:
| 配置项 | 说明 | 示例值 |
|---|---|---|
| SMTP服务器地址 | 邮箱服务商提供的SMTP地址 | smtp.ipipp.com |
| SMTP端口 | 常用端口有25、465、587 | 465 |
| 发件人邮箱 | 用于发送邮件的邮箱地址 | sender@ipipp.com |
| 邮箱授权码 | 在邮箱设置中开启SMTP服务后获取的授权密码,不是登录密码 | xxxxxx |
3. PHPMailer发送邮件完整代码
以下是使用PHPMailer通过SMTP发送邮件的完整示例代码,包含HTML内容、附件发送等常见功能:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// 引入PHPMailer的自动加载文件,手动引入的话需要对应调整路径
require 'vendor/autoload.php';
// 实例化PHPMailer对象
$mail = new PHPMailer(true);
try {
// 服务器配置
$mail->SMTPDebug = 0; // 调试模式,0为不输出调试信息,2为输出详细信息
$mail->isSMTP(); // 使用SMTP协议发送
$mail->Host = 'smtp.ipipp.com'; // SMTP服务器地址
$mail->SMTPAuth = true; // 开启SMTP认证
$mail->Username = 'sender@ipipp.com'; // SMTP用户名(发件人邮箱)
$mail->Password = '邮箱授权码'; // SMTP密码(邮箱授权码)
$mail->SMTPSecure = 'ssl'; // 加密方式,ssl或者tls,465端口对应ssl,587对应tls
$mail->Port = 465; // SMTP端口
// 收件人配置
$mail->setFrom('sender@ipipp.com', '发件人名称'); // 发件人邮箱和名称
$mail->addAddress('test@ipipp.com', '收件人名称'); // 添加收件人,可多次调用添加多个收件人
// $mail->addAddress('another@ipipp.com'); // 添加另一个收件人
$mail->addReplyTo('sender@ipipp.com', '回复地址'); // 回复地址
// $mail->addCC('cc@ipipp.com'); // 添加抄送人
// $mail->addBCC('bcc@ipipp.com'); // 添加密送人
// 附件配置
// $mail->addAttachment('/path/to/file.pdf'); // 添加附件
// $mail->addAttachment('/path/to/image.jpg', '新文件名.jpg'); // 添加附件并重命名
// 邮件内容配置
$mail->isHTML(true); // 设置邮件内容为HTML格式
$mail->Subject = 'PHPMailer SMTP测试邮件'; // 邮件主题
$mail->Body = '<h1>邮件内容</h1><p>这是使用PHPMailer发送的HTML格式测试邮件</p>'; // HTML邮件内容
$mail->AltBody = '这是纯文本格式的邮件内容,当收件人邮箱不支持HTML时显示'; // 纯文本备用内容
// 发送邮件
$mail->send();
echo '邮件发送成功';
} catch (Exception $e) {
echo "邮件发送失败,错误信息: {$mail->ErrorInfo}";
}
?>四、常见问题排查
- 发送失败提示连接超时:检查SMTP服务器地址、端口是否正确,服务器防火墙是否开放对应端口
- 提示认证失败:确认授权码是否正确,是否开启了邮箱的SMTP服务
- 邮件内容乱码:确保PHP文件编码为UTF-8,邮件头和内容都指定UTF-8编码
- 被判定为垃圾邮件:尽量使用企业邮箱发送,邮件内容避免过多营销类敏感词,添加正确的SPF、DKIM解析
五、总结
PHP实现邮件自动发送时,不推荐使用原生mail()函数,优先选择PHPMailer结合SMTP的方案,稳定性和成功率更高。配置时需要注意SMTP服务信息的正确性,发送失败可以通过开启SMTPDebug模式查看详细错误信息,快速定位问题。掌握这套配置和代码逻辑后,就可以轻松实现项目中的各类邮件发送需求。