Ruby中邮件附件的代码,给解释就给分 if m.dispositionfilename m.disposition_param(filename)if file
Ruby中邮件附件的代码,给解释就给分
if m.disposition
filename = m.disposition_param('filename')
if filename[0,2]=='=?'
filename.gsub!(/=\?[^\?]+\?(.)\?([^\?]+)\?=$/){$1=='B' ?
$2.unpack('m*') : $2.unpack('M*')}
end
begin
filename = Iconv.iconv("gbk","utf-8",filename).to_s
rescue => e
$log.debug(e)
end
filename.gsub!("\r\n","")
filename.gsub!("\n","")
attaments << filename
1,filename是附件的名称吧?请问为啥会文件名里有 =?这样的字符?
2,后面的filename.gsub!(/=\?[^\?]+\?(.)\?([^\?]+)\?=$/){$1=='B' ?
$2.unpack('m*') : $2.unpack('M*')}
谢谢解答,要详细。。。
[解决办法]1. filename[0,2]=='=?'
filename 可能是一个数组,
比如
a=[1,2,3]
puts a[0,2]
=> [1,2]
至于 =? 就是比较取的值是否是 =? 这个字符串
2.filename.gsub!(/=\?[^\?]+\?(.)\?([^\?]+)\?=$/){$1=='B' ?
$2.unpack('m*') : $2.unpack('M*')}
这是ruby 特有的一个语法
比如 c == nil? "空值" : "非空"
它其实就等于
if c == nil
"空值"
else
"非空"
end
至于gsub! 是一个替换字符串函数,加一个! 是将替换后的结果保存。它里面可以支持正则式。
象你看到的 /=?[.... 这些都是它写的正则式,至于是什么意思,你要查下正则式规则。后面的 == 'B'。是说如果替换后的字符串的结果等于 B 的话,就如何如何。。。
[解决办法]首先
taito所说的
" 这是ruby 特有的一个语法
比如 c == nil? "空值" : "非空"
"有问题。
? : 是一个三元操作符,根本不是什么ruby特有的,很多语言里面都有,比如C
filename应该是一个字符串,得到的文件名,"filename[0,2]=='=?'"的意思是看这个文件名是不是以=?开头的。
那个正则表达式的意思是这样的:
=\?[^\?]+\?(.)\?([^\?]+)\?=$ 文件名应该是 =?????内容??????=
如果文件名的内容部分是B 那么就把红色的问号部分字符串以base64-encoded的方式进行unpack后替换原有部分,否则以quoted-printable的方式unpack并替换。(具体参阅unpack函数)
filename = Iconv.iconv("gbk","utf-8",filename).to_s 将文件名中的的编码方式从utf-8专程gbk
filename.gsub!("\r\n","")
filename.gsub!("\n","")
这两句是删掉带文件名中的换行符!
------解决方案--------------------
filename就是一个字符数组
filename[0,2]=='=?' 判断filename是否以'=?'开头
[解决办法]1、
filename是一个String,虽然Ruby的String的底层实现可能与Array有关,但是String和Array都是ruby的标准库,这里说filename是个String更合适。
filename[0,2]是这个字符串开头的两个字符。搞不清楚的话,建议看看ruby的文档http://ruby-doc.org/core/classes/String.html#M000771
Mail在传输时会首先转化成某种*神秘的*编码。当然编码方式很多,比如这里用到的base64编码。=?也就在这个编码转换后产生了。可以看一下这个:http://www.people.com.cn/GB/channel5/569/20000904/216147.html
2、
这个匹配,目的是判断编码方式(标志为上为B,是base64编码)。
block内的?:则是选择了一个upack方式进行decode。http://ruby-doc.org/core/classes/String.html#M000760