使用google-api-ruby-client’0.9.pre3’发送Gmail邮件

在rails 4应用程序中使用较新的google-api-
ruby-client发送gmail.

require 'google/apis/gmail_v1'

Gmail = Google::Apis::GmailV1

class MailService

  def initialize(params)
    @params = params
  end

  def call
    message = Gmail::Message.new
    service = Gmail::GmailService.new
    message.raw = (redacted)
    service.request_options.authorization = current_user.token.fresh_token
    result = service.send_user_message(current_user.email, message)
  end

end

这是调用API的结果:

Sending HTTP post https://www.googleapis.com/gmail/v1/users/me/messages/send?
200
#<Hurley::Response POST https://www.googleapis.com/gmail/v1/users/me/messages/send == 200 (63 bytes) 858ms>
Success - #<Google::Apis::GmailV1::Message:0x007fc9cf9b52dd
 @id="15096369c05cdb1d",
 @thread_id="15096369c05cdb1d">

原始邮件在没有问题的情况下从API资源管理器发送,但从我的应用程序执行时,我会在收件箱中收到退回邮件.在上面的示例中,编辑的示例是有效的RFC 2822格式的base-64 url​​安全字符串,fresh_token表示当前用户的oauth2访问令牌.

看一下反弹的邮件

Bounce <nobody@gmail.com>
2:43 PM (19 minutes ago)
to me

An error occurred. Your message was not sent.

有人有什么想法?好像我的(发件人)电子邮件可能是在原始邮件中被接收而不是收件人…虽然我认为API可以根据我的oauth访问令牌转发退回.

我非常感谢任何帮助.谢谢!

编辑:解决方案是将RFC 2822字符串作为原始属性传递而不使用base64编码.

最佳答案 Steve Bazyl似乎是正确的.截至(0.9.13),send_user_message上的文档是错误的.对于raw,它说:“整个电子邮件消息采用RFC 2822格式化和base64url编码的字符串.当提供format = RAW参数时返回messages.get和drafts.get响应.对应于JSON属性raw.”据我所知,这是完全错误的.

从google-api-client 0.8更新到0.9时,我遇到了这个问题,删除base64编码解决了这个问题.即打电话给0.8:

response = @service.execute(
  api_method: api.users.messages.to_h['gmail.users.messages.send'],
  body_object: {
    raw: Base64.urlsafe_encode64(mail.to_s)
  },
  parameters: {
    userId: 'me',
  }
)

成为

message = { raw: mail.to_s }
res = @service.send_user_message('me', message, {})

在0.9.

报道为https://github.com/google/google-api-ruby-client/issues/474.

点赞