PHP项目怎么发送邮件?

wen java案例 4

本文目录导读:

PHP项目怎么发送邮件?

  1. 推荐方式:使用第三方邮件库(PHPMailer)
  2. 使用 Symfony Mailer(现代框架推荐)
  3. 使用原生 mail() 函数(不推荐)
  4. 各邮箱SMTP配置参考
  5. 企业级方案:邮件服务API
  6. 总结建议

在PHP项目中发送邮件,主要有以下几种常见方式,我会从最推荐到最基础依次介绍:

推荐方式:使用第三方邮件库(PHPMailer)

为什么推荐? 支持SMTP认证、HTML邮件、附件、中文不乱码,且支持各种邮件服务(QQ、163、Gmail、SendGrid等)。

安装(Composer)

composer require phpmailer/phpmailer

示例代码(QQ邮箱示例)

<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function sendMail($to, $subject, $body) {
    $mail = new PHPMailer(true);
    try {
        // 服务器配置
        $mail->isSMTP();
        $mail->Host       = 'smtp.qq.com';       // SMTP服务器
        $mail->SMTPAuth   = true;
        $mail->Username   = 'your@qq.com';        // 邮箱账号
        $mail->Password   = 'your_smtp_password'; // SMTP授权码(不是登录密码)
        $mail->SMTPSecure = 'ssl';                // 启用SSL加密
        $mail->Port       = 465;                  // SSL端口
        // 发件人
        $mail->setFrom('your@qq.com', '网站名称');
        // 收件人
        $mail->addAddress($to, '收件人名称');
        // 内容
        $mail->isHTML(true);
        $mail->CharSet = 'UTF-8';
        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = strip_tags($body); // 纯文本备用
        $mail->send();
        return ['success' => true, 'message' => '邮件发送成功'];
    } catch (Exception $e) {
        return ['success' => false, 'message' => $mail->ErrorInfo];
    }
}
// 使用示例
$result = sendMail(
    'recipient@example.com', 
    '欢迎注册', 
    '<h1>您好!</h1><p>感谢您注册我们的网站。</p>'
);

使用 Symfony Mailer(现代框架推荐)

适用于Laravel、Symfony等框架,或者作为独立组件使用。

composer require symfony/mailer
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mime\Email;
$transport = Transport::fromDsn('smtp://username:password@smtp.example.com:587');
$mailer = new Mailer($transport);
$email = (new Email())
    ->from('sender@example.com')
    ->to('recipient@example.com')
    ->subject('邮件主题')
    ->html('<p>HTML内容</p>');
$mailer->send($email);

使用原生 mail() 函数(不推荐)

缺点:配置复杂、容易进垃圾箱、不支持SMTP认证、中文容易乱码。

$to = 'recipient@example.com';
$subject = '=?UTF-8?B?' . base64_encode('邮件主题') . '?=';
$message = '<p>邮件内容</p>';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: sender@example.com\r\n";
mail($to, $subject, $message, $headers);

各邮箱SMTP配置参考

邮箱 SMTP服务器 SSL端口 非SSL端口 密码说明
QQ smtp.qq.com 465 587 需开启SMTP服务获取授权码
163 smtp.163.com 465 25 需开启SMTP服务获取授权码
Gmail smtp.gmail.com 465 587 需应用专用密码
阿里云邮件 smtpdm.aliyun.com 465 80 配置发信地址

企业级方案:邮件服务API

对于高并发的生产环境,建议使用专业邮件服务:

  • SendGrid - composer require sendgrid/sendgrid
  • Mailgun - composer require mailgun/mailgun-php
  • 阿里云邮件推送 - 通过HTTP API调用
  • 腾讯云邮件 - 通过HTTP API调用

示例(SendGrid):

$email = new \SendGrid\Mail\Mail();
$email->setFrom("sender@example.com", "Sender");
$email->setSubject("Sending with SendGrid");
$email->addTo("recipient@example.com", "Recipient");
$email->addContent("text/html", "<p>邮件内容</p>");
$sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
$response = $sendgrid->send($email);

总结建议

场景 推荐方案
小型项目/个人网站 PHPMailer(最易上手)
框架项目(Laravel/Symfony) 框架内置的Mail组件
企业级/高并发 专业邮件服务API(SendGrid等)
只需要简单发送 原生mail() + SMTP配置

常见问题

  1. 邮件被识别为垃圾邮件:配置SPF/DKIM/DMARC DNS记录
  2. 发件延迟:检查网络和SMTP服务器状态
  3. 中文乱码:确保 CharSet = 'UTF-8' 且使用HTML格式

如果需要具体的邮箱授权码获取步骤或其他特殊配置,请告诉我,我可以进一步说明。

抱歉,评论功能暂时关闭!