怎样让Python处理邮件 - 初试exchangelib

为什么要自动处理邮件

休假的时候,看到手机邮箱图标右上角不断变大的数字,不点开看,全身不爽,看了又影响休假心情。基于多年经验的总结:

  1. 紧急的邮件不复杂,第一时间转发给正确的同事即可;
  2. 复杂的邮件不紧急,等休假结束后再处理;
  3. 既不重要也不紧急,如果是垃圾邮件,直接删除就好;
  4. 即紧急又重要,可以转换成一个紧急却不复杂和一个复杂但不紧急的邮件;

列好需求,发现程序可以处理上述情况1情况3,万能工具Python可以上场了。

Python连接邮箱的方法有2种,如果你的电脑已经安装Outlook客户端,可以使用鼎鼎大名的pywin32,利用Windows平台提供的COM接口,调用Outlook客户端完成邮件的收发,连接代码只有2行:

import win32com.client as win32
outlook = win32.Dispatch("Outlook.Application").GetNamespace("MAPI")

拿到outlook对象后,我们就可以遍历其中的邮箱账户和收发件箱里的邮件。
上述方法的好处是,代码中不需要输入用户名,密码,邮箱服务名等信息,也不需要开发人员操心连接服务器的安全认证,脏活累活全都委托Outlook客户端完成,坏处是,电脑必须安装付费软件Outlook。

如果你的电脑没有安装Outlook客户端,甚至不是Windows系统,可以使用第三方包exchangelib,通过SMTP协议访问邮箱服务器。

本文使用exchangelib处理邮件,网上文档很少,只有github托管页面的介绍。
使用前需要在线安装exchangelib,在命令控制台输入:pip install exchangelib

Python代码上场

首先需要通过SMTP协议,连接邮箱服务器,其中涉及安全认证的部分,比较复杂,会在后续文章中介绍,这里只需要照搬代码就行。

from exchangelib import Credentials, Account, DELEGATE, \
    Configuration, NTLM, Message, Mailbox, HTMLBody
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
import urllib3
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.
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
​
cred = Credentials('邮箱域名\\邮箱用户名', '邮箱密码')
config = Configuration(
    server = '邮箱服务器地址,如smtp.qq.com', 
    credentials = cred, 
    auth_type = NTLM
)
account = Account(
    primary_smtp_address='你的邮箱地址,如38351113@qq.com', 
    config=config, 
    autodiscover=False, 
    access_type=DELEGATE
)
print('你的邮箱已连接')

连上邮箱服务器后,下一步需要遍历未读邮件,比较邮件标题和发件人,将满足条件的邮件转发给正确的工作交接人,并设置邮件状态为已读。

inbox = account.inbox # 获取用户账户的收件箱
unread_email_list = inbox.filter(is_read=False) #获取收件箱未读邮件列表
#逆序排列未读邮件列表
for email in unread_email_list.order_by('-datetime_received'): 
    print(email.subject) # 打印邮件标题
    print(email.is_read) # 打印邮件是否已读
    print(email.sender.name) #打印邮件发件人
    print(email.datetime_received) # 打印邮件接收时间
    
    # 如果邮件的发件人中包含张三,并且邮件标题中包含‘测试邮件’四个字
    if '张三' in email.sender.name and '测试邮件' in email.subject:
        # 调用自定义函数:转发邮件
        forwardMail(account, email, '38351113@qq.com') 
        
        email.is_read = True # 将邮件设置为已读
        email.save(update_fields=['is_read']) # 保存邮件的已读属性
        # 调用自定义函数:保存邮件附件到本地
        saveAttachments(email.attachments) 

下面是上文代码中被调用的2个自定义函数,forwardMail是把收到的满足规则的邮件转发给指定工作交接人,saveAttachments是下载邮件附件到本地文件夹。

# 自定义函数:转发邮件,参数是邮箱账户,需要转发的邮件,转发收件人
def forwardMail(account, orignal_email, sender):
    newMail = Message(
        account = account,
        folder = account.sent,
        subject = '转发: ' + orignal_email.subject,
        body = '下面是转发的邮件内容:' + orignal_email.body,
        to_recipients=[Mailbox(email_address = sender)] #收件人
    )
    newMail.send_and_save() # 发送邮件并保存# 自定义函数:保存所有邮件附件到本地制定地址
def saveAttachments(attachments):
    for attachment in attachments:
        # print(attachment.name)
        save_files_path = \ # 如果是Linux需要使用os.path.join拼接路径
        'D:\\Workspace\\Python\\data\\'+attachment.name
        with open(save_files_path, 'wb') as f:
            f.write(attachment.content)

本文旨在用最少的代码,体验Python exchangelib的邮件操作功能,后续还会继续学习邮件操作+任务管理+规则设置+安全认证等内容。

  • 6
    点赞
  • 24
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

白马之围

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值