python3 邮件发送(多收件人,多抄送人、多附件)

学习笔记 马富天 2020-06-18 16:23:44 196 0

【摘要】作为一名后端开发人员,常常会与邮箱发送方面的工作打交道,邮件发送是非常常用一个功能,本文记录了一个多收件人、多抄送、多附件的 python3 邮件发送完整代码,以供后续学习、工作的快速引用。

本文基于 smtplib 实现邮件发送,其中的要点包括:同一编码问题(附件名称为中文)、收发件人昵称的设置、添加多附件等重点问题。以下是完整可用代码,亲测 ok ,大家可以参考使用!(代码中并没有太多的注释,为了保持整洁一点,这样自己复制的时候就不用有太多的修改)

完整代码如下:

  1. # -*- coding: utf-8 -*-
  2. from email import encoders
  3. from email.header import Header
  4. from email.mime.text import MIMEText
  5. from email.utils import formataddr
  6. from email.mime.multipart import MIMEMultipart
  7. from email.mime.base import MIMEBase
  8. import os
  9. import smtplib
  10.     
  11. class myEmail():
  12.     def __init__(self,config:dict):
  13.         self.from_addr = config['from_addr']
  14.         self.to_addr = config['to_addr']
  15.         self.cc_addr = config['cc_addr']
  16.         self.mailhost = config['mailhost']
  17.         self.password = config['password']
  18.         self.msg_subject = config['msg_subject']
  19.         self.msg_text = config['msg_text']
  20.         self.file_path = config['file_path']
  21.         self.is_smtp_ssl = config['is_smtp_ssl']
  22.         self.msg_text_type = 'html'
  23.      
  24.         if len(self.to_addr) <= 0:
  25.             return
  26.  
  27.     def send_email(self):
  28.         msg = MIMEMultipart()
  29.         msg['From'] = self._format_addr(self.from_addr)
  30.         msg['To'] = self._format_addr(self.to_addr)
  31.         if self.cc_addr is not None:
  32.             msg['Cc'] = self._format_addr(self.cc_addr)
  33.  
  34.         msg['Subject'] = Header(self.msg_subject, 'utf-8').encode()
  35.         msg.attach(MIMEText(self.msg_text, self.msg_text_type, 'utf-8'))  
  36.  
  37.         if self.file_path is not None and len(self.file_path) > 0:
  38.             msg = self.files(msg, self.file_path)
  39.  
  40.         smtp_server = self.mailhost
  41.         if self.is_smtp_ssl:
  42.             # 使用 smtp 协议以及 ssl 加密方式【推荐使用此方法】
  43.             port = 465
  44.             server = smtplib.SMTP_SSL(smtp_server, int(port), timeout=10.0)
  45.         else:
  46.             port = 25
  47.             server = smtplib.SMTP(smtp_server,port,timeout = 10.0)
  48.          
  49.         server.set_debuglevel(0)  # 设置 debug 级别 1:打印 0: 不打印
  50.         server.connect(smtp_server)  # 连接服务器
  51.         server.login(self.get_val(self.from_addr)[0], self.password)  # 登录发件人账号
  52.         if self.cc_addr is not None:
  53.             server.sendmail(
  54.                 self.get_val(self.from_addr)[0],
  55.                 self.get_val(self.to_addr) + self.get_val(self.cc_addr),
  56.                 msg.as_string()
  57.             )
  58.         else:
  59.             server.sendmail(
  60.                 self.get_val(self.from_addr)[0],
  61.                 self.get_val(self.to_addr),
  62.                 msg.as_string()
  63.             )
  64.         server.quit()
  65.  
  66.     def get_val(self,dic):
  67.         val = list(dic.values())
  68.         return val
  69.  
  70.     def _format_addr(self,dic):
  71.         addr_list = []
  72.         for name, addr in dic.items():
  73.             addr_list.append(formataddr((Header(name, 'utf-8').encode(), addr)))
  74.         return ','.join(addr_list)
  75.  
  76.     def files(self,msg, file_path):
  77.         for source_file,file_name in file_path.items():
  78.             if not os.path.exists(source_file):
  79.                 print(source_file,'不存在!')
  80.                 continue
  81.  
  82.             with open(source_file, 'rb') as f:
  83.                 mime = MIMEBase('application', 'octet-stream')
  84.                 # file_name 转 gbk, 否则附件带有中文名会有乱码
  85.                 mime.add_header(
  86.                     'Content-Disposition', 
  87.                     'attachment',
  88.                     filename = ('gbk', '', file_name)
  89.                 )
  90.                 mime.add_header('Content-ID', '<0>')
  91.                 mime.add_header('X-Attachment-Id', '0')
  92.                 mime.set_payload(f.read())  # 把附件的内容读进 mime
  93.                 encoders.encode_base64(mime)  # 用Base64编码
  94.                 msg.attach(mime)  # 添加到 MIMEMultipart 中
  95.  
  96.         return msg
  97. if __name__ == "__main__":
  98.      
  99.     from_addr = {
  100.         '马富天':'mafutian@bangbangas.com',
  101.     }
  102.  
  103.     to_addr = {
  104.         '马富天':'mafutian@bangbangas.com',
  105.         '马富天-126':'mafutian@126.com',
  106.     }
  107.  
  108.     cc_addr = {
  109.         '马富天-qq':'335134463@qq.com',
  110.     }
  111.  
  112.     mailhost = '******'
  113.     password = '******' # 密码或授权码
  114.     msg_subject = '邮件标题'
  115.     msg_text = '邮件正文内容'
  116.  
  117.     # 附件源文件地址及对应的名称
  118.     file_path = {
  119.         
  120.     }
  121.   
  122.     config = {
  123.         'from_addr':from_addr,
  124.         'to_addr':to_addr,
  125.         'cc_addr':cc_addr,
  126.         'mailhost':mailhost,
  127.         'password':password,
  128.         'msg_subject':msg_subject,
  129.         'msg_text':msg_text,
  130.         'file_path':file_path,
  131.         'is_smtp_ssl':True,
  132.     }
  133.   
  134.     my_email = myEmail(config = config)
  135.     my_email.send_email()
请输入图片名称

版权归 马富天个人博客 所有

本文标题:《python3 邮件发送(多收件人,多抄送人、多附件)》

本文链接地址:http://www.mafutian.com/441.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

2

0

上一篇《 linux 下 Python 脚本后台执行(nohup command &) 》 下一篇《 python 封装 mysql 自定义类 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多