You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用PHPMailer将已发送邮件保存至发件箱?

解决PHPMailer发送邮件后不保存到发件箱的问题

嘿,这个问题我之前帮朋友处理过!其实PHPMailer完全可以实现把发送的邮件存到发件箱,主要分两种场景,我给你一步步讲清楚:

场景一:让邮箱服务商自动保存到发件箱(最简单)

如果你是用自己的个人/企业邮箱账号(比如xxx@yourdomain.com)通过SMTP协议发送邮件,大部分主流邮箱服务商(Gmail、Outlook、网易邮箱等)都会自动把你通过SMTP发送的邮件存入发件箱。但如果没生效,你可以检查这几点:

  • 确认你的SMTP服务器、端口配置正确(比如Gmail是smtp.gmail.com,端口465;网易邮箱是smtp.163.com,端口465)
  • 确保你的邮箱已经开启了SMTP/IMAP权限(比如Gmail需要在账号设置里开启IMAP,两步验证用户要使用App密码登录)
  • 发送邮件时用的是你自己的邮箱作为From地址,不要用第三方地址

如果以上都没问题还是没保存,那可以试试下面的手动保存方法。

场景二:手动保存到本地或邮箱发件箱

方法1:保存到本地文件夹

这种方法适合只想在服务器上留存邮件副本的情况,发送成功后直接把邮件内容写入本地文件即可:

// 假设你已经完成了PHPMailer的初始化和配置
$mail->setFrom('your_email@yourdomain.com', 'Your Name');
$mail->addAddress('subscriber@example.com');
$mail->Subject = '订阅通知';
$mail->Body = '这是你的订阅内容...';

// 发送邮件
if ($mail->send()) {
    // 获取发送的邮件原始MIME内容
    $sentMailContent = $mail->getSentMIMEMessage();
    // 设置保存目录和文件名(用时间戳避免重名)
    $saveDir = 'sent_emails/';
    $fileName = date('YmdHis') . '_' . uniqid() . '.eml';
    // 确保目录存在
    if (!is_dir($saveDir)) {
        mkdir($saveDir, 0777, true);
    }
    // 写入文件
    file_put_contents($saveDir . $fileName, $sentMailContent);
    echo "邮件发送成功,已保存到本地文件夹";
} else {
    echo "邮件发送失败: " . $mail->ErrorInfo;
}

方法2:通过IMAP上传到邮箱发件箱

如果你想在自己的邮箱网页端发件箱里看到这些邮件,就需要用IMAP协议把发送后的邮件上传到发件箱文件夹:

// PHPMailer发送部分
$mail->setFrom('your_email@yourdomain.com', 'Your Name');
$mail->addAddress('subscriber@example.com');
$mail->Subject = '订阅通知';
$mail->Body = '这是你的订阅内容...';

if ($mail->send()) {
    $sentMailContent = $mail->getSentMIMEMessage();
    
    // 配置IMAP参数(根据你的邮箱调整)
    // Gmail的IMAP地址:'{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail'
    // 网易邮箱:'{imap.163.com:993/imap/ssl}Sent Items'
    $imapHost = '{imap.yourdomain.com:993/imap/ssl}Sent';
    $imapUsername = 'your_email@yourdomain.com';
    $imapPassword = 'your_email_password'; // 两步验证用户用App密码
    
    // 连接IMAP服务器
    $imapStream = imap_open($imapHost, $imapUsername, $imapPassword);
    if (!$imapStream) {
        die('IMAP连接失败: ' . imap_last_error());
    }
    
    // 上传邮件到发件箱
    $result = imap_append($imapStream, $imapHost, $sentMailContent . "\r\n");
    if ($result) {
        echo "邮件发送成功,已保存到邮箱发件箱";
    } else {
        echo "邮件发送成功,但保存到发件箱失败: " . imap_last_error();
    }
    
    // 关闭IMAP连接
    imap_close($imapStream);
} else {
    echo "邮件发送失败: " . $mail->ErrorInfo;
}

注意事项

  • 使用IMAP方法需要在PHP中启用IMAP扩展,找到php.ini文件,去掉extension=imap前面的注释,然后重启服务器
  • 不同邮箱的发件箱文件夹名称可能不同,比如Gmail是[Gmail]/Sent Mail,Outlook是Sent Items,如果不确定可以登录邮箱网页端查看文件夹英文名
  • 本地保存时要确保目标文件夹有写入权限(设置为0777或合适的权限)

内容的提问来源于stack exchange,提问作者Haris Khan

火山引擎 最新活动