Ruby on Rails中如何通过Gmail v1 API添加CSV邮件附件?
解决Ruby on Rails中使用Gmail API发送带CSV附件邮件的问题
嘿,我来帮你搞定这个附件的问题!你的代码里有几个小问题导致附件无法正常添加,咱们一步步修正:
问题分析
你的代码里有两处关键错误:
- MIME类型错误:你把
mime_type设成了'results.csv',这不是标准的MIME类型,CSV文件对应的正确MIME类型是text/csv - 附件内容错误:你直接传入了
CSV这个类对象,而不是CSV的实际内容(字符串或者文件读取的二进制内容) - 另外你给附件命名为
shoes.csv,但你说要添加的是results.csv,这里可能是笔误,咱们统一改成results.csv
正确代码示例
情况1:直接生成CSV内容字符串
如果是动态生成CSV内容,先把内容转换成字符串,再添加到附件:
# 先构造CSV内容(示例数据) csv_content = CSV.generate do |csv| csv << ["Name", "Email"] csv << ["Alice", "alice@example.com"] csv << ["Bob", "bob@example.com"] end m = Mail.new( to: "to@gmail.com", from: "from@gmail.com", subject: "Test Subject", body: "Test Body" ) # 正确添加CSV附件 m.attachments['results.csv'] = { mime_type: 'text/csv', content: csv_content } message_object = Google::Apis::GmailV1::Message.new(raw: m.to_s) service.send_user_message("me", message_object)
情况2:读取本地的results.csv文件
如果是要发送本地已有的CSV文件,直接读取文件内容即可:
m = Mail.new( to: "to@gmail.com", from: "from@gmail.com", subject: "Test Subject", body: "Test Body" ) # 读取本地文件内容添加附件 file_path = Rails.root.join('path/to/results.csv') m.attachments['results.csv'] = { mime_type: 'text/csv', content: File.read(file_path) } message_object = Google::Apis::GmailV1::Message.new(raw: m.to_s) service.send_user_message("me", message_object)
补充说明
- 如果你需要发送二进制附件(比如Excel文件),MIME类型要对应修改,同时内容要读取二进制格式(比如
File.binread(file_path)) - 确保你的
service对象已经正确完成了Gmail API的授权,这个你之前已经能发送普通邮件,所以授权部分应该没问题
内容的提问来源于stack exchange,提问作者Shurick




