python批量发送邮件--包括批量不同附件

Python011

python批量发送邮件--包括批量不同附件,第1张

小猪在公司做出纳,干的活却包括了出纳、会计、结算专员等工作,周末都要被无奈在家加班,主要还没有加班费,简直是被公司严重压榨。每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。

一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,默默的回来写了这个脚本。

所以,设计要点就是一个字——

恩,就酱。

经过我观察,邮件内容分为两种,这里先说第一种,“结算款”:

(1) 邮件内容(content)不变,为固定的txt文本

(2) 附件(attch)为每个工长的结算账单(excel文件.xlsx),此文件命名为总账单中自动分割出来的名字(暂时不懂怎么分割出来的=.=),格式为:

(3) 邮件主题(Subject)为附件名(不带后缀名)

(4) 邮件接收对象(工长)的名单及其邮箱地址基本不变,偶尔变动

(5)

(1) 将工长及其邮箱地址存为CSV文件的两列,python中将其读取为字典形式,存储以供后续查询邮箱地址。

(2) 遍历文件夹中的附件(.xlsx类型文件),对其进行两种操作,一方面将其名字(不带路径和后缀)提取出来,作为邮件主题(Subject),并对Subject进一步划分,得到其中的人名(工长);另一方面,将其传入MIMEbase模块中转为邮件附件对象。

(3) 由上述得到的人名(name),在字典形式的通讯录中,查找相应的地址(value),即为收件人名称和地址

(4) 利用python中的email模块和smtp模块,登录自己的邮箱账号,再对每个附件,得到的收件人名和地址,添加附件,发送邮件。done

在设计过程中有几点需要注意

(1) 有时一个邮件地址对应两个人名,此时应该在CSV文件中分为两行存储,而不是将两个人名存为同一个键;

(2)有账单.xlsx文件,通讯录里却没存储此人记录,程序应该打印提示没有通讯记录的人名,且不能直接退出,要保证员工看到此提示,此第一版程序还有解决此问题;

(3)此程序发送的邮件内容为纯文本,若要求邮件内容有不同格式(如部分加粗,部分红色),还有小部分需要每次更改的地方(如邮件内容包含当前月份),如何解决?(这就是第二种邮件内容,“预算款”);

(4)重名的,暂时还没碰到,程序中也没给出解决方案。

第一版到此,20180830,待更新

第二版更新,20180904

第三版更新,20180909

转战CSDN博客,更多博客见传送门《 xiaozhou的博客主页 》

1、发送邮件:

import zmail

server = zmail.server(' [email protected] ’, 'yourpassword')

server.send_mail(' [email protected] ',{'subject':'Hello!','content_text':'By zmail.'})

server.send_mail([' [email protected] ',' [email protected] '],{'subject':'Hello!','content_text':'By zmail.'})

2、接收最后一封邮件:

import zmail

server = zmail.server(' [email protected] ’, 'yourpassword')

latest_mail = server.get_latest()

zmail.show(latest_mail)

3、发送带附件的邮件:

import zmail

mail = {

'subject': 'Success!', # Anything you want.

'content_text': 'This message from zmail!', # Anything you want.

'attachments': ['/Users/zyh/Documents/example.zip','/root/1.jpg'], # Absolute path will be better.

}

server = zmail.server(' [email protected] ’, 'yourpassword')

server.send_mail(' [email protected] ', mail)

server.send_mail([' [email protected] ',' [email protected] '], mail)

4、发送html格式邮件:

with open('/Users/example.html','r') as f:

content_html = f.read()

mail = {

'subject': 'Success!', # Anything you want.

'content_html': content_html,

'attachments': '/Users/zyh/Documents/example.zip', # Absolute path will be better.

}

server.send_mail(' [email protected] ',mail)

5、使用抄送:

server.send_mail([' [email protected] ',' [email protected] '],mail,cc=[' [email protected] '])

6、自定义server

server = zmail.server('username','password',smtp_host='smtp.163.com',smtp_port=994,smtp_ssl=True,pop_host='pop.163.com',pop_port=995,pop_tls=True)

7、根据ID取回邮件:mail = server.get_mail(2)

根据日期、主题、发送人取回邮件:

mail = server.get_mails(subject='GitHub',after='2018-1-1',sender='github')

mail = server.get_mails(subject='GitHub',start_time='2018-1-1',sender='github',start_index=1,end_index=10)

8、查看邮箱统计

mailbox_info = server.stat() #结果为包含两个整型的元组: (邮件的数量, 邮箱的大小).

9、删除邮件:MailServer.delete(which)

10、保存附件:zmail.save_attachment(mail,target_path=None,overwrite=False)

11、保存邮件:zmail.save(mail,name=None,target_path=None,overwrite=False)

12、读取邮件:zmail.read(file_path,SEP=b'\r\n')

支持的列表:

准备工作:安装第三方包,yagmail和keyring

安装完成后,打开命令提示符窗口(我用的是win)。输入python回车,输入import yagmail回车,输入yagmail.register('你的邮箱地址','邮箱密码或邮箱安全码')回车。没有报错后,就可以开始编写python脚本了。

直接上脚本:

import yagmail

smtp_server=yagmail.SMTP(user='[email protected]',host='smtp.qq.com')

#host 需要你到邮箱首页帮助中心找一下,一般都是smtp.xxxx.com

contents=['邮件正文内容,可以逗号分开多写几行,也可以用转行符号!']

smtp_server.send('[email protected]','邮件主题描述',contents)

# [email protected]收件邮箱地址,可以设置成一样的,测试一下自己能收到不。

执行上面的脚本,基本上就可以收到邮件了。不要执行多次,太频繁,容易被服务器拦截,最后可能会被封号。

另外 contents 里可以写html,也可以放附件,附件的话直接写个本机文件路径即可。