GoDaddy主机使用PHPMailer发信后Roundcube已发邮件未保存如何解决
问题排查
- 你定义的
save_mail()函数没有被调用,该段逻辑完全不会执行,自然无法将邮件写入已发送文件夹。需要在邮件发送成功的分支中主动调用该函数。 - 配置存在冲突:同时调用了
$mail->IsSMTP()和$mail->IsSendmail(),后者会覆盖SMTP相关配置,属于逻辑错误,你已经配置了SMTP参数,直接删除$mail->IsSendmail();这行即可。 - IMAP路径配置错误:GoDaddy主机上Roundcube的默认已发送文件夹并非
INBOX.Sent,通常是独立的Sent目录,路径错误会直接导致写入失败。 - 缺少IMAP操作的错误校验,当前代码即使IMAP连接、写入失败也不会输出错误信息,无法定位具体故障点。
- SMTP加密配置不匹配:端口465对应的加密方式为
ssl,tls对应的标准端口为587,配置不匹配可能引发隐式异常。
修正后可运行的代码
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\SMTP; require 'PHPMailer-master/src/Exception.php'; require 'PHPMailer-master/src/PHPMailer.php'; require 'PHPMailer-master/src/SMTP.php'; $mail = new PHPMailer(); $mail->IsSMTP(); $mail->SMTPAuth = true; // 端口465对应ssl加密,这里修正配置 $mail->SMTPSecure = "ssl"; $mail->Port = 465; $mail->Host = "mail.yourdomain.com"; $mail->Username = "info@domain.com"; $mail->Password = "******"; $mail->From = "info@domain.com"; $mail->FromName = "domain.com"; $mail->AddAddress("email@gmail.com"); $mail->Subject = "Inquiries"; $mail->WordWrap = 80; $mail->IsHTML(true); $mail->Body = $template; if (!$mail->send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent!"; // 发送成功后调用保存已发送邮件的函数 $saveResult = save_mail($mail); if($saveResult) { echo " 已发送邮件保存成功"; } else { echo " 已发送邮件保存失败:" . imap_last_error(); } } // 修正后的保存邮件函数 function save_mail($mail) { // GoDaddy Roundcube默认已发送文件夹路径调整 $path = "{mail.yourdomain.com:993/imap/ssl/novalidate-cert}Sent"; $imapStream = imap_open($path, $mail->Username, $mail->Password, OP_HALFOPEN); if(!$imapStream) { return false; } $result = imap_append($imapStream, $path, $mail->getSentMIMEMessage(), "\\Seen"); imap_close($imapStream); return $result; }
内容的提问来源于stack exchange,提问作者Not a Pro
相关产品推荐
相关产品推荐

