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脚本
Feb 10 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
分析Python中解析构建数据知识
Jan 20 Python
Python实现求一个集合所有子集的示例
May 04 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
Python pymongo模块常用操作分析
Sep 01 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
Python用5行代码实现批量抠图的示例代码
Apr 14 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 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程序的国际化实现方法(利用gettext)
2011/08/14 PHP
php加密解密实用类分享
2014/01/07 PHP
php短网址和数字之间相互转换的方法
2015/03/13 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
JS获取Table中td值的方法
2015/03/19 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
js实现五星评价功能
2017/03/08 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
使用Python写个小监控
2016/01/27 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python如何删除文件中重复的字段
2019/07/16 Python
Apache部署Django项目图文详解
2019/07/30 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
Python os模块常用方法和属性总结
2020/02/20 Python
python属于解释型语言么
2020/06/15 Python
python中upper是做什么用的
2020/07/20 Python
python操作redis数据库的三种方法
2020/09/10 Python
红色旅游心得体会
2014/09/03 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
电工实训心得体会
2016/01/14 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
Python中的xlrd模块使用整理
2021/06/15 Python