如何通过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)
关键说明
- 恢复HTML内容类型:把
message.content_type = 'text/html'加回来,这样你的HTML正文会被正确渲染,而不是转换成纯文本。 - 使用正确的MIME内容:
message.encoded会生成包含附件的完整MIME格式字符串,这比message.to_s更可靠。 - URL安全编码:
Base64.urlsafe_encode64会自动处理Base64字符串中的特殊字符,确保Gmail API能正确解析邮件结构。
这样修改后,Gmail就能正确识别邮件的附件,你收到的邮件会显示正常的HTML正文和可下载的附件,而不是Base64编码文本了。
内容的提问来源于stack exchange,提问作者Jais Anasrulloh Ja'fari
相关产品推荐
相关产品推荐

