在PHP开发中,发送邮件是一个常见的需求。用户注册验证、密码找回、订单通知、活动推广……很多场景都需要发送邮件。

PHP发送邮件,主要有以下几种方式:

  1. mail()函数:PHP内置的mail()函数,最简单,但需要配置服务器的sendmail,功能有限,容易被当成垃圾邮件。
  2. SMTP发送:通过SMTP协议连接邮件服务器发送邮件,是最常用、最可靠的方式。需要用PHPMailer、Swift Mailer等库,或者自己写SMTP客户端。
  3. 第三方邮件服务API:通过SendGrid、Mailgun、阿里云邮件推送、腾讯云邮件推送等第三方服务的API发送邮件,发送量大、送达率高,但需要付费(有免费额度)。

对于个人博客和小型网站,最常用的是SMTP发送,用PHPMailer库,连接QQ邮箱、163邮箱、企业邮箱等的SMTP服务器发送邮件。今天分享PHP发送邮件的方法,重点介绍PHPMailer的使用。

mail()函数

PHP内置的mail()函数,是最简单的发送邮件方式。

$to = 'recipient@example.com';
$subject = '邮件标题';
$message = '邮件内容';
$headers = 'From: sender@example.com' . "\r\n" .
    'Reply-To: sender@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

mail()函数的优点是简单,不需要额外的库。但缺点也很明显:

  • 需要配置服务器的sendmail或postfix,Windows下需要配置SMTP
  • 功能有限,不支持SMTP认证、附件、HTML邮件等
  • 容易被当成垃圾邮件,送达率低
  • 不支持加密(SSL/TLS)

所以,实际开发中,一般不推荐用mail()函数,而是用PHPMailer等库通过SMTP发送。

PHPMailer介绍

PHPMailer是PHP最流行的邮件发送库,功能强大,使用简单。

PHPMailer的特点:

  • 支持SMTP发送,支持SMTP认证
  • 支持SSL/TLS加密
  • 支持HTML邮件和纯文本邮件
  • 支持附件
  • 支持抄送、密送
  • 支持自定义邮件头
  • 错误信息详细,方便调试
  • 兼容PHP 5.0+

