PHP 发送电子邮件(Mail)
                           
天天向上
发布: 2025-03-21 00:01:14

原创
711 人浏览过

在 PHP 中,发送电子邮件通常有以下几种方式:

  1. 使用 mail() 函数(依赖服务器配置)
  2. 使用 PHPMailer(支持 SMTP 发送,推荐)
  3. 使用 SwiftMailer(高级邮件库)
  4. 使用 API(如 SendGrid、Mailgun、SMTP 服务器)

1. 使用 mail() 函数(简单邮件)

PHP 内置 mail() 函数可以发送邮件,但需要服务器支持 sendmailPostfix

示例代码:

$to = "recipient@example.com"; // 收件人
$subject = "测试邮件";
$message = "Hello, 这是一封测试邮件。";
$headers = "From: sender@example.com" . "\r\n" .
           "Reply-To: sender@example.com" . "\r\n" .
           "X-Mailer: PHP/" . phpversion();

if (mail($to, $subject, $message, $headers)) {
    echo "邮件已发送";
} else {
    echo "邮件发送失败";
}

注意事项:

  • mail() 依赖服务器的邮件传输代理(MTA),如 sendmailPostfix
  • Windows 上,需要在 php.ini 配置:
  SMTP = smtp.example.com
  smtp_port = 25
  sendmail_from = me@example.com
  • mail() 不支持 SMTP 认证,因此在共享主机或本地开发环境可能无法使用。

2. 使用 PHPMailer(推荐,支持 SMTP)

PHPMailer 是 PHP 最流行的邮件库,支持 SMTP 服务器、附件、HTML 邮件等。

安装 PHPMailer

composer require phpmailer/phpmailer

SMTP 方式发送邮件

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

require 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
    $mail->isSMTP();
    $mail->Host       = 'smtp.example.com'; // SMTP 服务器
    $mail->SMTPAuth   = true;
    $mail->Username   = 'your-email@example.com'; // SMTP 用户名
    $mail->Password   = 'your-email-password';   // SMTP 密码
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS 加密
    $mail->Port       = 587; // 端口号(25、465、587)

    // 发件人信息
    $mail->setFrom('your-email@example.com', 'Your Name');
    $mail->addAddress('recipient@example.com', 'Recipient Name'); // 收件人
    $mail->addReplyTo('your-email@example.com', 'Your Name');

    // 邮件内容
    $mail->isHTML(true);
    $mail->Subject = '测试邮件';
    $mail->Body    = '<h1>Hello</h1><p>这是一封测试邮件。</p>';
    $mail->AltBody = '这是一封测试邮件。';

    $mail->send();
    echo '邮件已发送';
} catch (Exception $e) {
    echo "邮件发送失败: {$mail->ErrorInfo}";
}

PHPMailer 主要功能

  • 支持 SMTP 认证
  • 支持 HTML 邮件和附件
  • 支持 SSL/TLS 加密

3. 使用 SwiftMailer

SwiftMailer 是另一个强大的 PHP 邮件库,但 PHPMailer 更流行。

安装 SwiftMailer

composer require swiftmailer/swiftmailer

使用 SMTP 发送邮件

require 'vendor/autoload.php';

$transport = (new Swift_SmtpTransport('smtp.example.com', 587))
    ->setUsername('your-email@example.com')
    ->setPassword('your-email-password')
    ->setEncryption('tls');

$mailer = new Swift_Mailer($transport);

$message = (new Swift_Message('测试邮件'))
    ->setFrom(['your-email@example.com' => 'Your Name'])
    ->setTo(['recipient@example.com' => 'Recipient Name'])
    ->setBody('这是一封测试邮件。', 'text/html');

$result = $mailer->send($message);

if ($result) {
    echo "邮件已发送";
} else {
    echo "邮件发送失败";
}

4. 使用邮件 API(SendGrid / Mailgun / SMTP)

如果你的服务器不支持 mail() 或 SMTP,建议使用邮件 API,如:

使用 SendGrid API 发送邮件

  1. 注册 SendGrid 并获取 API Key
  2. 安装 SendGrid PHP SDK
   composer require sendgrid/sendgrid
  1. 使用 API 发送邮件
   require 'vendor/autoload.php';
   use SendGrid\Mail\Mail;

   $email = new Mail();
   $email->setFrom("your-email@example.com", "Your Name");
   $email->setSubject("测试邮件");
   $email->addTo("recipient@example.com", "Recipient Name");
   $email->addContent("text/plain", "这是一封测试邮件。");
   $email->addContent("text/html", "<p>这是一封 <strong>测试邮件</strong>。</p>");

   $sendgrid = new \SendGrid('YOUR_SENDGRID_API_KEY');
   try {
       $response = $sendgrid->send($email);
       echo "邮件已发送";
   } catch (Exception $e) {
       echo "邮件发送失败: " . $e->getMessage();
   }

5. 选择最佳邮件发送方式

方式适用场景优势劣势
mail()仅适用于已配置邮件服务器简单依赖服务器配置,无法 SMTP 认证
PHPMailer推荐用于所有场景支持 SMTP、HTML、附件需要安装库
SwiftMailer高级邮件处理面向对象架构不如 PHPMailer 流行
邮件 API(SendGrid 等)云服务器 / 共享主机不依赖服务器需要 API Key

推荐方案:

  • 服务器支持 mail() 时,可使用 mail()
  • 服务器 不支持 mail(),推荐 PHPMailer
  • 需要 高发送成功率,推荐 SendGrid、Mailgun

6. 常见问题

Q1: 为什么 mail() 发送失败?

  • 确保服务器已安装 sendmail
  sudo apt install sendmail
  sudo service sendmail restart
  • 确保 php.ini 配置 SMTP 服务器(Windows 环境)。

Q2: 为什么邮件进了垃圾箱?

  • 确保 发件人邮箱SMTP 服务器 匹配(避免伪造邮件)。
  • 设置 SPF、DKIM、DMARC 记录
  • SPF: 确保邮件服务器被授权发送邮件
  • DKIM: 电子邮件签名验证
  • DMARC: 邮件防伪策略

Q3: 如何发送带附件的邮件?

PHPMailer 示例

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

7. 参考资料


更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *