【问题标题】:How to send to BCC address when using PHPMailer to format MIME message for Gmail API?使用 PHPMailer 为 Gmail API 格式化 MIME 消息时如何发送到密件抄送地址?
【发布时间】:2015-05-01 00:54:23
【问题描述】:

我正在使用 PHPMailer 来构建电子邮件。我仅将 PHPMailer 用于 MIME 消息格式,而不是发送。

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

//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”地址。

总而言之,当我使用此代码发送电子邮件并向 Gmail API 提供“密件抄送”地址时,我不看到发送的消息头中的“未公开收件人”,并且消息没有传输到密件抄送地址。

当我使用 gmail 网络界面 发送电子邮件并在那里提供“密件抄送”地址时,我会看到“未披露的收件人” ' 在发送的消息头中,消息传送到密件抄送地址。

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

【问题讨论】:

  • 据我所知,密件抄送地址不会出现在已发送邮件的原始标头中。这样收件人在收到邮件时就不会看到密件抄送中的地址
  • 是的,但是在这种情况下,TO和CC传输成功,而BCC没有。
  • 那就奇怪了。我认为“收件人:未公开的收件人”不是协议的一部分,如果收件人和抄送字段中没有任何内容,通常邮件服务器会自动将其放在那里。但是您在“收件人”和“抄送”字段中有地址,因此不会出现。您检查过密送收件人地址的垃圾邮件文件夹吗?
  • 我正在开发中,所以我检查了密件抄送收件人的电子邮件帐户,但邮件不存在。我正在使用适用于企业帐户的“免费”谷歌应用程序进行测试。生产账户是付费账户。我怀疑也许谷歌不会让我从免费帐户发送密件抄送电子邮件。我会测试并报告
  • “未公开收件人”字符串是空地址组的完全任意名称。它没有特别的意义。

标签: php gmail phpmailer mime bcc


【解决方案1】:

致任何发现此问题但未使用 Gmail api 发送,仅使用 PhpMailer 构建原始 MIME 消息的人:

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

我想如果将 phpMailer 对象设置为 SMTP 或邮件方法没有区别,因为您不会使用它来实际发送电子邮件。

【讨论】:

  • 当我使用 Gmail API 和 PHPMailer 时,这个问题的原始解决方案最近停止了对我的工作。感谢您的评论,我的研究确定 ->isMail() 必须添加 ->isSMTP() 和 @987654323 @,否则 Gmail API 不会将电子邮件副本发送到密件抄送地址。在我添加->isMail() 后,密件抄送又开始使用 Gmail 和 PHPMailer。
【解决方案2】:

只需添加

$mail->addBCC('bcc@example.com');

【讨论】:

  • 这看起来像是已被接受的答案中已经涵盖的内容 - 您有什么新内容要添加到其中吗?
【解决方案3】:

PHPMailer 将在内部跟踪密件抄送收件人,如果您使用 PHPMailer 发送邮件,它将在 SMTP envelope 期间指定密件抄送收件人。

但是,当您从 PHPMailer 提取原始消息时,您会丢失 PHPMailer 正在跟踪的内部收件人列表。 raw message 不包含密件抄送信息。 To: 和 Cc: 标头将包含适当的收件人,GMAIL API 可能会使用这些标头来推断预期的收件人。

要添加密件抄送收件人,您需要在发送邮件之前使用 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();

【讨论】:

  • 谢谢!这就是解决方案。我没有足够的声望来投票给你,但这解决了我的问题。
  • 我现在有足够的声誉来投票给你 - 再次感谢 - 仍在使用此解决方案,它仍然有效。
  • @cloudxix 五年后你回来感谢他,你是个好人。
  • @AlexisPhilip 我仍然每天都在使用这个代码,并且仍然感谢一个难题的解决方案。现在,如果我只能将 iMac Pro 启动到 Linux 中。
猜你喜欢
  • 2013-08-15
  • 2011-11-20
  • 2018-12-14
  • 2021-12-15
  • 2013-10-08
  • 2012-07-05
  • 2014-10-10
  • 1970-01-01
  • 2018-12-29
相关资源
最近更新 更多