python 小白之群发邮件下篇

    科技2022-07-10  134

    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('请输入收件邮箱:')

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

    设置一个列表形式的变量用while循环调用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(),步骤是:

    引入csv模块;提供需要写入csv文件的数据,建文件并写入。 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]

    啊~今日早更完,晚安

    Processed: 0.024, SQL: 8