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合并文本文件示例
Feb 07 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
python实现LRU热点缓存及原理
Oct 29 Python
python标准库os库的函数介绍
Feb 12 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
JavaScript中的关联数组问题
2015/03/04 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
Python玩转Excel的读写改实例
2019/02/22 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
Python FFT合成波形的实例
2019/12/04 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
歌唱比赛策划方案
2014/06/06 职场文书
全陪导游词
2015/02/04 职场文书
redis限流的实际应用
2021/04/24 Redis
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Pyhton模块和包相关知识总结
2021/05/12 Python