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实现比较两段文本不同之处的方法
May 30 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
对python3 urllib包与http包的使用详解
May 10 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
在python中使用with打开多个文件的方法
Jan 07 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
Python读取JSON数据操作实例解析
May 18 Python
python代码如何注释
Jun 01 Python
Django如何实现防止XSS攻击
Oct 13 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
Symfony学习十分钟入门经典教程
2016/02/03 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python的多态性实例分析
2015/07/07 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
python队列queue模块详解
2018/04/27 Python
pandas值替换方法
2018/07/10 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
应届生自我鉴定
2013/12/11 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
党校学习自我鉴定
2014/02/24 职场文书
元宵节主持词
2014/03/25 职场文书
感恩节活动策划方案
2014/05/16 职场文书
《为人民服务》教学反思
2016/02/20 职场文书