PHPMailer可以从GitHub下载(https://github.com/PHPMailer/PHPMailer),也可以用Composer安装。下载后,只需要引入class.phpmailer.php和class.smtp.php两个文件即可使用。

PHPMailer基本使用

1. 引入文件

require 'PHPMailer/class.phpmailer.php';
require 'PHPMailer/class.smtp.php';

2. 实例化和基本配置

$mail = new PHPMailer();

// 设置使用SMTP
$mail->isSMTP();

// SMTP服务器地址
$mail->Host = 'smtp.qq.com';

// SMTP端口:25(普通)、465(SSL)、587(TLS)
$mail->Port = 465;

// 启用SMTP认证
$mail->SMTPAuth = true;

// SMTP用户名(邮箱地址)
$mail->Username = 'your_email@qq.com';

// SMTP密码(授权码,不是登录密码)
$mail->Password = 'your_auth_code';

// 启用SSL加密
$mail->SMTPSecure = 'ssl';

// 发件人
$mail->From = 'your_email@qq.com';
$mail->FromName = '发件人名称';

// 收件人
$mail->addAddress('recipient@example.com', '收件人名称');

// 邮件标题
$mail->Subject = '邮件标题';

// 邮件内容(HTML)
$mail->Body = '<h1>邮件标题</h1><p>这是一封HTML格式的邮件。</p>';

// 邮件内容(纯文本,当邮件客户端不支持HTML时显示)
$mail->AltBody = '这是纯文本格式的邮件内容。';

// 发送邮件
if ($mail->send()) {
    echo '邮件发送成功';
} else {
    echo '邮件发送失败:' . $mail->ErrorInfo;
}

3. 常用邮箱SMTP配置

QQ邮箱:

$mail->Host = 'smtp.qq.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_qq@qq.com';
$mail->Password = '授权码'; // QQ邮箱需要开启SMTP服务,获取授权码

163邮箱:

$mail->Host = 'smtp.163.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@163.com';
$mail->Password = '授权码'; // 163邮箱需要开启SMTP服务,设置客户端授权密码

126邮箱:

$mail->Host = 'smtp.126.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@126.com';
$mail->Password = '授权码';

Gmail(国内可能需要代理):

$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@gmail.com';
$mail->Password = '应用专用密码';

企业邮箱(以腾讯企业邮箱为例):

$mail->Host = 'smtp.exmail.qq.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@yourdomain.com';
$mail->Password = '邮箱密码';

PHPMailer进阶使用

1. 发送HTML邮件

$mail->isHTML(true); // 设置邮件格式为HTML
$mail->Body = '
<html>
<head>
    <meta charset="UTF-8">
    <title>邮件标题</title>
</head>
<body>
    <h1>欢迎注册</h1>
    <p>您好,感谢您注册我们的网站!</p>
    <p>请点击以下链接激活您的账号:</p>
    <a href="https://example.com/activate?token=xxx">激活账号</a>
</body>
</html>
';

注意:HTML邮件中,CSS要用内联样式,不要用外部CSS,因为很多邮件客户端不支持外部CSS。图片要用绝对URL,不要用相对路径。

2. 添加附件

// 添加附件
$mail->addAttachment('path/to/file.pdf', '文件名.pdf');

// 添加多个附件
$mail->addAttachment('path/to/file1.pdf', '文件1.pdf');
$mail->addAttachment('path/to/file2.jpg', '文件2.jpg');

3. 抄送和密送

// 抄送
$mail->addCC('cc@example.com', '抄送人');

// 密送
$mail->addBCC('bcc@example.com', '密送人');

4. 回复地址

$mail->addReplyTo('reply@example.com', '回复地址');

5. 添加内嵌图片

// 添加内嵌图片,CID为logo
$mail->addEmbeddedImage('path/to/logo.png', 'logo', 'logo.png');

// 在HTML中引用
$mail->Body = '<img src="cid:logo" alt="Logo">';

6. 字符编码设置

$mail->CharSet = 'UTF-8'; // 设置字符编码为UTF-8,防止中文乱码
$mail->Encoding = 'base64'; // 设置编码方式

封装邮件发送函数

为了方便使用,可以把邮件发送封装成一个函数或类。

function sendEmail($to, $toName, $subject, $body, $altBody = '') {
    require 'PHPMailer/class.phpmailer.php';
    require 'PHPMailer/class.smtp.php';
    
    $mail = new PHPMailer();
    $mail->isSMTP();
    $mail->Host = 'smtp.qq.com';
    $mail->Port = 465;
    $mail->SMTPAuth = true;
    $mail->Username = 'your_email@qq.com';
    $mail->Password = 'your_auth_code';
    $mail->SMTPSecure = 'ssl';
    $mail->CharSet = 'UTF-8';
    
    $mail->From = 'your_email@qq.com';
    $mail->FromName = '博客管理员';
    
    $mail->addAddress($to, $toName);
    $mail->Subject = $subject;
    $mail->isHTML(true);
    $mail->Body = $body;
    if ($altBody) {
        $mail->AltBody = $altBody;
    }
    
    if ($mail->send()) {
        return true;
    } else {
        return $mail->ErrorInfo;
    }
}

// 使用
$result = sendEmail(
    'user@example.com',
    '用户',
    '欢迎注册',
    '<h1>欢迎注册</h1><p>感谢您注册我们的博客!</p>'
);

if ($result === true) {
    echo '发送成功';
} else {
    echo '发送失败:' . $result;
}

常见问题和解决方法

1. 邮件发送失败,提示SMTP连接失败

可能原因:

  • SMTP服务器地址或端口错误
  • 服务器防火墙阻止了出站连接
  • 没有启用SSL/TLS

解决方法:

  • 检查SMTP服务器地址和端口
  • 联系服务器提供商,确认是否允许SMTP出站连接
  • 尝试不同的端口(25、465、587)和加密方式(ssl、tls)

2. 邮件发送成功,但收件人收不到

可能原因:

  • 邮件被当成垃圾邮件
  • 收件人邮箱地址错误
  • 发件人邮箱被拉黑

解决方法:

  • 检查收件人邮箱地址是否正确
  • 让收件人检查垃圾邮件箱
  • 邮件内容不要包含太多营销词汇,避免被当成垃圾邮件
  • 设置正确的SPF、DKIM记录,提高邮件送达率

3. 中文乱码

解决方法:

  • 设置$mail->CharSet = 'UTF-8'
  • 确保PHP文件编码为UTF-8
  • 邮件标题和内容不要用GBK编码

4. QQ邮箱SMTP认证失败

解决方法:

  • QQ邮箱需要开启SMTP服务(设置→账户→POP3/IMAP/SMTP服务)
  • 密码要用授权码,不是QQ密码
  • 授权码在QQ邮箱设置中获取

5. 163邮箱SMTP认证失败

解决方法:

  • 163邮箱需要开启SMTP服务
  • 密码要用客户端授权密码,不是登录密码
  • 客户端授权密码在163邮箱设置中设置

邮件发送的最佳实践

  1. 用SMTP发送,不要用mail()函数:SMTP发送更可靠,送达率更高。
  2. 用授权码,不要用登录密码:QQ邮箱、163邮箱等都需要用授权码,更安全。
  3. 设置正确的字符编码:用UTF-8,防止中文乱码。
  4. HTML邮件用内联样式:邮件客户端对CSS支持有限,用内联样式兼容性最好。
  5. 图片用绝对URL:HTML邮件中的图片要用绝对URL,不要用相对路径。
  6. 添加纯文本备选:设置AltBody,当邮件客户端不支持HTML时显示纯文本。
  7. 不要发送垃圾邮件:邮件内容要合法,不要发送垃圾邮件,否则会被拉黑。
  8. 错误处理:发送失败时,记录错误信息,方便排查问题。
  9. 异步发送:如果发送量大,用队列异步发送,不要阻塞页面。
  10. 测试:发送前先测试,确保邮件能正常发送和显示。

总结

PHP发送邮件,最常用的是用PHPMailer通过SMTP发送。

核心要点:

  1. 发送方式:mail()函数(简单但不推荐)、SMTP发送(推荐,用PHPMailer)、第三方邮件服务API(适合发送量大)
  2. PHPMailer基本配置:SMTP服务器、端口、认证、用户名、密码、加密方式、发件人、收件人、标题、内容
  3. 常用邮箱SMTP配置:QQ邮箱(smtp.qq.com:465 ssl)、163邮箱(smtp.163.com:465 ssl)、Gmail、企业邮箱
  4. 进阶使用:HTML邮件、附件、抄送密送、内嵌图片、字符编码
  5. 封装函数:把邮件发送封装成函数,方便使用
  6. 常见问题:SMTP连接失败、收不到邮件、中文乱码、认证失败
  7. 最佳实践:用SMTP、用授权码、UTF-8编码、内联样式、绝对URL、错误处理、异步发送

希望这篇文章能帮你掌握PHP发送邮件的方法,让你的网站能正常发送邮件。