使用PHPMailer格式化MIME消息发送到Gmail API时如何发送BCC地址?

16

我正在使用PHPMailer构建电子邮件消息。 我只使用PHPMailer进行MIME消息格式化,而不是发送。

然后在将其传递给Gmail API处理之前,我从PHPMailer对象中提取原始消息。

//Create a new PHPMailer instance
$mail = new PHPMailer;

//Tell PHPMailer to use SMTP
$mail->isSMTP();
$mail->IsHTML(true);

//Disable SMTP debugging
// 0 = off (for production use)
$mail->SMTPDebug = 0;

//Set who the message is to be sent from
$mail->setFrom("fromaddress@domain.com", "From Name");

//Set an alternative reply-to address
$mail->addReplyTo("replyaddress@domain.com", "Reply Name");

//Set to address
$mail->addAddress("address@domain.com", "Some Name");

//Set CC address
$mail->addCC("ccaddress@ccdomain.com", "Some CC Name");

//Set BCC address
$mail->addBCC("bccaddress@ccdomain.com", "Some BCC Name");

//Set the subject line
$mail->Subject = "Test message";

//Set the body
$mail->Body = file_get_contents("/messagestore/some.html");

//Attach a file
$mail->addAttachment("/messagestore/some.pdf","some.pdf","base64","application/pdf");

//generate mime message
$mail->preSend();

//get the mime text
$mime = $mail->getSentMIMEMessage();

//do the google API dance
$newMailMessage = new Google_Service_Gmail_Message();
$data = base64_encode($mime);
$data = str_replace(array('+','/','='),array('-','_',''),$data); // url safe
$newMailMessage->setRaw($data);
$gmailService = new Google_Service_Gmail($google_client);
$gmailService->users_messages->send('me', $newMailMessage);

根据PHPMailer文档,CC和BCC只能在Win32环境下发送。

然而,我的MIME格式的邮件通过Gmail API成功传输到“TO”和“CC”地址,但无法传输到“BCC”地址。

总之,当我使用这段代码发送电子邮件并提供“BCC”地址给Gmail API时,在发送的邮件头中我没有看到“未公开收件人”,且该消息传输到BCC地址。

当我使用Gmail网页界面发送邮件并在那里提供“BCC”地址时,我看到了发送消息头中的“未公开收件人”,并且该邮件已经传递到BCC地址。

有人知道解决这个问题的方法吗?


1
据我所知,密送地址不会出现在发送消息的原始标头中。因此,收件人在收到邮件时看不到密送地址。 - Hoàng Long
是的,但在这种情况下,收件人(TO)和抄送(CC)可以成功发送,而密送(BCC)则无法发送。 - cloudxix
那就很奇怪了。我认为“收件人:未公开收件人”不是协议的一部分,通常如果TO和CC字段中没有内容,邮件服务器会自动将其放在那里。但是您在To和Cc字段中有地址,因此它不会出现。您是否检查过Bcc收件人地址的垃圾邮件文件夹? - Hoàng Long
1
我正在开发中,所以我检查了BCC收件人的电子邮件账户,但是消息并不在那里。我正在使用一个“免费”的Google商业应用程序进行测试。生产帐户是付费帐户。我怀疑可能是因为Google不允许我从免费帐户发送BCC电子邮件。我将进行测试并报告结果。 - cloudxix
“undisclosed-recipients”字符串是一个空地址组的任意名称,它没有特定的含义。 - Synchro
在这种情况下,我认为“未公开收件人”表示Gmail是否处理了电子邮件消息中的BCC地址元素。 - cloudxix
3个回答

40

PHPMailer将在内部跟踪BCC收件人,如果您使用PHPMailer发送消息,则会在SMTP信封中指定BCC收件人。

然而,当您从PHPMailer提取原始消息时,将失去PHPMailer正在跟踪的内部收件人列表。 原始消息不包括BCC信息。 To:Cc:标头将包括适当的收件人,GMAIL API 可能使用这些标头来推断预期的收件人。

要添加BCC收件人,您需要使用GMAIL API在发送消息之前添加这些收件人。

您没有提供您的GMAIL API代码,但它可能遵循以下概述:

$message = new Message();

# construct message using raw data from PHPMailer
$message->setSubjectBody(...);
$message->setTextBody(...);
$message->setHtmlBody(...);

# *** add the BCC recipients here ***
$message->addBcc("secret.recipient@google.com");

# send the message
$message->send();

3
谢谢!这就是解决方案。我没有足够的声望来为您投票,但这解决了我的问题。 - cloudxix
7
我现在有足够的声望来为你投票了 - 再次感谢 - 我仍在使用这个解决方案,而且它仍然有效。 - cloudxix
4
你5年后回来感谢他,你是个伟大的人。 - Alexis Philip
1
@AlexisPhilip 我仍然每天使用这段代码,并为解决棘手的问题而感激。现在如果我能让我的iMac Pro启动Linux就好了。 - cloudxix

4

对于任何找到这个问题但不使用Gmail API发送电子邮件,只使用PhpMailer构建原始MIME消息的用户:

如果您设置了$phpMailer->isMail()(是的,这是一个setter),它将在原始MIME消息中包含BCC:。

我想,无论是将phpMailer对象设置为SMTP还是邮件方法,都没有关系,因为您不会实际使用它发送电子邮件。


3
最近在使用Gmail API和PHPMailer时,我遇到了这个问题的原始解决方法已经失效。感谢您的评论,我的研究确定在->isSMTP()isHTML(true)之后必须添加->isMail(),否则Gmail API将不会向BCC地址发送电子邮件副本。在我添加了->isMail()之后,BCC再次与Gmail和PHPMailer配合使用起来了。 - cloudxix
当我设置isMail()时,通过Gmail SMTP根本没有发送任何消息。 - undefined

4
只需添加 < /p>
$mail->addBCC('bcc@example.com');

5
这似乎是已经在接受的答案中涵盖的内容 - 你是否有任何想要补充的新内容? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接