python 小白之群发邮件下篇

2020年10月3日 大风大雨,一夜入冬了
试着对扩大你所接触的人的视野,你将会发现同时也扩大了你自己对生命的展望

我记得老科说过一句话,其他任何人对我的期待再怎么高,也高不过我对自己的期望(共勉)

昨天晚上和老妈聊了职业规划,现实与无价的梦想
体制内不好进,但是也愿意一试,各有优劣,就是昨天改bug时脑仁疼,不知道什么时候是个头,突然有的想法,我热爱我的家乡华中地区,但是我若选择新疆或者境外,这种工作地点,父母同样能陪伴和移居,那种毅然决然真的很感动

我是希望自己有进体制内的果敢,也有离开体制内的能力
我在忙
忙着给30岁的自己准备礼物

接昨天未解决的问题
如果你的Python版本是3.7,很可能发生这种报错。因为Python 3.7修改了ssl.py,导致smtplib.SMTP_SSL也连带产生了问题,
可使用下列代码解决

# 改动这句代码
server = smtplib.SMTP_SSL()

# 在括号内加入host参数
server = smtplib.SMTP_SSL(smtp_server)

加入host参数后,这个问题应该就迎刃而解了
如果你用的是QQ以外的其他邮箱,也可能会出现一种报错
比如利用我的企业邮箱的话,就会出现如下报错信息:smtplib.SMTPException: No suitable authentication method found搜索后,
我们很快就会发现,解决方案是:在登录(login)之前调用starttls()方法就可以了。也就是在代码中加入这样一行:

server.starttls()

接下来,丰富一下邮件内容
邮件头(header,没错它也叫header)是这一块区域,包括主题、发件人、收件人等信息:

from email.header import Header

msg['From'] = Header('from address')
msg['To'] = Header('to adress')
msg['Subject'] = Header('happy new year')

当正文需要换行时

text= nice to meet you, and ,,,,,,,a long story
msg=(text,'plain','utf-8')

出于保护隐私的目的,我们可以把收发件人,和授权码这些信息用input()变成需要输入的模式
例如

# 发信方的信息:发信邮箱,QQ邮箱授权码)
from_addr = input('请输入登录邮箱:')
password = input('请输入邮箱授权码:')

# 收信方邮箱
to_addr = input('请输入收件邮箱:')

当你已经获得完整发送邮件的技能
接下来就要考虑群发邮件啦
主要有三种群发方式

  1. 设置一个列表形式的变量
  2. 用while循环
  3. 调用CSV模块

一,是将收件人信箱的变量设置成一个可以装多个内容的列表:

to_addrs = ['wufeng@qq.com','kaxi@qq.com']

需要注意的是,to_addrs变量也将作为参数被传入Header方法中:

msg['To'] = Header(to_addrs)

直接运行程序的话会发生报错
因为Header接受的第一个参数的数据类型必须要是字符串或者字节(bytes或者str),列表不能解码
所以这里将“to_addrs”变成一个字符串

msg['to']=Header(",".join(to_addrs))

join()函数,它的功能是把字符串合并

join()的用法是str.join(sequence),str代表在这些字符串之中你要用什么字符串来连接,你可以用逗号,空格,下划线等等。要将列表的元素合并,当然我们就直接使用逗号来连接了

to_addrs = ['wufeng@qq.com','kaxi@qq.com']
print(type(['wufeng@qq.com','kaxi@qq.com']))
print(type(",".join(to_addrs)))

第二种方法是采用询问“是否继续输入邮箱地址”的方式,并用while循环来实现多个收件人的功能。
由于我们要存储输入的内容,供发邮件的时候使用。所以需要定义一个空列表to_addrs,用来存放收件人邮箱地址。
输入邮箱地址的时候,地址会被追加写进列表。
因为循环次数不固定,所以我们选择while循环来做。我的这段代码是这样的,加了一个print()函数来确认结果:

to_addrs=[]
while True:
         a=input('12345678@qq.com')
         to_addrs.append(a)
         b=input('是否继续输入,n退出,任意键继续')
         if b=='n':10
            break
print(to_addrs)

第三种方法
将收件人邮箱写入csv文件,在发邮件时读取csv文件

将邮箱地址写入csv模块的方法是write(),步骤是:

  1. 引入csv模块;
  2. 提供需要写入csv文件的数据,
  3. 建文件并写入。
import csv
data=[['zhenzhen','zhenzhen.qq.com'],['haohao','haohao.qq.com']]
with open('to_addrs.csv','w',newline=' ') as f:
     writer=csv.writer(f)
     for row in data:
          writer.writerow(row)

第一行,引入模块。第四行是等待写入csv文件的数据。但是我们没有这样的文件,所以还需要新建一个to_addrs.csv文件。
我们使用的是with语句新建文件,这样做的好处是:到达语句末尾时,会自动关闭文件,不需要close()。紧接着,我们定义了一个变量writer进行写入,将刚才的文件变量传进来。之后就是进行数据写入,写入的方法是writerow()。
通过遍历列表data将数据一行行写到了to_addrs.csv文件中。

with open('to_addrs.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader: 
        to_addrs=row[1]

啊~今日早更完,晚安

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值