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解析xml成对应的html示例分享
Apr 02 Python
Python的多态性实例分析
Jul 07 Python
实例讲解Python中函数的调用与定义
Mar 14 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
python保存数据到本地文件的方法
Jun 23 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
python用match()函数爬数据方法详解
Jul 23 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
Python求凸包及多边形面积教程
Apr 12 Python
python实现五子棋程序
Apr 24 Python
python3实现常见的排序算法(示例代码)
Jul 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 skymvc 一款轻量、简单的php
2011/06/28 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
python的faker库用法
2019/11/28 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
建龙钢铁面试总结
2014/04/15 面试题
中专生学习生活的自我评价分享
2013/10/27 职场文书
前台接待岗位职责
2013/12/03 职场文书
毕业自荐信
2013/12/16 职场文书
自我评价范文分享
2014/01/04 职场文书
接受捐赠答谢词
2014/01/27 职场文书
《春笋》教学反思
2014/04/15 职场文书
骨干教师考核评语
2014/12/31 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
写给老师的保证书
2015/05/09 职场文书
Vue h函数的使用详解
2022/02/18 Vue.js
最新最全的手机号验证正则表达式
2022/02/24 Javascript