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 相关文章推荐
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
Django保护敏感信息的方法示例
May 09 Python
Python跳出多重循环的方法示例
Jul 03 Python
Django上线部署之IIS的配置方法
Aug 22 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 Python
Python利用folium实现地图可视化
May 23 Python
Python保存并浏览用户的历史记录
Apr 29 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
WHOIS类的修改版
2006/10/09 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
Python脚本实现虾米网签到功能
2016/04/12 Python
python如何对实例属性进行类型检查
2018/03/20 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
基于python代码批量处理图片resize
2020/06/04 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
个人自荐书
2013/12/20 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
国家助学金感谢信
2015/01/21 职场文书
学习党章心得体会2016
2016/01/15 职场文书
php引用传递
2021/04/01 PHP