python获取邮件
1. python 收取邮件都是乱码。
一般邮件在传输的时候都会被编码,图中的是base64编码的特征,这类编码是可逆的,只需要进行base64解码即可,python有个base64模块,可以用来编码和解码。
2. python批量发送邮件--包括批量不同附件
小猪在公司做出纳,干的活却包括了出纳、会计、结算专员等工作,周末都要被无奈在家加班,主要还没有加班费,简直是被公司严重压榨。每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。
一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,默默的回来写了这个脚本。
所以,设计要点就是一个字—— 懒 。
恩,就酱。
经过我观察,邮件内容分为两种,这里先说第一种,“结算款”:
(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的博客主页 》
3. 如何使用python电子邮件获取解码附件文件
import email.utils
msg = email.message_from_string(self.request.body)
部分配渗族在msg.walk()中:
ctype = part.get_content_type()
如喊核果['image / jpeg',培弊'image / png']中的ctype为
image_file = part.get_payload(decode = True)
image_file_name = part。 get_filename()
4. Python脚本也可以用来发送电子邮件
准备工作:安装第三方包,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,也可以放附件,附件的话直接写个本机文件路径即可。
5. python 使用zmail收发电子邮件
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')
支持的列表:
6. python对outlook邮件读取
鉴于周报都要读取不同邮件内容,想定时运行便于操作。
一些相关性质记录:
写邮件:
尚存问题:
2.附件没法直接读取,要保存后再读取,尚需探索。
7. python电子邮件系列(三)之POP接收邮件
由上篇文章我们已经得知邮件从发送到接收的过程:
发件人->MUA->MTA->若干MTA->MDA->MUA->收件人
本节接收邮件主要就是编写一个 MUA 客户端,从 MDA 将邮件取回本地。
收取邮件最常用的是 POP协议 ,目前版本是第三版,也称 POP3 。python内置了 poplib 模块,支持POP3协议。
回想上一节 SMTP ,我们对要发送的邮件内容进行了各种编码,包括添加MIME header,编码之后再进行发送。
因此,我们通过POP3协议接收的也不是原内容,而是经过一系列编码等处理的文本。
所以,要想把POP3收取的文本变为可阅读的邮件对象,就需要利用 email 模块对原始邮件进行解析。
所以,邮件收取的流程就是:
由上一篇 文章 最后总结部分可知。邮件由字符到发送到网络经历了如下的格式转化:
纯文本:
str->bytes->base64->str->bytes
二进制文件:
binary code->base64->str->bytes
我们解析邮件也是按这个思路,逆序解析出内容。
这里的 decode('utf-8') 先把字节流转化为字符串,再将字符串转化为 message 结构的对象。这步与发送邮件的 as_string 函数相反。
先从上一节结构化的 msg 中取出信件头,打印出来。
如果是 multipart 结构, get_payload 函数会返回一个包含不同part的list,然后对每一part递归调用 print_info ,打印子信件头和子信件内容。
不是 multipart 时,之后再依据 Content-Type 作不同处理:
如果是 text :
利用 get_payload(decode = Ture) 取出子信件的内容, decode 为True,则按照 Content-Transfer-Type 将 base64 或 QP 解码为 bytes 。
再 guess_charset 猜出编码方式,之后将其解码为字符显示。
如果不是 Text 对象,则为附件:
打印出附件的 Content-Type 。
8. 如何用程序获得电子邮箱[email protected]中的用户名和域名Python
指导邮箱地址缓册就可以指导用户名和域名了,不用使用任何程序。
你的邮箱地址就是这个邮箱用陆侍户名。
域名是@后面早哪吵的内容,这个邮箱就是163.com。
9. Python编写一个程序 可以读取邮件日志(mbox.txt),统计每个邮件发出的邮件数量,并输出结果。
由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提取工具,代替手工提取的繁杂,涉及中文字符,正则表达式不好匹配,但不是不可以实现,这个以后优化时再说。
需求描述:
一个父目录中存在多个子文件夹,子文件夹下有多个txt形式化的Log日志,要求从所有地方Log日志中找出CardType=9, CardNo=0时的CardID的值,并将其统计存储到一个文本文件中,要求CardID不能够重复。
需求解析:
首先获取所有的Log日志的全路径,根据路径分别加载到将各个Log日志加载到内存中进行提取分析,并将结果存储到给定的文本文件中。
解决方案:
为了尽可能的简洁通用,这里使用配置文件作为输入变量的依据。不多说,上代码:
配置文件如下:
心得体会:
1、利用Python去处理一些日常的小任务,可以很方便的完成,相比较C/C++来说,这方面生产力高了不少。
2、本文设计对中文字符的处理,所以使用正则表达式不太怎么方便,但不少不可以,后续版本中会添加对正则的支持!
3、由于初学中,所以代码写的不够精炼简洁,后续进行再优化!