NeteaseMail.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import email
  2. import pathlib
  3. import smtplib
  4. from email.header import Header
  5. from email.mime.application import MIMEApplication
  6. from email.mime.text import MIMEText
  7. from email.mime.image import MIMEImage
  8. from email.mime.multipart import MIMEMultipart
  9. from nntplib import decode_header
  10. from imapclient import IMAPClient
  11. import email.parser
  12. import boto3
  13. import time
  14. import chardet
  15. import sys
  16. import importlib
  17. importlib.reload(sys)
  18. import os
  19. class NeteaseMail:
  20. # aws 账号登录
  21. def aws_login(self):
  22. client = boto3.client(service_name='comprehend', region_name='us-east-1',
  23. aws_access_key_id='AKIA2E67UIMD45Y3HL53',
  24. aws_secret_access_key='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')
  25. return client
  26. def aws_arn(self):
  27. document_classifier = 'arn:aws:comprehend:us-east-1:697864307463:document-classifier/'
  28. endpoint = 'arn:aws:comprehend:us-east-1:697864307463:document-classifier-endpoint/'
  29. return document_classifier, endpoint
  30. def s3_login(self):
  31. client = boto3.client(service_name='s3', region_name='us-east-1',
  32. aws_access_key_id='AKIA2E67UIMD45Y3HL53',
  33. aws_secret_access_key='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')
  34. return client
  35. # 连接邮箱服务器并登录。
  36. def loginEmail(self, imap_server, from_addr, password, imap_port, isssl=True):
  37. '''第一部分:收件IMAP4********************************************'''
  38. '''登录邮箱IMAP4=========================================================='''
  39. email_server = None
  40. # 993 465
  41. try:
  42. email_server = IMAPClient(imap_server, ssl=isssl, port=imap_port)
  43. # email_server = imaplib.IMAP4_SSL(IMAP_SERVER, 993) # 网易企业邮箱服务器及SSL端口
  44. print("imap4 服务器连接成功")
  45. email_server.login(from_addr, password)
  46. email_server.id_({"name": "IMAPClient", "version": "2.1.0"})
  47. # email_server.login(FROM_ADDR, PASSWORD)
  48. print("imap4 (%s)账号密码正确,登录成功" % from_addr)
  49. except:
  50. print("imap4 服务器连接失败")
  51. else:
  52. return email_server
  53. # 关闭邮箱服务器连接
  54. def closeEmail(self, email_server):
  55. # 关闭select
  56. email_server.shutdown()
  57. print('退出邮箱')
  58. # 关闭连接
  59. # email_server.logout()
  60. # 获取邮箱内容、标题、发件人
  61. def getEmailContext(self, email_server):
  62. ''' 邮箱中收到的未读邮件的数量=========================================================='''
  63. # email_server.select_folder('INBOX', readonly=True) # readonly=True表明只读并不修改任何信息
  64. global a
  65. email_server.select_folder('INBOX')
  66. results = email_server.search('UNSEEN') # 读取未读邮件
  67. print("邮箱内获取到未读邮件:", len(results))
  68. subject_list = []
  69. bodydata_list = []
  70. from_list = []
  71. uid_list = []
  72. email_body = []
  73. fujian_list = []
  74. image_list = []
  75. try:
  76. for uid in results:
  77. msgdict = email_server.fetch(uid, ['Body[]', 'ENVELOPE'], '(RFC822)')
  78. mailbody = msgdict[uid][b'BODY[]']
  79. envelope = msgdict[uid][b'ENVELOPE']
  80. message = email.message_from_bytes(mailbody)
  81. text = message.as_string()
  82. body = email.parser.Parser().parsestr(text)
  83. email_body.append(body)
  84. nowtime = time.asctime(time.localtime(time.time()))
  85. nowmonth = nowtime.split()[1]
  86. nowday = nowtime.split()[2]
  87. emailmonth = body['Date'].split()[2]
  88. emailday = body['Date'].split()[1]
  89. if emailmonth != nowmonth or emailday != nowday:
  90. email_server.remove_flags(uid, b'\\Seen', silent=False)
  91. continue
  92. subject_list.append(decode_header(body['Subject']))
  93. from_list.append(decode_header(body['from']))
  94. uid_list.append(uid)
  95. attlist = {}
  96. for part in body.walk():
  97. if not part.is_multipart():
  98. file = part.get_filename() # 附件名
  99. if file:
  100. a = 1
  101. filename = email.header.decode_header(file)[0][0] # 附件名
  102. charset = email.header.decode_header(file)[0][1] # 编码
  103. if part.get_all("Content-ID"):
  104. content_id = part.get_all("Content-ID")[0][1:-1]
  105. else:
  106. content_id = "" # 附件ID,也就是邮件源码里面的cid
  107. ''' 多个附件时将附件名和ID对应保存到dict里面,后面将正文中的cid替换为本地保存路径 '''
  108. attlist[content_id] = filename
  109. ''' 附件文件名为中文或有编码的时候要进行转码 '''
  110. if str(charset) != "None":
  111. filename = filename.decode(charset)
  112. filedata = part.get_payload(decode=True) # 附件内容
  113. ''' 把附件写到文件里面,附件一定要用wb打开,二进制 '''
  114. file_path = os.path.join(os.path.dirname(__file__) + '/../emailtrainfile/image/')
  115. image_list.append(file_path + filename)
  116. with open(file_path + filename, "wb") as fw:
  117. fw.write(filedata)
  118. fw.close()
  119. elif part.get_content_type() == 'text/plain':
  120. con3 = part.get_payload(decode=True).strip()
  121. print(chardet.detect(con3))
  122. if chardet.detect(con3)['encoding'] == 'utf-8':
  123. bodydata_list.append(con3.decode('utf-8'))
  124. else:
  125. bodydata_list.append(con3.decode('gbk'))
  126. if a == 1:
  127. fujian_list.append('have')
  128. email_server.remove_flags(uid, b'\\Seen', silent=False)
  129. except Exception as e:
  130. print(e)
  131. print('获取内容出错')
  132. else:
  133. return subject_list, from_list, bodydata_list, uid_list, results, email_body, fujian_list, image_list
  134. # if subject_list and bodydata_list:
  135. # data_unseen = [subject_list, bodydata_list]
  136. # data_unseen1 = pd.DataFrame(data_unseen)
  137. # data_unseen1.to_csv('data_unseen.csv', sep=',', header=True, index=True, encoding='utf_8_sig')
  138. #
  139. # aws_key = "ASIA2E67UIMDTJFRF7UE" # 【你的 aws_access_key】
  140. # aws_secret = "5u6MDvm3Fabdbc6EG9+JPJE3x07peNkrvok76Dqq" # 【你的 aws_secret_key】
  141. # aws_session_token = "FwoGZXIvYXdzEHQaDKQchZxanXOpNJ2UriLoARUmKF/Uf6HZMhB4Bdo1Df4BlirgpqOyXmMULjx1yvqah1+BKIV2rzEoxxaVmvjcvLjHMQamPR7QzLZYP/WgJ6biPTnfqJWy5rCVpIZtD3D2nmGWAf5RSedADILJgBQmrXumFX2jrnm6THbqfdyfT2eitKt5ZD82zvLOaHMWu7mzomzmye8Eimt28Dhj6jsLeZPxOhhHBLUi+gddHAMCQq8HmGbnsXN5OrOBvqreRAxdR/u6vuQHbVpV3b8V5nkAtTVhOCaGRcPETARB8F/jFuFRhW9tAjPZisP/SEa8vUDR32FoMNQeda4o5+7l/gUyKYlem5bIB96gywY6s4C8c1PAa3l09+5tdGNp5laAJf7vMUzMJckR2EgF"
  142. # session = Session(aws_access_key_id=aws_key,
  143. # aws_secret_access_key=aws_secret,
  144. # aws_session_token=aws_session_token,
  145. # region_name="ap-southeast-1") # 此处根据自己的 s3 地区位置改变
  146. # s3 = session.resource("s3")
  147. # client = session.client("s3")
  148. # bucket = "asj-oct-ipc" # 【你 bucket 的名字】 # 首先需要保.证 s3 上已经存在该存储桶,否则报错
  149. # upload_data = open("./././static/log/error.log", "rb")
  150. # upload_key = "86YC8Z192VB1VMKU111A/vod1/test"
  151. # file_obj = s3.Bucket(bucket).put_object(Key=upload_key, Body=upload_data)
  152. # 发送邮箱
  153. def faEmail(self, email_server, message, subject, from_addr, to_addr):
  154. if email_server:
  155. print("邮件开始发送")
  156. message = message
  157. msg = MIMEText(message, 'plain', 'gbk')
  158. msg['Subject'] = Header(subject, 'gbk')
  159. msg['From'] = Header(from_addr)
  160. try:
  161. msg['To'] = Header(to_addr, 'utf-8')
  162. email_server.sendmail(from_addr, to_addr, msg.as_string()) # 将msg转化成string发出
  163. print("邮件发送成功")
  164. except Exception as e:
  165. print('Error:', e)
  166. email_server.quit()
  167. def sentemail(self, email_server, uid, message, image, subject, from_addr, to_addr, iemial, ipassword):
  168. host = 'smtp.163.com'
  169. # 设置发件服务器地址
  170. port = 465
  171. # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式
  172. # host = 'smtp.qiye.163.com'
  173. # port = 994
  174. sender = iemial
  175. # 设置发件邮箱,一定要自己注册的邮箱
  176. pwd = ipassword
  177. # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码
  178. receiver = to_addr
  179. # 设置邮件接收人,可以是QQ邮箱
  180. body = message
  181. # 设置邮件正文,这里是支持HTML的
  182. msg = MIMEMultipart()
  183. # msg = MIMEText(body, 'html')
  184. # msg = MIMEText(body, 'plain', 'utf-8')
  185. msg.attach(MIMEText(body, 'plain', 'utf-8'))
  186. msg.attach(MIMEText(body, 'html', 'utf-8'))
  187. if image:
  188. for i in image:
  189. print(i.split('.')[-1])
  190. if i.split('.')[-1] == 'png' and 'jpeg' and 'jpg':
  191. with open(i, 'rb') as f:
  192. msgImage = MIMEImage(f.read())
  193. # 定义图片ID
  194. msgImage.add_header('Content-ID', '<image1>')
  195. msg.attach(msgImage) # 添加图片
  196. else:
  197. part_attach1 = MIMEApplication(open(i, 'rb').read()) # 打开附件
  198. # 构建邮件附件
  199. part_attach1.add_header('Content-Disposition', 'attachment', filename=pathlib.Path(i).name) # 为附件命名
  200. msg.attach(part_attach1) # 添加附件
  201. # 设置正文为符合邮件格式的HTML内容
  202. msg['subject'] = subject
  203. # 设置邮件标题
  204. msg['from'] = Header(from_addr)
  205. # 设置发送人
  206. msg['to'] = Header(to_addr)
  207. # 设置接收人
  208. try:
  209. s = smtplib.SMTP_SSL(host, port)
  210. # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL
  211. s.login(sender, pwd)
  212. # 登陆邮箱
  213. s.sendmail(sender, receiver, msg.as_string())
  214. # 发送邮件!
  215. print('邮件转发成功')
  216. email_server.set_flags(uid, b'\\Seen', silent=False)
  217. except smtplib.SMTPException as e:
  218. print(e)
  219. print('邮件转发失败')
  220. email_server.remove_flags(uid, b'\\Seen', silent=False)