【问题标题】:Unable to send Gmail Message with Gmail API无法使用 Gmail API 发送 Gmail 邮件
【发布时间】:2021-01-27 19:43:05
【问题描述】:

使用Gmail Service 发送电子邮件,但我对需要传递给Google::Apis::GmailV1::Message 的电子邮件格式有疑问,我正在以以下格式将原始参数传递给它

email_raw = "From: <#{@google_account}>
To: <#{send_to}>
Subject: This is the email subject

The email body text goes here"

# raw is: The entire email message in an RFC 2822 formatted and base64url encoded string.

message_to_send = Google::Apis::GmailV1::Message.new(raw: Base64.encode64(email_raw))
response = @service.send_user_message("me", message_to_send)

即使我在没有 base64 编码的情况下通过 email_raw 也会失败。我提供了有效的电子邮件,但它失败并出现错误

Google::Apis::ClientError(invalidArgument:需要收件人地址)

我检查了Sending an email with ruby gmail api v0.9,还找到了this,但它使用了我在Gmail API Ruby 客户端库中找不到的Mail 类。目前,email_raw 包含 \n 字符,但我已经在没有它的情况下对其进行了测试,但它不起作用。
此外,我还想在邮件中发送附件。

【问题讨论】:

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


    【解决方案1】:

    请注意,Gmail 需要 base64url 编码,而不是 base64 编码

    documentation:

    原始字符串(字节格式)

    RFC 2822 格式和 base64url 编码字符串中的整个电子邮件。当提供 format=RAW 参数时,在 messages.get 和 drafts.get 响应中返回。

    base64 编码的字符串。

    我建议您先使用 Try this API 进行测试 - 您可以使用在线 base64url 编码器对消息进行编码。

    那么,在使用Ruby的时候,可以使用方法:

    Base64.urlsafe_encode64(message).

    更新

    问题似乎在于您的原始消息正文。

    消息正文应具有以下结构:

    To: masroorh7@gmail.com Content-Type: multipart/alternative; boundary="000000000000f1f8eb05b18e8970"  --000000000000f1f8eb05b18e8970 Content-Type: text/plain; charset="UTF-8"  This is a test email  --000000000000f1f8eb05b18e8970 Content-Type: text/html; charset="UTF-8"  <div dir="ltr">This is a test email</div>  --000000000000f1f8eb05b18e8970--
    

    base64url 编码,如下所示:

    encodedMessage = "VG86IG1hc3Jvb3JoN0BnbWFpbC5jb20NCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iMDAwMDAwMDAwMDAwZjFmOGViMDViMThlODk3MCINCg0KLS0wMDAwMDAwMDAwMDBmMWY4ZWIwNWIxOGU4OTcwDQpDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9IlVURi04Ig0KDQpUaGlzIGlzIGEgdGVzdCBlbWFpbA0KDQotLTAwMDAwMDAwMDAwMGYxZjhlYjA1YjE4ZTg5NzANCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJVVEYtOCINCg0KPGRpdiBkaXI9Imx0ciI-VGhpcyBpcyBhIHRlc3QgZW1haWw8L2Rpdj4NCg0KLS0wMDAwMDAwMDAwMDBmMWY4ZWIwNWIxOGU4OTcwLS0"
    

    因此,您的消息正文应该是:

    Google::Apis::GmailV1::Message.new(raw:encodedMessage)
    

    【讨论】:

    • 试过了,我仍然得到同样的错误:400“需要收件人地址”。问题在于 email_raw 数据
    • 我明白了,在这种情况下,我建议您在 Gmail UI 中打开任何电子邮件,点击“三个点”,Show original,然后使用 FromTo 和所有内容在Content-Type: 下方作为您的消息模板 - 以确保格式正确。
    • 请在这里查看我对电子邮件原始消息格式的尝试0bin.net/paste/SOT94vCA#o-HVmtBvLG8w7MB9dY1cFL/… 它总是给出同样的错误
    • masrooratwork@gmail.com 是您的主要电子邮件地址吗?试试:From: &lt;masrooratwork@gmail.com&gt;,不要删除边界和--。删除DateMessage-ID 是正确的。
    • 是的,您每一步都让我更接近答案。我找到了一些可以处理 RFC 格式的东西。我会更新我的答案。
    【解决方案2】:

    我们可以轻松地将形成标准化和格式化电子邮件的工作转移到gem。只需将 gem 包含在您的项目中并执行此操作

    mail = Mail.new
    mail.subject = "This is the subject"
    mail.to = "someperson@gmail.com"
    # to add your html and plain text content, do this
    mail.part content_type: 'multipart/alternative' do |part|
      part.html_part = Mail::Part.new(body: email_body, content_type: 'text/html')
      part.text_part = Mail::Part.new(body: email_body)
    end
    # to add an attachment, do this
    mail.add_file(params["file"].tempfile.path)
    
    # when you do mail.to_s it forms a raw email text string which you can supply to the raw argument of Message object
    message_to_send = Google::Apis::GmailV1::Message.new(raw: mail.to_s)
    # @service is an instance of Google::Apis::GmailV1::GmailService
    response = @service.send_user_message("me", message_to_send)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-11-16
    • 2012-06-19
    • 2014-09-13
    • 2018-01-26
    相关资源
    最近更新 更多