python发送多人邮件没有展示收件人问题的解决方法


Posted in Python onJune 21, 2019

背景:

工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人

问题:

使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容

问题代码示例:

# -*- coding:utf-8 -*-
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
 
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
 server = 'mail.****.com'
 user = '*****'
 password = '********'
 
 strFrom = fromAdd
 strTo = toAdd
 
 msgRoot = MIMEMultipart('related')
 msgRoot['Subject'] = subject
 msgRoot.preamble = 'This is a multi-part message in MIME format.'
 
 msgAlternative = MIMEMultipart('alternative')
 msgRoot.attach(msgAlternative)
 
 msgText = MIMEText(html_text, 'html', 'utf-8')
 msgAlternative.attach(msgText)
 
 smtp = smtplib.SMTP()
 smtp.connect(server)
 smtp.login(user, passwd)
 
 att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
 att5["Content-Type"] = 'application/octet-stream'
 att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
 msgRoot.attach(att5)
 
 smtp.sendmail(strFrom, strTo, msgRoot.as_string())
 smtp.quit()
 return

成功代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr
from email.utils import formataddr
from email.header import Header
 
 
def __format_addr__(addr):
 # 解析邮件地址,以保证邮有别名可以显示
 alias_name, addr = parseaddr(addr)
 # 防止中文问题,进行转码处理,并格式化为str返回
 return formataddr((Header(alias_name,charset="utf-8").encode(),
      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
 
 
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
 
 SERVER = 'mail.***.com'
 USER = '******'
 PASSWD = '***'
 
 strFrom = __format_addr(fromAdd)
 
 strTo = list()
 # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
 try:
  for a in toAdd:
   strTo.append(__format_addr(a))
 except Exception as e:
  # 没有对a和toadd进行type判断,出错就直接还原
  strTo = toAdd
 
 msgRoot = MIMEMultipart('related')
 msgRoot.preamble = 'This is a multi-part message in MIME format.'
 
 msgAlternative = MIMEMultipart('alternative')
 msgRoot.attach(msgAlternative)
 
 # 邮件对象 
 msgText = MIMEText(html_text, 'html', 'utf-8')
 msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
 msgRoot['From'] = strFrom  # 发件人也是被格式化过的
 msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
 msgAlternative.attach(msgText)
 
 smtp = smtplib.SMTP(SERVER, 11)
 smtp.set_debuglevel(0)
 # smtp.connect(SERVER)
 smtp.login(USER, PASSWD)
 # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
 smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
 smtp.quit()

总结:

看到 msgRoot['to'] = ','.join(strTo)  与  msgRoot['to'] = strTo

实验过程中发现这个["to"]一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”

同时也发现["to"]的数据类型与sendmail(from_addrs,to_addrs,...)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型

还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,["From"]、["to"]等这些属性给谁都行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
Django 如何获取前端发送的头文件详解(推荐)
Aug 15 Python
python导出hive数据表的schema实例代码
Jan 22 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
Python使用Pandas库常见操作详解
Jan 16 Python
在Python中通过threshold创建mask方式
Feb 19 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 #Python
django框架使用orm实现批量更新数据的方法
Jun 21 #Python
python字典改变value值方法总结
Jun 21 #Python
python如何以表格形式打印输出的方法示例
Jun 21 #Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 #Python
对pyqt5之menu和action的使用详解
Jun 20 #Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 #Python
You might like
php获得文件扩展名三法
2006/11/25 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python实现翻转数组功能示例
2018/01/12 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
python 实现波浪滤镜特效
2020/12/02 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
Ibatis如何调用存储过程
2015/05/15 面试题
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
经销商订货会主持词
2014/03/27 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
国情备忘录观后感
2015/06/04 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
初中体育教学随笔
2015/08/15 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技