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

时间:2017-01-05 15:20:24

标签: ruby email google-api-client

由于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')

电子邮件被退回。

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

1 个答案:

答案 0 :(得分:1)

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

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 

我会等待进一步的回复,也许我没有考虑到这一点。