python给指定csv表格中的联系人群发邮件(带附件的邮件)


Posted in Python onDecember 31, 2019

以下为使用python给指定路径的csv表格中的联系人群发带附件的邮件(csv表格的第一列为联系人姓名,第二列为联系人邮箱账号)的代码,详情见注释。

import time
import csv #用于读取收件人列表
import smtplib #用于发送邮件
from email.header import Header #Header用于构造邮件头
from email.mime.text import MIMEText #MIMEText用于构造文本邮件
from email.mime.image import MIMEImage #MIMEImage用于构造图片邮件
from email.mime.multipart import MIMEMultipart #MIMEMultipart用于构造复杂邮件(带附件的邮件)
#收件人信息创建
def receive_info():
  # 可以是一个列表,支持多个邮件地址同时发送,测试改成自己的邮箱地址
  to_addrs = []
  #to = input('请输入收件人邮箱:')
  with open('收件人邮箱.csv','r',encoding='utf-8') as f:
    reader = csv.reader(f)
    try:
      for row in reader:
        to_addrs.append(row[1])
      print('收件人信息读取完毕!')
      time.sleep(1)
      print('以下为收件人邮箱列表:\n',to_addrs)
      receivers = ','.join(to_addrs)
    except Exception as e:
      print('读取收件人信息失败!原因如下:')
      print(e)
  return to_addrs,receivers
#发件人信息创建
def send_info():
  print('开始输入发件人信息...')
  time.sleep(1)
  try:
    sender_mail = input('请输入发件人邮箱:')
    sender_pass = input('请输入发件人邮箱授权码(不要加空格):')#同样是乱打的
    smtp_server = 'smtp.qq.com' #邮箱服务器
    time.sleep(1)
    print('发件人信息录入成功!')
  except Exception as e:
    print('发件人信息输入失败!以下为失败原因:')
    print(e)
  return sender_mail,sender_pass,smtp_server
#构造邮件
def mail_body(to):
  # 设置总的邮件体对象,对象类型为mixed,可以构造带附件的复杂邮件
  msg_root = MIMEMultipart('mixed')
  # 邮件添加的头尾信息等
  msg_root['From'] = Header(sender_mail)
  msg_root['To'] = Header(receivers) #Header的参数不能为列表
  # 邮件的主题,显示在接收邮件的预览页面
  subject = 'python sendemail test successful'
  msg_root['subject'] = Header(subject, 'utf-8') #第一个参数为邮件主题,第二个参数为编码方式
  # 构造正文文本内容
  text_info = 'hello world'
  text_sub = MIMEText(text_info, 'plain', 'utf-8') #第一个参数为文本内容,第二个参数为格式(‘plain'为纯文本,第三个参数为编码方式)
  msg_root.attach(text_sub)
  # 构造超文本附件
  url = "https://blog.csdn.net/m0_45654959"
  html_info = """
  <p>点击以下链接,你会去向一个更大的世界</p>
  <p><a href="%s" rel="external nofollow" >click me</a></p>
  <p>i am very galsses for you</p>
  """% url
  html_sub = MIMEText(html_info, 'html', 'utf-8') #超文本邮件体
  # 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示
  html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"' #将超文本邮件体作为附件
  # 把构造的内容(超文本附件)写到邮件体中
  msg_root.attach(html_sub)
  # 构造图片附件
  image_file = open(r'D:\Anaconda\programm_my\little_programm\test.gif', 'rb').read()
  image = MIMEImage(image_file) #图片邮件体
  image.add_header('Content-ID', '<image1>') #将图片在邮件中的目录ID设为<image1>,只有一张图片时此句可以省略
  # 如果不加下边这行代码的话,会在收件方方面显示乱码的bin文件,下载之后也不能正常打开
  image["Content-Disposition"] = 'attachment; filename="hua_ji.gif"'
  #把构造的内容(图片附件)写入邮件体当中
  msg_root.attach(image)
  # 构造文本附件(base64数据流)
  txt_file = open(r'D:\Anaconda\programm_my\little_programm\hello_word.txt', 'rb').read()
  txt = MIMEText(txt_file, 'base64', 'utf-8')
  txt["Content-Type"] = 'application/octet-stream' #Content-Type默认为application/octet-stream,此句可以不加
  #以下代码可以重命名附件为hello_world.txt 
  txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')
  #把构造的内容(文本附件)写入邮件体当中
  msg_root.attach(txt)
  return msg_root
#邮件发送函数
def send_mail():
  time.sleep(1)
  print('开始发送邮件...')
  try:
    server =smtplib.SMTP_SSL(smtp_server)#QQ邮箱采用SSL方式加密;仅在python3.7中才需要给smtplib.SMPT_SSL()方法传入发件人邮箱地址参数
    server.connect(smtp_server,465)
    server.login(sender_mail, sender_pass)
    server.sendmail(sender_mail, to_addrs, msg.as_string())
    server.quit()
    print('恭喜你!邮件发送成功!')
  except Exception as e:
    print('邮件发送失败!以下为失败原因:')
    print(e)
#主函数:
def main():
  send_mail()
if __name__ == '__main__':
  #初始化收件人、发件人、邮件体数据
  to_addrs,receivers = receive_info()
  sender_mail,sender_pass,smtp_server = send_info()
  msg = mail_body(to_addrs)
  #调用主函数,发送邮件
  main()

总结

以上所述是小编给大家介绍的python给指定csv表格中的联系人群发邮件,希望对大家有所帮助!

Python 相关文章推荐
python使用百度翻译进行中翻英示例
Apr 14 Python
八大排序算法的Python实现
Jan 28 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
python轮询机制控制led实例
May 03 Python
Python grequests模块使用场景及代码实例
Aug 10 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Python中递归以及递归遍历目录详解
Oct 24 Python
Python面向对象封装操作案例详解
Dec 31 #Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 #Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 #Python
Pycharm最新激活码2019(推荐)
Dec 31 #Python
python ftplib模块使用代码实例
Dec 31 #Python
深入了解如何基于Python读写Kafka
Dec 31 #Python
Python面向对象之继承原理与用法案例分析
Dec 31 #Python
You might like
用PHP生成自己的LOG文件
2006/10/09 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
代码详解django中数据库设置
2019/01/28 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
电厂厂长岗位职责
2014/01/02 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
写字楼租赁意向书
2014/07/30 职场文书
教师先进个人材料
2014/12/17 职场文书
骨干教师申报材料
2014/12/17 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL