设为首页 收藏本站
查看: 543|回复: 0

[经验分享] 用Python处理邮件

[复制链接]

尚未签到

发表于 2017-4-25 12:11:24 | 显示全部楼层 |阅读模式
用Python处理邮件
2011年07月20日
  A.title1:link {font-size:17.9px;font-family:arial;font-weight:bold;text-decoration:none;color:#ffffff;}A.title1:visited {font-size:17.9px;font-family:arial;font-weight:bold;text-decoration:none;color:#ffffff;}A.title1:active {font-size:17.9px;font-family:arial;font-weight:bold;text-decoration:none;color:#ffffff;}A.title1:hover {font-size:17.9px;font-family:arial;font-weight:bold;text-decoration:none;color:#ffffff;}A.title2:link {text-decoration:none;color:#000000;font-size:12px}A.title2:visited {text-decoration:none;color:#000000;font-size:12px}A.title2:active {text-decoration:none;color:#ff0000;font-size:12px}A.title2:hover {text-decoration:none;color:#ff0000;font-size:12px}
  
  ChinaUnix.net首页 | 论坛 | 博客 | Linux | 人才 | 培训 | 精华 | Wiki | 读书 | 资料 | 手册 | 下载 | 搜索
  
  ChinaUnix首页 > 精华文章 > Python > 正文   
  
  
  总体来说python处理邮件还是比较方便的,库提供了很多工具.下面我把心得写出来,给新手一个启迪,也请高手给些更好的方法.
  先说接受邮件.  poplib 方法.
  1.poplib.POP3('这里填入你pop邮件服务器地址') 登陆服务器.
  2.poplib.user('用户名 ') poplib.pass_('密码')
  3.poplib.stat()方法返回一个元组:(邮件数,邮件尺寸)
  mailCount,size=poplib.stat()
  这样mailCount就是邮件的数量,size,就是所有邮件的大小.
  3.poplib.rert('邮件号码')方法返回一个元组:(状态信息,邮件,邮件尺寸)  
  hdr,message,octet=server.retr(1) 读去第一个邮件信息.
  hdr的内容就是响应信息和邮件大小比如'+OK 12498 octets'
  message 是包含邮件所有行的列表.
  octet 是这个邮件的内容.
  得到的message是邮件的原始内容,也就是没有解码过的,里面的内容和标题基本上都是base64编码的,下面说说如何处理原始邮件.
  python 的email库里提供了很多处理邮件的方法,我们先把原始邮件转成email实例,这样就可以用库方法处理邮件.
  email.message_from_string() 这个方法能把String的邮件转换成email.message实例.
  比如我们上面的message,向下面这样调用.
  mail=email.message_from_string(string.join(message,'\n'))
  这样我们就生成了一个email.Message实例
  现在我们来提取邮件内容,和标题,mail支持字典操作.比如下面的操作.
  mail['subject'] ,mail.get('subject')
  mail['To'],mail.get('to')'
  mail.keys() ,mail.items() 等等.
  中文邮件的标题和内容都是base64编码的.解码可以使用email.Header 里的decode_header()方法.
  比如 print mail['subject']   显示的都未处理的编码.
  '=?GB2312?B?UmU6IFtweXRob24tY2hpbmVzZV0g?=\n\t=?GB2312?B?y63E3LDvztLV0tbQzsS1xFBZVEhPTrP10afRp8+wtcTXysHP?='
  email.Header.decode_header(mail['subject']) 下面是解码后的信息.
  [('Re: [python-chinese] \xcb\xad\xc4\xdc\xb0\xef\xce\xd2\xd5\xd2\xd6\xd0\xce\xc4\xb5\xc4PYTHON\xb3\xf5\xd1\xa7\xd1\xa7\xcf\xb0\xb5\xc4\xd7\xca\xc1\xcf', 'gb2312')]
  返回的是一个列表,里面的内容保存在一个元组里,(解码后的字串,字符编码)
  显示解码后的标题就象下面这样
  print email.Header.decode_header(mail['subject'])[0][0]
  Re: [python-chinese] 谁能帮我找中文的PYTHON初学学习的资料
  上面的mail标题编码是'gb2312'的,在我的winxp机器上可以直接显示,如果编码是别的比如'utf-8'编码,那么显示出来的就是乱码了.所以我们需要使用unicode()方法,unicode('这里是string','这里是编码,比如UTF-8'),比如
  subject=email.Header.decode_header(mail['subject'])[0][0]
  subcode=email.Header.decode_header(mail['subject'])[0][1])
  print unicode(subject,subcode)
  Re: [python-chinese] 谁能帮我找中文的PYTHON初学学习的资料
  下面看如何处理邮件内容.
  mail里有很多方法,熟悉这些方法处理邮件就很容易了。
  get_payload() 这个方法可以把邮件的内容解码并且显示出来.第一个可选择参数是mail实例,第二个参数是decode='编码' ,一般都是,'base64'编码
  is_multipart(),这个方法返回boolean值,如果实例包括多段,就返回True,
  print mail.is_multipart()
  true  ,这说明这个mail邮件包含多个字段。我下面的函数就可以处理,显示邮件的全部内容。
  def showmessage(mail):
  if mail.is_multipart():
  for part in mail.get_payload():
  showmessage(part)
  else:
  type=mail.get_content_charset()
  if type==None:
  print mail.get_payload()
  else:
  try:
  print unicode(mail.get_payload('base64'),type)
  except UnicodeDecodeError:
  print mail
  最后,有点要说明,如果邮件里的中文用mail.Header.decode_header()方法,和unicode()方法都不能正常显示,那么说明这个中文无法处理了,显示出来就是乱码.比如:看看看见,最终处理完成后,还是乱麻。
  >;>;>;mail.get('subject')
  'Re: [python-chinese] =?UTF-8?B?wrnDmMOTw5p4bWzCscOgw4LDq8K1w4TDjg==?=\n\t=?UTF-8?B?w4rDjMOi?='
  >;>;>;decode_header( mail.get('subject'))
  [('Re: [python-chinese]', None), ('\xc2\xb9\xc3\x98\xc3\x93\xc3\x9axml\xc2\xb1\xc3\xa0\xc3\x82\xc3\xab\xc2\xb5\xc3\x84\xc3\x8e\xc3\x8a\xc3\x8c\xc3\xa2', 'utf-8')]
  >;>;>;print decode_header( mail.get('subject'))[1][0]
  鹿

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369116-1-1.html 上篇帖子: python的模块MySQLdb 下篇帖子: 自学python-helloworld等基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表