当前位置:   article > 正文

Python用IMAP协议收取QQ邮件,并收取附件,标记已读_imap python

imap python
  1. #-*- encoding: utf-8 -*-
  2. #-*- encoding: gbk -*-
  3. '''
  4. 基于Python 3.X,网上很多代码都残缺或者不能直接用,只能左抄抄右抄抄,自己改写了这份收取QQ邮箱的代码,可以收取邮件正文和附件。附件不会乱码。在邮件正文部分,解决的很粗暴,bs4直接去掉HTML属性了,同时变通解决换行问题,输出邮件内容为列表方便后期解析,以后有空再弄。测试暂时未发现bug,收取邮件后会改写为已读。
  5. 主要是可以以后改成一个基于邮箱的应答机器人。通过标题来判断问题处理方式,同时收取附件的功能可以用来传东西。
  6. '''
  7. import bs4
  8. import email
  9. from imapclient import IMAPClient
  10. import sys
  11. #import imaplib
  12. # 猜测字符编码
  13. def guess_charset(msg):
  14. # 先从msg对象获取编码:
  15. charset = msg.get_charset()
  16. if charset is None:
  17. # 如果获取不到,再从Content-Type字段获取:
  18. content_type = msg.get('Content-Type', '').lower()
  19. for item in content_type.split(';'):
  20. item = item.strip()
  21. if item.startswith('charset'):
  22. charset = item.split('=')[1]
  23. break
  24. return charset
  25. def decode_str(s):
  26. value, charset = email.header.decode_header(s)[0]
  27. if charset:
  28. value = value.decode(charset)
  29. return value
  30. def getMail(host, username, password, port=993):
  31. try:
  32. c = IMAPClient(host, ssl= True)
  33. print('连接成功,SLL')
  34. c.login(username, password) #登录个人帐号
  35. print('登录成功,SLL')
  36. except:
  37. print('连接失败,检查服务器地址或者端口号')
  38. sys.exit()
  39. try:
  40. c.select_folder('INBOX',readonly=False) #, readonly = True
  41. result = c.search('UNSEEN')
  42. if result==[]:
  43. print('已读:%s' % c.search('SEEN'))
  44. # msgdict = c.fetch(result, ['BODY.PEEK[]'] )
  45. msgdict = c.fetch(result,['BODY[]'])#自动切换已读状态
  46. # print(result)
  47. for message_id, message in msgdict.items():
  48. print('分解:%s' % message_id)
  49. msg=email.message_from_string(message[b'BODY[]'].decode())# 生成Message类型,QQ邮箱返回是比特形式,要转换字符串,坑死了
  50. ## 由于'From', 'Subject' header有可能有中文,必须把它转化为中文
  51. subject = email.header.make_header(email.header.decode_header(msg['SUBJECT']))
  52. mail_from = email.header.make_header(email.header.decode_header(msg['From']))
  53. mail_to=email.utils.parseaddr(msg.get("to"))[1] # 取to
  54. print('邮件标题:%s' % subject)
  55. print('mail_from:%s' % mail_from)
  56. print('mail_to:%s' % mail_to)
  57. # 循环信件中的每一个mime的数据块
  58. for par in msg.walk():
  59. if not par.is_multipart(): # 这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。
  60. name = par.get_param("name") #如果是附件,这里就会取出附件的文件名
  61. if name:#有附件
  62. # 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名
  63. h = email.header.Header(name)
  64. dh = email.header.decode_header(h)
  65. fname = dh[0][0]
  66. if dh[0][1]:
  67. fname = decode_str(str(fname, dh[0][1])) # 将附件名称可读化
  68. print('附件名:%s' % fname)
  69. data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中
  70. try:
  71. f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件
  72. except:
  73. print ('附件名有非法字符,自动换一个')
  74. f = open('aaaa', 'wb')
  75. f.write(data)
  76. f.close()
  77. else:
  78. content_type = par.get_content_type() #获取数据类型
  79. if content_type=='text/plain' or content_type=='text/html':
  80. # print('# 纯文本或HTML内容:')
  81. content = par.get_payload(decode=True)
  82. # 要检测文本编码:
  83. charset = guess_charset(par)
  84. if charset:
  85. content = content.decode(charset)
  86. # with open('data.txt','w',encoding='utf-8') as f:
  87. # f.write(content)
  88. html=content.replace('
  89. ','
  90. ')
  91. html_fj=html.split("
  92. ")
  93. 邮件正文内容_list=[]
  94. for i in html_fj:
  95. soup=bs4.BeautifulSoup(i,'lxml')
  96. 邮件正文内容=soup.getText().strip()
  97. if len(邮件正文内容)!=0:
  98. 邮件正文内容_list.append(邮件正文内容)
  99. print('%s号邮件正文内容: ' % (message_id))
  100. for i in 邮件正文内容_list:
  101. print(i)
  102. print('+'*60) # 用来区别各个部分的输出
  103. c.set_flags(message_id, '\Seen')#\Flagged标星,\Seen 标记已读,\Deleted 删除
  104. # print('设置单个邮件为已读')
  105. # 设置所有未读取邮件为已读邮件
  106. # if result!=[]:
  107. # c.set_flags(msgdict, b'\\unseen', silent=False)
  108. # print('设置邮件为已读')
  109. if result==[]:
  110. print('无新的未读邮件')
  111. # except Exception as bcnr:
  112. # print('报错信息:%s' % bcnr)
  113. finally:
  114. c.logout()
  115. if __name__ == '__main__':
  116. host = "imap.qq.com" # "pop.mail_serv.com"
  117. username = "XXXXXX@qq.com"
  118. password = "XXXXXXXX"
  119. port = 993
  120. getMail(host, username, password,port)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/822965
推荐阅读
相关标签
  

闽ICP备14008679号