PHPMailer调用getLastMessageID()返回空值,无法获取uniqueid求助
问题:PHPMailer调用getLastMessageID()返回空值,无法获取受保护的uniqueid属性
使用PHPMailer发送邮件时,调用getLastMessageID()始终返回空值。通过var_dump($mail)查看对象结构,发现受保护的uniqueid属性正是所需的消息ID,但无法直接访问。
实现代码
$mail = new PHPMailer(true); try { $mail->SMTPDebug = 0; $mail->isSMTP(); $mail->Host = $s_server; $mail->SMTPAuth = true; $mail->Username = $s_username; $mail->Password = $s_password; $mail->SMTPSecure = $s_protocol; $mail->Port = $s_port; $mail->Hostname = $s_server; $mail->XMailer = ' '; $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); //Recipients $mail->setFrom($s_from, $s_from_name); $mail->addAddress("mygmail@gmail.com"); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $message; $mail->preSend(); $mail->send(); echo $mail->getLastMessageID(); echo "<br>"; echo "<pre>"; print_r($mail); echo "</pre>"; echo "<br>"; echo $mail['FromName']; } catch (Exception $e) { }
对象输出信息
PHPMailer\PHPMailer\PHPMailer Object ( [Priority] => [CharSet] => iso-8859-1 [ContentType] => text/html [Encoding] => 7bit [ErrorInfo] => [From] => user@example.com [FromName] => Claire Smith [Sender] => user@example.com [Subject] => I am testing the SMTP [Body] => This is a test email! [AltBody] => [Ical] => [MIMEBody:protected] => This is a test email! [MIMEHeader:protected] => Date: Mon, 24 Jul 2023 23:51:46 -0400 To: mygmail@gmail.com From: Claire Smith Subject: I am testing the SMTP Message-ID: MIME-Version: 1.0 Content-Type: text/html; charset=iso-8859-1 [mailHeader:protected] => [WordWrap] => 0 [Mailer] => smtp [Sendmail] => /usr/sbin/sendmail [UseSendmailOptions] => 1 [ConfirmReadingTo] => [Hostname] => s1.example.com [MessageID] => [MessageDate] => [Host] => s1.example.com [Port] => 587 [Helo] => [SMTPSecure] => tls [SMTPAutoTLS] => 1 [SMTPAuth] => 1 [SMTPOptions] => Array ( [ssl] => Array ( [verify_peer] => [verify_peer_name] => [allow_self_signed] => 1 ) ) [Username] => user@example.com [Password] => ashgujkfhsjfgsfsfs [AuthType] => [oauth:protected] => [Timeout] => 300 [dsn] => [SMTPDebug] => 0 [Debugoutput] => html [SMTPKeepAlive] => [SingleTo] => [SingleToArray:protected] => Array ( ) [do_verp] => [AllowEmpty] => [DKIM_selector] => [DKIM_identity] => [DKIM_passphrase] => [DKIM_domain] => [DKIM_copyHeaderFields] => 1 [DKIM_extraHeaders] => Array ( ) [DKIM_private] => [DKIM_private_string] => [action_function] => [XMailer] => [smtp:protected] => PHPMailer\PHPMailer\SMTP Object ( [do_debug] => 0 [Debugoutput] => html [do_verp] => [Timeout] => 300 [Timelimit] => 300 [smtp_transaction_id_patterns:protected] => Array ( [exim] => /[\d]{3} OK id=(.*)/ [sendmail] => /[\d]{3} 2.0.0 (.*) Message/ [postfix] => /[\d]{3} 2.0.0 Ok: queued as (.*)/ [Microsoft_ESMTP] => /[0-9]{3} 2.[\d].0 (.*)@(?:.*) Queued mail for delivery/ [Amazon_SES] => /[\d]{3} Ok (.*)/ [SendGrid] => /[\d]{3} Ok: queued as (.*)/ [CampaignMonitor] => /[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/ [Haraka] => /[\d]{3} Message Queued \((.*)\)/ [ZoneMTA] => /[\d]{3} Message queued as (.*)/ [Mailjet] => /[\d]{3} OK queued as (.*)/ ) [last_smtp_transaction_id:protected] => E17B83EE1B [smtp_conn:protected] => [error:protected] => Array ( [error] => [detail] => [smtp_code] => [smtp_code_ex] => ) [helo_rply:protected] => [server_caps:protected] => [last_reply:protected] => 221 2.0.0 Bye ) [to:protected] => Array ( [0] => Array ( [0] => mygmail@gmail.com [1] => ) ) [cc:protected] => Array ( ) [bcc:protected] => Array ( ) [ReplyTo:protected] => Array ( ) [all_recipients:protected] => Array ( [mygmail@gmail.com] => 1 ) [RecipientsQueue:protected] => Array ( ) [ReplyToQueue:protected] => Array ( ) [attachment:protected] => Array ( ) [CustomHeader:protected] => Array ( ) [lastMessageID:protected] => [message_type:protected] => plain [boundary:protected] => Array ( [1] => b1=_f8dsNdQvDQtBrLj5FRoswBhLHhU4CK838ZV8W1VqI [2] => b2=_f8dsNdQvDQtBrLj5FRoswBhLHhU4CK838ZV8W1VqI [3] => b3=_f8dsNdQvDQtBrLj5FRoswBhLHhU4CK838ZV8W1VqI ) [language:protected] => Array ( ) [error_count:protected] => 0 [sign_cert_file:protected] => [sign_key_file:protected] => [sign_extracerts_file:protected] => [sign_key_pass:protected] => [exceptions:protected] => 1 [uniqueid:protected] => f8dsNdQvDQtBrLj5FRoswBhLHhU4CK838ZV8W1VqI )
解决方案
方法一:修复getLastMessageID()返回空的问题
从对象输出可以看到,MessageID属性和MIME头中的Message-ID都是空的,说明PHPMailer没有自动生成消息ID,这是getLastMessageID()返回空的根本原因。
解决步骤:
- 确保
Hostname设置为有效的主机名/域名(不是SMTP服务器地址),比如:
$mail->Hostname = 'your-domain.com'; // 替换为你的实际域名
- 或者手动生成并设置
MessageID,这样getLastMessageID()就能正确返回值:
// 在send()之前设置 $mail->MessageID = sprintf('<%s@%s>', $mail->uniqueid, $mail->Hostname);
- 移除多余的
preSend()调用,send()方法内部会自动调用preSend(),重复调用可能导致状态异常。
修改后的核心代码:
// ...其他配置 $mail->Hostname = 'your-domain.com'; //Recipients $mail->setFrom($s_from, $s_from_name); $mail->addAddress("mygmail@gmail.com"); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $message; // 无需手动调用preSend() $mail->send(); echo $mail->getLastMessageID(); // 现在会返回有效的消息ID
方法二:通过反射获取受保护的uniqueid属性
如果确实需要直接获取uniqueid属性,可以使用PHP的反射机制突破访问限制:
$mail->send(); // 使用反射获取受保护的uniqueid $reflection = new ReflectionClass($mail); $uniqueidProp = $reflection->getProperty('uniqueid'); $uniqueidProp->setAccessible(true); $uniqueid = $uniqueidProp->getValue($mail); echo $uniqueid; // 输出:f8dsNdQvDQtBrLj5FRoswBhLHhU4CK838ZV8W1VqI
额外注意
代码中echo $mail['FromName'];的写法错误,PHPMailer对象不能通过数组下标访问属性,应改为echo $mail->FromName;。
内容的提问来源于stack exchange,提问作者Manisha
相关产品推荐
相关产品推荐

