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递归查询菜单并转换成json实例
Mar 27 Python
python生成圆形图片的方法
Mar 25 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
Python选择网卡发包及接收数据包
Apr 04 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 Python
python 5个顶级异步框架推荐
Sep 09 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 Python
python基于turtle绘制几何图形
Jun 15 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 Python
python blinker 信号库
May 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
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP中的session安全吗?
2016/01/22 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
php intval函数用法总结
2019/04/14 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
公众号SVG动画交互实战代码
2020/05/31 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
python中强大的format函数实例详解
2018/12/05 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
一份报关员的职业规划范文
2014/01/08 职场文书
网络研修随笔感言
2014/02/17 职场文书
邓小平理论心得体会
2014/09/09 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
Python爬取某拍短视频
2021/06/11 Python
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
MySQL的存储过程和相关函数
2022/04/26 MySQL
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang