在 ruby 中使用 google-api-client gem 将文件附加到电子邮件

Attaching files to emails with google-api-client gem in ruby

感谢 google-api-client gem:

,我已经成功地通过 Google API 发送了电子邮件
def send_message(from:, to:, subject:, body:)
  message = RMail::Message.new
  message.header['From'] = from
  message.header['To'] = to
  message.header['Subject'] = subject
  message.body = body
  @service.send_user_message(
    'me',
    upload_source: StringIO.new(message.to_s),
    content_type: 'message/rfc822'
  )
end

现在我正在尝试将文件附加到电子邮件中,但找不到有关如何操作的示例。 gem 存储库中的 example included 没有解释这种情况。我已经开始做逆向工程,但在几乎一整天的尝试之后,我开始做一些疯狂的事情。

我最后一次尝试如下:

upload = Google::Apis::Core::UploadIO.new('/path/to/image.png', 'image/png', 'image.png')
file_part = Google::Apis::Core::FilePart.new(nil, upload)
message_object = Google::Apis::GmailV1::Message.new(payload: file_part, raw: 'this is a test body')
service.send_user_message('me', message_object, content_type: 'message/rfc822')

邮件被退回。

附加文件的正确方法是什么?

事实证明这比我预期的要容易。这是一个例子:

class Client
  def initialize(service)
    @service = service
  end 

  def send_message(from:, to:, subject:, body:)
    message = RMail::Message.new
    message.header.set('From', from)
    message.header.set('To', to)
    message.header.set('Subject', subject)
    message.body = [text_part(body), file_part]

    @service.send_user_message(
      'me',
      upload_source: StringIO.new(message.to_s),
      content_type: 'message/rfc822'
    )   
  end 

  private

  def text_part(body)
    part = RMail::Message.new
    part.body = body

    part
  end 

  def file_part
    part = RMail::Message.new
    part.header.set('Content-Disposition', 'attachment', 'filename' => File.basename('/path/to/image.png'))
    part.body = File.read('/path/to/image.png')

    part
  end 
end 

我会等待进一步的回复,也许有些事情我没有考虑到。