专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Ruby/Rails

Ruby中邮件附件的代码,给解释就给分,该如何解决

发布时间:2011-06-29 18:42:57 文章来源:www.iduyao.cn 采编人员:星星草
Ruby中邮件附件的代码,给解释就给分
Python code

 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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: