【问题标题】:How send email with BCC header via GMAIL API?如何通过 GMAIL API 发送带有密件抄送标头的电子邮件?
【发布时间】:2016-03-04 07:03:21
【问题描述】:

如何通过 GMAIL API 使用密件抄送发送电子邮件?我向 TO 或 CC 发送电子邮件,但 BCC 不起作用。我使用Base64.urlsafe_encode64(email.to_s),这段代码创建了没有密件抄送的字符串。我的工作代码示例:

    email = Mail.new
    email.date = Time.now
    email.subject = subject
    email.to = email_array_to_email_to(to)
    email.cc = email_array_to_email_to(cc)
    email.bcc = email_array_to_email_to(bcc)
    email.reply_to = email_array_to_email_to(reply_to)
    email.html_part do
      body message
    end
    request = {
        api_method: @google_api.users.messages.to_h['gmail.users.messages.send'],
        parameters: { userId: 'me' },
        body_object: {
            raw: Base64.urlsafe_encode64(email.to_s)
        },
    }

我是否必须再次调用 GMAIL API 并使用线程 ID 和 BCC 作为 TO 发送此电子邮件? 我用google-api-client0.7.1

编辑: 邮件对象:

#<Mail::Message:70336725981360,
Multipart: true,
Headers: <Date: Tue,
01 Dec 2015 14:09:08 +0100>,
<Reply-To: >,
<To: ["quatermain32 <my_email@gmail.com>"]>,
<Cc: ["quatermain32 <my_email@gmail.com>"]>,
<Bcc: ["my_email@gmail.com"]>,
<Subject: Test subject>,
<Content-Type: multipart/mixed>>

带有to_s的邮件对象:

"Date: Tue, 01 Dec 2015 14:09:08 +0100\r\n
To: my_email <my_email@gmail.com>\r\n
Cc: my_email <my_email@gmail.com>\r\n
Message-ID: <565d9c6e3cf0b_058b7@Olivers-MacBook-Pro.local.mail>\r\n
Subject: Test subject\r\n
Mime-Version: 1.0\r\n
Content-Type: multipart/mixed;\r\n
 boundary=\"--==_mimepart_565d9bf468e77_cb0d35e200577a\";\r\n
 charset=UTF-8\r\n
 Content-Transfer-Encoding: 7bit\r\n
\r\n
\r\n
----==_mimepart_565d9bf468e77_cb0d3ff88645e200577a\r\n
Content-Type: text/html;\r\n
 charset=UTF-8\r\n
 Content-Transfer-Encoding: 7bit\r\n
\r\n
<p>Test content</p>\r\n
----==_mimepart_565d9bf468e77_cb0d3ff88645e200577a--\r\n
"

【问题讨论】:

  • 你能告诉我们email.to_s在编码之前的样子吗?
  • @Tholle 是的,我将其添加到问题中。没事吧?
  • 您在Mail object 中的&lt;Bcc: ["my_email@gmail.com"]&gt; 似乎是错误的。请改用&lt;Bcc: ["&lt;my_email@gmail.com&gt;"]&gt;
  • 一样=&gt; #&lt;Mail::Message:70354473411500, Multipart: true, Headers: &lt;Date: Tue, 01 Dec 2015 16:29:10 +0100&gt;, &lt;Reply-To: &gt;, &lt;To: ["Kriska Quatermain &lt;kriska@quatermain.org&gt;"]&gt;, &lt;Cc: &gt;, &lt;Bcc: ["oliver@techvoxinc.com &lt;oliver@techvoxinc.com&gt;"]&gt;, &lt;Subject: test bad bcc 2&gt;, &lt;Content-Type: multipart/mixed&gt;&gt; [2] pry(#&lt;GoogleApi::Gmail::Message&gt;)&gt; email.bcc =&gt; ["oliver@techvoxinc.com"] [3] pry(#&lt;GoogleApi::Gmail::Message&gt;)&gt; email.to =&gt; ["kriska@quatermain.org"]
  • 不。是一样的。我读它是因为电子邮件协议不允许在原始电子邮件中显示密件抄送,这是原始电子邮件。所以我可以向google api发出第二个请求,但我认为这是最后一个选择。谢谢

标签: ruby-on-rails ruby gmail gmail-api google-api-client


【解决方案1】:

您必须手动将密件抄送标题添加到电子邮件中,它不会发送给收件人。和 gmail-ruby-api 一样 https://github.com/jhk753/gmail-ruby-api/blob/e0d62a751bc31397926c5800532f26e185e00b16/lib/gmail/message.rb

encoded = mail.encoded
if bcc = mail.bcc.join(",").presence
  encoded.prepend "Bcc: #{bcc}\n"
end
... send email ...

【讨论】:

  • 这是正确的答案。当您在其上调用 .encoded 时,Mail gem 会丢弃 Bcc 标头,这最终会在 mail.to_s 期间发生。
猜你喜欢
  • 2020-01-06
  • 2012-03-20
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2018-12-29
  • 1970-01-01
相关资源
最近更新 更多