Отправляйте сообщения gmail с помощью google-api-ruby-client '0.9.pre3'

Работа через отправку gmail с новым google-api-ruby-client в приложении rails 4.

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, но при выполнении из моего приложения я получаю сообщение о сбое в своей папке входящих сообщений. В приведенном выше примере отредактированный образец представляет собой действительную безопасную строку base-64 в формате RFC 2822, а 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.

1 ответ

Решение

Стив Базил, похоже, прав. Документация по send_user_message неверна (0.9.13). Для raw он говорит: "Все сообщение электронной почты в строке формата RFC 2822 и base64url. Возвращается в откликах messages.get и drafts.get, когда задан параметр format=RAW. Соответствует свойству 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.

Другие вопросы по тегам