将文件附加到带有 ruby 中的谷歌 API 客户端 gem 的电子邮件中



由于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 存储库中包含的示例无法解释这种情况。我开始做逆向工程,但经过几乎一整天的尝试,我开始做疯狂的事情。

我最后一次尝试如下:

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 

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

最新更新