使用 PHPMailer 为 Gmail API 格式化 MIME 邮件时如何发送到 BCC 地址?
How to send to BCC address when using PHPMailer to format MIME message for Gmail API?
我正在使用 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 提供 'BCC' 地址时,我 没有在发送的邮件头中看到'undisclosed-recipients',邮件没有传送到密件抄送地址。
当我使用 gmail 网络界面 发送电子邮件并在那里提供 'BCC' 地址时,我 做 看到发送的消息头中有'undisclosed-recipients',消息是发送到BCC地址。
有人知道这个问题的解决方法吗?
PHPMailer 将在内部跟踪 BCC 收件人,如果您要使用 PHPMailer 发送邮件,它将在 SMTP envelope.
期间指定 BCC 收件人
但是,当您从 PHPMailer 中提取原始邮件时,您会丢失 PHPMailer 跟踪的内部收件人列表。 raw message 不包含 BCC 信息。 To:
和 Cc:
headers 将包括适当的收件人,GMAIL API 可能使用这些 headers 来推断预期的收件人。
要添加 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();
只需添加
$mail->addBCC('bcc@example.com');
对于发现此问题但未使用 Gmail api 发送它,仅使用 PhpMailer 构建原始 MIME 消息的任何人:
如果您设置 $phpMailer->isMail()(是的,这是一个 setter),它将在原始 MIME 消息中包含 BCC:。
我认为将 phpMailer 对象设置为 SMTP 或邮件方法没有什么区别,因为您不会使用它来实际发送电子邮件。
我正在使用 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 提供 'BCC' 地址时,我 没有在发送的邮件头中看到'undisclosed-recipients',邮件没有传送到密件抄送地址。
当我使用 gmail 网络界面 发送电子邮件并在那里提供 'BCC' 地址时,我 做 看到发送的消息头中有'undisclosed-recipients',消息是发送到BCC地址。
有人知道这个问题的解决方法吗?
PHPMailer 将在内部跟踪 BCC 收件人,如果您要使用 PHPMailer 发送邮件,它将在 SMTP envelope.
期间指定 BCC 收件人但是,当您从 PHPMailer 中提取原始邮件时,您会丢失 PHPMailer 跟踪的内部收件人列表。 raw message 不包含 BCC 信息。 To:
和 Cc:
headers 将包括适当的收件人,GMAIL API 可能使用这些 headers 来推断预期的收件人。
要添加 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();
只需添加
$mail->addBCC('bcc@example.com');
对于发现此问题但未使用 Gmail api 发送它,仅使用 PhpMailer 构建原始 MIME 消息的任何人:
如果您设置 $phpMailer->isMail()(是的,这是一个 setter),它将在原始 MIME 消息中包含 BCC:。
我认为将 phpMailer 对象设置为 SMTP 或邮件方法没有什么区别,因为您不会使用它来实际发送电子邮件。