我正在尝试使用带有ActionMailer 2.3.5的rails的zip附件发送电子邮件。
服务器上的zip文件是正确的(使用解压缩实用程序正确解压缩),但是收件人的zip文件已损坏。此外,添加附件会导致从电子邮件中删除邮件正文。
这种方法没什么了不起的:
attachment :content_type => "application/zip",
:body => File.read(zip.path),
:filename => File.basename(zip.path)
File.read周围显然出现了问题。当我在此处传递字符串而不是文件内容时,附件会正确显示。与二进制数据有关吗?
WTF?
答案 0 :(得分:3)
问题是File.read
将您的文件视为文本文件。 (我想你是在Windows上尝试这个)你必须指定模式强制它以二进制模式打开你的文件:
attachment :content_type => "application/zip",
:body => File.read(zip.path, mode: 'rb'),
:filename => File.basename(zip.path)
或者在Rails中> 3:
attachment[File.basename(zip.path)] = File.read(zip.path, mode: 'rb')
答案 1 :(得分:1)
如果您想要包含附件并保留身体(多部分邮件),您必须执行以下操作:
def email(message)
setup_mail(message)
part :content_type => "text/html",
:body => render_message("email", @body)
attachment :content_type => 'application/zip',
:body => File.read(message[:file].path),
:filename => File.basename(zip.path)
end
“电子邮件”是您的正文模板。
答案 2 :(得分:0)
尝试指定附件的编码:
attachment :content_type => "application/zip",
:body => File.read(zip.path),
:filename => File.basename(zip.path),
:transfer_encoding => 'base64'
答案 3 :(得分:0)
可能您需要以二进制读取模式打开您的zip文件:
:body => File.open(zip.path, 'rb') {|f| f.read}
答案 4 :(得分:0)
我在项目中遇到了同样的问题。我混合了“mu太短”和“fivaiez”的解决方案。现在它有效。非常感谢大家的评论。以下是我的代码。
def sent(sent_at = Time.now)
subject 'test attachment mail'
recipients 'mail-list@company.com'
from 'please_no_reply@company.com'
sent_on sent_at
content_type "text/html"
attachment :content_type => 'application/zip',
:body => File.read("data/sample.zip"),
:filename => 'sample.zip',
:transfer_encoding => "base64"
end