python实现自动发送邮件发送多人、群发、多附件的示例


Posted in Python onJanuary 23, 2018

1、最近公司实现部分数据统计、分析的报表进行每天定时发送到相关人员的邮箱之中的配置代码被人为删除了,需要重新恢复该功能,由于原先是在linux上使用shell配置发送,实在是太繁琐,所以准备使用python来实现该功能,不过发现网上各种文档都是未经过整理,代码写的很不友善,比如发送多人的只能发送前一个邮箱,附件写死不灵活等等,故特写一遍比较记录。

主要会遇到的几个问题:

      1、smtplib.SMTPAuthenticationError: (550, b'User has no permission')

      2、smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')

             这两个错误是你的密码用的不是授权码导致,授权码生成自行百度。

      3、554 DT:SPM 163 smtp5

这属于网易邮箱的一个退回检测机制导致,貌似跟发送比较频繁有关,我再发送的时候有遇到过,直到添加了一个网易邮箱作为收件箱之后才能发送成功,不知道是不是这个原因导致,具体原因未知,如果有人知道请在私信或者评论下告知,谢谢!!

前期准备查看系统上python版本号:

python实现自动发送邮件发送多人、群发、多附件的示例

显示如图表示已经安装好了。

2、实现代码如下(这是在Windows上的IDEL下编辑测试代码,linux上只有改下附件路径就好了)

# -*- coding: utf-8 -*-
from email import encoders
import os
import traceback
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# 中文处理
def _format_addr(s):
 name, addr = parseaddr(s)
 return formataddr((Header(name, 'utf-8').encode(), addr))
def send_email(to_addr_in,filepath_in):
 # 邮件发送和接收人配置
 from_addr = '*******@163.com'
 smtp_server = 'smtp.163.com'
 password = '********' #这是你邮箱的第三方授权客户端密码,并非你的登录密码
 to_addr = to_addr_in
 to_addrs = to_addr.split(',')
 msg = MIMEMultipart()
 msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)  # 显示的发件人
 # msg['To'] = _format_addr('管理员 <%s>' % to_addr)    # 单个显示的收件人
 msg['To'] = ",".join(to_addrs)         # 多个显示的收件人
 msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()  # 显示的邮件标题
 # 需要传入的路径
 # filepath = r'D:\test'
 filepath = filepath_in
 r = os.path.exists(filepath)
 if r is False:
  msg.attach(MIMEText('no file...', 'plain', 'utf-8'))
 else:
  # 邮件正文是MIMEText:
  msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
  # 遍历指定目录,显示目录下的所有文件名
  pathDir = os.listdir(filepath)
  for allDir in pathDir:
   child = os.path.join(filepath, allDir)
   print child.decode('gbk') # .decode('gbk')是解决中文显示乱码问题
   # 添加附件就是加上一个MIMEBase,从本地读取一个文件
   with open(child, 'rb') as f:
    # 设置附件的MIME和文件名,这里是txt类型:
    mime = MIMEBase('file', 'xls', filename=allDir)
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename=allDir)
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)
 try:
  server = smtplib.SMTP(smtp_server, 25)
  # server.starttls()
  server.set_debuglevel(1) # 用于显示邮件发送的执行步骤
  server.login(from_addr, password)
  # print to_addrs
  server.sendmail(from_addr, to_addrs, msg.as_string())
  server.quit()
 except Exception, e:
  print "Error: unable to send email"
  print traceback.format_exc()
if __name__ == '__main__':
 send_email('*******@qq.com,*******@163.com','D:\\test')

3、在 PyCharm 里面执行结果如下

python实现自动发送邮件发送多人、群发、多附件的示例

显示邮件已经发送成功了,可在相应的邮箱里面查看,相应的文件夹下存在附件文本

python实现自动发送邮件发送多人、群发、多附件的示例

如果不存在附件文本(这是截图的网易邮箱,上面截图的是QQ邮箱表示两个邮箱都已经收到邮件):

python实现自动发送邮件发送多人、群发、多附件的示例

以上这篇python实现自动发送邮件发送多人、群发、多附件的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Windows和Linux下Python输出彩色文字的方法教程
May 02 Python
书单|人生苦短,你还不用python!
Dec 29 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
Python socket非阻塞模块应用示例
Sep 12 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
python编写微信公众号首图思路详解
Dec 13 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
pandas的resample重采样的使用
Apr 24 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python进程间的通信之语法学习
Apr 11 Python
python正则表达式面试题解答
Apr 28 #Python
Django中使用celery完成异步任务的示例代码
Jan 23 #Python
python3 发送任意文件邮件的实例
Jan 23 #Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 #Python
Python实现PS图像明亮度调整效果示例
Jan 23 #Python
matplotlib绘图实例演示标记路径
Jan 23 #Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
Jan 23 #Python
You might like
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Python解析json文件相关知识学习
2016/03/01 Python
python 队列详解及实例代码
2016/10/18 Python
python实现k-means聚类算法
2018/02/23 Python
python进行文件对比的方法
2018/12/24 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
小组合作学习反思
2014/02/18 职场文书
企业趣味活动方案
2014/08/21 职场文书
银行贷款收入证明
2014/10/17 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
团结友爱主题班会
2015/08/13 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA