You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Gmail API发送带附件的邮件?Ruby代码问题求助

使用Ruby通过Gmail API发送带附件的邮件

你遇到的问题很典型——当添加附件后,Gmail API没有正确解析你的MIME邮件结构,导致附件变成了Base64文本显示。这是因为Gmail API对raw参数的格式有严格要求:它需要的是URL安全的Base64编码字符串,而不是直接传入原始的MIME内容。

解决方案

要修复这个问题,你需要对生成的完整MIME邮件内容做两步处理:

  • 先将MIME内容转换成Base64编码
  • 再把Base64字符串转换成URL安全格式(替换+为-,/为_,移除末尾的=符号)

Ruby的标准库已经提供了Base64.urlsafe_encode64方法,可以一步完成这两个操作,以下是修正后的完整代码:

client = google_client user_id
token = Token.find_by_user_id(user_id)
access_token = token.access_token
gmail = Google::Apis::GmailV1::GmailService.new
gmail.authorization = client

message = Mail.new
message.date = Time.now
message.subject = 'Supertramp'
message.body = "<p>Hi Alex, how's life?</p>"
message.content_type = 'text/html' # 恢复HTML内容类型设置
message.from = self.email
message.to = 'myemail@gmail.com'
message.add_file("/Users/myname/Downloads/image.png")

# 关键:对完整MIME邮件进行URL安全的Base64编码
encoded_message = Base64.urlsafe_encode64(message.encoded)
message_object = Google::Apis::GmailV1::Message.new(raw: encoded_message)

gmail.send_user_message('me', message_object)

关键说明

  1. 恢复HTML内容类型:把message.content_type = 'text/html'加回来,这样你的HTML正文会被正确渲染,而不是转换成纯文本。
  2. 使用正确的MIME内容:message.encoded会生成包含附件的完整MIME格式字符串,这比message.to_s更可靠。
  3. URL安全编码:Base64.urlsafe_encode64会自动处理Base64字符串中的特殊字符,确保Gmail API能正确解析邮件结构。

这样修改后,Gmail就能正确识别邮件的附件,你收到的邮件会显示正常的HTML正文和可下载的附件,而不是Base64编码文本了。

内容的提问来源于stack exchange,提问作者Jais Anasrulloh Ja'fari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:56:32