require'mail'# 需要先安装 mail gem # 构建 RFC822 标准的邮件字符串 mail = Mail.new do from '[email protected]' to '[email protected]' subject 'This is a test email' content_type 'text/plain; charset=GBK' body "中".encode('GBK') end
original_msg = mail.to_s =begin Date: Sat, 19 Aug 2017 13:39:10 +0800 From: mikel@test.lindsaar.net To: you@test.lindsaar.net Message-ID: <5997cefe17bb6_5ded1e74693bc8972ac@hparch.mail> Subject: This is a test email Mime-Version: 1.0 Content-Type: text/plain; charset=GBK Content-Transfer-Encoding: base64 1tA= =end puts original_msg
# 开始解析 puts "*" * 42 mail = Mail.new(original_msg) body = mail.body.decoded puts body # 乱码 puts body.encoding # ASCII-8BIT puts body.force_encoding(mail.charset).encode('UTF-8') # 中 # 需要检查 charset 是否存在,通过 Encoding.find 方法
require'mail'# 需要先安装 mail gem require'open-uri' # 构建 RFC822 标准的邮件字符串 mail = Mail.new do from '[email protected]' to '[email protected]' subject 'This is a test email' content_type 'image/png; filename=One_black_Pixel.png' body open('https://upload.wikimedia.org/wikipedia/en/4/45/One_black_Pixel.png').read end
original_msg = mail.to_s =begin Date: Sat, 19 Aug 2017 14:25:48 +0800 From: mikel@test.lindsaar.net To: you@test.lindsaar.net Message-ID: <5997d9ec98315_695f2a4c229bd097632@hparch.mail> Subject: This is a test email Mime-Version: 1.0 Content-Type: image/png; filename=One_black_Pixel.png Content-Transfer-Encoding: base64 iVBORwoaCgAAAApJSERSAAAAAQAAAAEIAgAAAJB3U94AAAABc1JHQgCuzhzp AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAAxJREFU GFdjYGBgAAAABAABXM3/aQAAAABJRU5ErkJggg== =end puts original_msg
require'mail'# 需要先安装 mail gem require'open-uri' # 构建 RFC822 标准的邮件字符串 mail = Mail.new do from '[email protected]' to '[email protected]' subject 'This is a test email' part :content_type => "multipart/alternative", :content_disposition => "inline"do |p| p.part body:"abc" p.part content_type:'image/png; filename=One_black_Pixel.png', body: open('https://upload.wikimedia.org/wikipedia/en/4/45/One_black_Pixel.png').read p.part body:"def" end end
# 开始解析 puts "*" * 42 mail = Mail.new(original_msg) puts mail.multipart? puts mail.text_part.body # 默认只取了第一个 text part
puts "*" * 42 # 通过 all_parts 拿到所有 part, 包含本身. mail.all_parts.each do |part| # 需要排除 multipart , attachment, 生产代码还需要区分 text 还是 html. text 和 text 加在一起, html 和 html 加在一起. # 这里还有一个大坑,就是多 text part 字符拼接时,一定要先把编码转成 utf-8 .因为苹果设备如果刚好那部分只有英文,那么编码为 ASCII, 如果有中文,编码为 GBK . # 有兴趣的朋友可以用苹果邮件客户端自己测试一下 puts part.body if !part.multipart? && !part.attachment? end
multipart 再包含 multipart
这种情景主要出现在苹果邮件客户端同时发送 text 和 html 格式的. html 是一个 sub multipart.