工作的需要自行学习了Python的一些功能,将所学的经验在这里分享给大家
前言
工作中我们可能会透过邮件,让其他公司收集资料,在学会Python之前,我们需要用人工将邮件一个一个的下载下来,并且统计有哪一家公司发送了资料,哪一家公司还没有发送,统计也是相当麻烦的事情,
因此我用Python写了一个工具,能够自动的接收邮件并且储存起来,相关的发送人员什么时候发送?并进行跟踪
公司的邮件是用exchange的形式
一、环境准备
我想将收起来的邮件统一放在一个固定的路径中,收件人的一些信息我要独立放在一个Excel里面去记录,处理好的准备要发送的邮件,我另外放在一个地方
二、使用步骤
1.引入库
代码如下(示例):
import os
import urllib3
from datetime import timedelta,datetime
import pandas as pd
import numpy as np
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody,Configuration,NTLM,FileAttachment,EWSTimeZone
#此句用来消除ssl证书错误,exchange使用自签证书需加上
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
urllib3.disable_warnings() # 取消SSL安全连接警告
# Tell exchangelib to use this adapter class instead of the default
# exchangelib provides a sample adapter which ignores TLS validation errors.
# Use at own risk. NTML is NT LAN Manager.
# 设置邮箱账号 输入你的域账号如
creds = Credentials(
username='xxxxxxxxx@domain.com', # 修改为 公邮的 user <<<<<<<<<<<<<<<<<<<<修改连接自己的邮箱
password='xxxxxxxxxxxxx' #修改为自己的密码
)
config = Configuration(server='xxxxx.com', credentials=creds, auth_type=NTLM)
account = Account(
primary_smtp_address='username@domain.com',
credentials=creds,
autodiscover=True,
config=config,
access_type=DELEGATE
)
2.读入数据
代码如下(示例):
# 此处为文件路径
path_inbox = r"D:\Doc\Python\inbox\\" #记录inbox 附件
path_outbox = r"D:\Doc\Python\outbox\\" #outbox 附件
path_data = r"D:\Doc\Python\data\\" #data管理
# 自定义函数:保存所有邮件附件到本地制定地址
from exchangelib import UTC
def saveAttachments(attachments):
for attachment in attachments:
if 'xls' in attachment.name or 'XLS' in attachment.name: #过滤要有‘xls' 在附件名中才存档
save_file_name = os.path.join(path_inbox,attachment.name)
with open(save_file_name, 'wb') as f: #wb:以二进制写模式打开
f.write(attachment.content)
inbox = account.inbox # 获取用户账户的收件箱
unread_email_list = inbox.filter(is_read=False) # 获取收件箱未读邮件列表
print(unread_email_list)
mail_file = os.path.join(path_data,"mail_log.xlsx")
mail_file_df = pd.read_excel(mail_file) # 记录mail 的excel
row = len(mail_file_df) # 读出 excel 的 行数
print(mail_file_df)
# 逆序排列未读邮件列表
mail_log.xlsx 是我要作为邮件记录的一个Excel格式内容如下:
里面包含了主题发件人发件人的邮箱, 与邮件的接收时间
我们来看一下怎么把这些资料从Email里面读出来
代码如下(示例):
我在处理接收时间的时候遇到这样子的报错 Excel does not support datetimes with timezones
因为在 exchange上面是用time zone的方式记录时间,Excel不接受这样子的时间方式,所以我先将参数直接转换成为文字格式,但是文字格式的日期与我们相差了8个小时,
我们怎么把这8个小时再追加回去呢?这时候就需要你用到strptime的函数来进行加工,加工后的日期才是真正的收件日期
因为同一个邮箱我们可能要做不同的事情,所以我们可以利用邮件标题中的特殊属性来进行邮件的过滤,这样python只会捞取要处理的邮件进行处理
for email in unread_email_list: #.order_by('-datetime_received'):
# 转换 timezone
# 如不转换 存入excel会报错 ”Excel does not support datetimes with timezones“
dt = str(email.datetime_received) #转换文字
dt = dt[:19] #取前19码 yyyy-mm-dd hh:mm:ss
received_time = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")+ timedelta(hours=8) # + 8hr
print(received_time)
# 如果邮件标题中包含‘【xxx数据处理xxx】’ 邮件过滤
if '【xxx数据处理】' in email.subject: #'QiQi' in email.sender.name 可以过滤 sender
print(" --------------- prepare date start here ----------------")
pd1 = [email.subject, email.sender.name, email.sender.email_address, received_time]
row = row + 1
mail_file_df.loc[row] = pd1
email.is_read = True # 将邮件设置为已读
email.save(update_fields=['is_read']) # 保存邮件的已读属性
# 调用自定义函数:保存邮件附件到本地
saveAttachments(email.attachments)
mail_file_df.to_excel(mail_file,na_rep=11,index=False)
总结
以上就是今天想给大家的内容,非常的简短,就能够处理邮件下载分类统计的功能,完整的代码如下:
# coding=utf-8
#
import os
import urllib3
from datetime import timedelta,datetime
import pandas as pd
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody,Configuration,NTLM,FileAttachment,EWSTimeZone
#此句用来消除ssl证书错误,exchange使用自签证书需加上
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
urllib3.disable_warnings() # 取消SSL安全连接警告
# Tell exchangelib to use this adapter class instead of the default
# exchangelib provides a sample adapter which ignores TLS validation errors.
# Use at own risk. NTML is NT LAN Manager.
# 设置邮箱账号 输入你的域账号如
creds = Credentials(
username='username@domain.com', # 修改为 公邮的 user
password='xxxxxx'
)
config = Configuration(server='xxxx.com', credentials=creds, auth_type=NTLM)
account = Account(
primary_smtp_address='username@domain.com',
credentials=creds,
autodiscover=True,
config=config,
access_type=DELEGATE
)
# 此处为文件路径
path_inbox = r"D:\Doc\Python\inbox\\" #记录inbox 附件
path_outbox = r"D:\Doc\Python\outbox\\" #outbox 附件
path_data = r"D:\Doc\Python\data\\" #data管理
# 自定义函数:保存所有邮件附件到本地制定地址
from exchangelib import UTC
def saveAttachments(attachments):
for attachment in attachments:
if 'xls' in attachment.name: #过滤要有‘xls' 在附件名中才存档
save_file_name = os.path.join(path_outbox,attachment.name)
with open(save_file_name, 'wb') as f:
f.write(attachment.content)
inbox = account.inbox # 获取用户账户的收件箱
unread_email_list = inbox.filter(is_read=False) # 获取收件箱未读邮件列表
mail_file = os.path.join(path_data,"mail_log.xlsx")
mail_file_df = pd.read_excel(mail_file) # 记录mail 的excel
row = len(mail_file_df) # 读出 excel 的 行数
# 逆序排列未读邮件列表
for email in unread_email_list: #.order_by('-datetime_received'):
# print(email.subject) # 打印邮件标题
# print(email.text_body) # 打印邮件是否已读
# print(email.sender.name) # 打印邮件发件人
# print(email.sender.email_address)
# print(email.datetime_received) # 打印邮件接收时间
# 转换 timezone
# 如不转换 存入excel会报错 ”Excel does not support datetimes with timezones“
dt = str(email.datetime_received) #转换文字
dt = dt[:19] #取前19码 yyyy-mm-dd hh:mm:ss
received_time = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")+ timedelta(hours=8) # + 8hr
# print(received_time)
# 如果邮件标题中包含‘【abc数据处理】’ 邮件过滤
if '【abc数据处理】' in email.subject: #'QiQi' in email.sender.name 可以过滤 sender
print(" --------------- prepare date start here ----------------")
pd1 = [email.subject, email.sender.name, email.sender.email_address, received_time]
row = row + 1
mail_file_df.loc[row] = pd1
# email.is_read = True # 将邮件设置为已读
# email.save(update_fields=['is_read']) # 保存邮件的已读属性
# 调用自定义函数:保存邮件附件到本地
saveAttachments(email.attachments)
mail_file_df.to_excel(mail_file,na_rep=11,index=False)
print("--------done---------")
'''
if __name__ == "__main__":
# 连接邮箱服务器
account = connectServer()
while True:
# 获取未读邮件列表
unhandleMails = getUnreadMail(account)
# 处理邮件
handleMail(unhandleMails, account)
time.sleep(30) # 休眠30秒
'''
要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。