Python自动化小技巧14——自动批量发送邮件(带各种附件)

案例背景

我的博客下面评论都是各种要数据的......一个一个发其实很浪费时间的,每次输入评论者的邮箱,然后打开数据所在的文件夹,上传,填写标题正文,发送.......

一模一样的流程,所以这种重复性的劳动肯定要用Python来解决了。


准备

这次代码主要依赖email库,这个库应该不用下载,Python自带。

当然想要你的邮箱能被代码运行,首先你得准备配置一下你的邮箱。

例如QQ邮箱,打开设置:

然后找到账户页面下的SMTP服务

 

把pop3/SMTP这个服务打开。

当然还需要手机短信验证啥的,不过应该不难。

开了服务后会得到一个类似于密码一样的一串字母,这是授权码,在代码里面你得输入才能登陆到邮箱上去。


 代码实现

这里导包,然后输入自己的邮箱,要发的人的邮箱,可以是列表,就实现了群发:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication 
from email.header import Header
fromaddr = '22********@qq.com'
password = '********'
toaddrs = ['2717*****6@qq.com', '22******61@qq.com']
content = '可以的麻烦点赞关注一下,谢谢啦.'
textApart = MIMEText(content)
k=7

kind_d={1:'二手车',2:'网飞影视',3:'天气聚类',4:'经济增长',5:'外卖文本分类',6:'文本十分类',7:'泰坦尼克号'}
kind=kind_d[k]

我把我的邮箱和密码都*号打码了 ,要用的输入你们自己的邮箱(fromaddr)和授权码(password),还有接受目标的邮箱(toaddrs)就行。

content是邮件正文,字符串,可以自己改。

至于下面的k=7,kind_d字典,  kind,这是我用来选择发哪些附件的变量选择....有的人评价要二手车数据,有的评论要网飞影视数据.....我赋值k就改变了kind,然后对kind进行条件判断,来选择我要发送的附件:

if kind=='二手车':
    File = 'D:\\AAA最近要用\\数学建模\\21MathorCup挑战杯\\2021年MathorCup大数据竞赛赛道A\\附件\\附件1:估价训练数据.txt'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='附件1:估价训练数据.txt')
    File1 = 'D:\AAA最近要用\\数学建模\\21MathorCup挑战杯\\2021年MathorCup大数据竞赛赛道A\\附件\\附件2:估价验证数据.txt'
    Apart1 = MIMEApplication(open(File1, 'rb').read())
    Apart1.add_header('Content-Disposition', 'attachment', filename='附件2:估价验证数据.txt')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m.attach(Apart1)
    m['Subject'] = kind

elif kind=='网飞影视':
    File = 'D:\\AAA最近要用\\接单项目\\网飞电影\\netflix_titles.csv'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='netflix_titles.csv')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m['Subject'] = kind

elif kind=='天气聚类':
    File = 'D:\\AAA最近要用\\接单项目\\天气\\天气数据.zip'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='天气数据.zip')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m['Subject'] = kind
elif kind=='经济增长':
    File = 'D:\\AAA最近要用\\接单项目\\00熟人\\姜珮瑶经济增长\\实证\\data.xlsx'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='data.xlsx')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m['Subject'] = kind
elif kind=='外卖文本分类':
    File = 'D:\\AAA最近要用\\深度学习\\自己的项目\\中文情感分类\\外卖.xlsx'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='外卖.xlsx')
    File1 = 'D:\\AAA最近要用\\深度学习\\自己的项目\\中文情感分类\\stopwords.txt'
    Apart1 = MIMEApplication(open(File1, 'rb').read())
    Apart1.add_header('Content-Disposition', 'attachment', filename='stopwords.txt')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m.attach(Apart1)
    m['Subject'] = kind
elif kind=='文本十分类':
    File = 'D:\\AAA最近要用\\深度学习\\自己的项目\\中文情感分类\\十分类文本.xlsx'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='十分类文本.xlsx')
    File1 = 'D:\\AAA最近要用\\深度学习\\自己的项目\\中文情感分类\\stopwords.txt'
    Apart1 = MIMEApplication(open(File1, 'rb').read())
    Apart1.add_header('Content-Disposition', 'attachment', filename='stopwords.txt')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m.attach(Apart1)
    m['Subject'] = kind
elif kind=='泰坦尼克号':
    File = 'D:\\AAA最近要用\\kaggle\\泰坦尼克号\\train.csv'
    Apart = MIMEApplication(open(File, 'rb').read())
    Apart.add_header('Content-Disposition', 'attachment', filename='train.csv')
    File1 = 'D:\\AAA最近要用\\kaggle\\泰坦尼克号\\test.csv'
    Apart1 = MIMEApplication(open(File1, 'rb').read())
    Apart1.add_header('Content-Disposition', 'attachment', filename='test.csv')
    m = MIMEMultipart()
    m.attach(textApart)
    m.attach(Apart)
    m.attach(Apart1)
    m['Subject'] = kind

当然如果你不需要判断发什么附件就直接拿出一段用就行。

要加很多附件可以写循环。

File是文件路径,后面用MIMEApplication读取,然后生成MIMEMultipart类命名为m,后面再对m添加正文,附件。

无论什么类型的附件(常用的txt,xlsx,docx,压缩包等)都可以,在File里面给出它的绝对路径就行。

然后再对m添加发送人,接收人,成功了就打印,没成功就打印报错信息。

m['From'] = Header(fromaddr)
m['To'] = Header(",".join(toaddrs))
try:
    server = smtplib.SMTP('smtp.qq.com')
    server.login(fromaddr,password)
    server.sendmail(fromaddr, toaddrs, m.as_string())
    print('success')
    server.quit()
except smtplib.SMTPException as e:
    print('error:',e) 

然后就完成了这个脚本编写。

以后我输入收件人邮箱和我要发送的附件编号,就能自动发邮件了。给各位评价要数据的同学们更加迅速的服务~