Python玩转Outlook邮箱

前段时间遇到一个需求,需要把告警邮件通过飞书重新发送出来,故研究了一下Python调用exchangelib库去操作outlook邮箱

一、基本介绍

Exchangelib模块是 Exchange 邮箱的 ORM,提供对所有数据的 Django 式访问。它是一个独立于平台、性能良好、行为良好、文档齐全、经过充分测试且简单的界面,用于使用 Exchange Web 服务 (EWS) 与内部部署的 Microsoft Exchange 2007-2016 服务器或 Office365 进行通信。其中,它实现了自动发现,以及搜索、创建、更新、删除、导出和上传日历、邮箱、任务、联系人和通讯组列表项的功能。

你可以从 PyPI 安装这个包:

pip install exchangelib

默认安装不支持 Kerberos 或 SSPI。要获得额外的 Kerberos 或 SSPI 支持,请安装额外的kerberossspi依赖项(请注意,SSPI 仅在 Windows 上受支持):

pip install exchangelib[kerberos]
pip install exchangelib[sspi]

要获得两者,请安装为:

pip install exchangelib[complete]

二、设置和连接

from exchangelib import DELEGATE, IMPERSONATION, Account, Credentials
from exchangelib.folders import Calendar, SingleFolderQuerySet
from exchangelib.properties import DistinguishedFolderId, Mailbox

#指定您的凭据。用户名通常为WINDOMAINUsername格式,
#其中WINDOMAIN是您的用户名所连接的Windows域的名称
#到,但某些服务器也接受PrimarySMTPAddress中的用户名
# ('myusername@example.com“)格式(Office365需要它),UPN格式也同样适用支持
credentials = Credentials(username='MYWINDOMAIN\myuser', password='topsecret')

account = Account(
  primary_smtp_address='myusername@example.com', credentials=credentials,
  autodiscover=True, access_type=DELEGATE
)

打印收件箱前100封邮件

from exchangelib import Credentials, Account

credentials = Credentials('john@example.com''topsecret')
account = Account('john@example.com', credentials=credentials, autodiscover=True)

for item in account.inbox.all().order_by('-datetime_received')[:100]:
        print(item.subject, item.sender, item.datetime_received)

三、发送邮件

1、 发送文本邮件

from exchangelib import Message

message = Message(
    account=account,
    subject='测试主题',
    body='这是一封测试邮件',
    to_recipients=(
        'jim@example.com',
    ),
)
message.send()

2、发送HTML邮件

邮件并不局限于纯文本,可以用 HTML 编写格式丰富的内容

from exchangelib import HTMLBody

html = '<html><body>Hello happy <blink>OWA user!</blink></body></html>'
message = Message(
account=account,
subject='测试主题',
body=HTMLBody(html),
to_recipients=(
'john@example.com',
),
)

3、发送附件

发送附件需要初始化 FileAttachment 对象,指定文件名以及文件内容, 并通过 Message 对象 attach 方法附着到邮件上:

from exchangelib import FileAttachment

logo_filename = 'logo.png'
with open(logo_filename, 'rb'as f:
    logo = FileAttachment(
        filename=logo_filename,
        content=f.read(),
    )
message.attach(logo)
message.send()

4、内嵌附件图片

附件图片可以嵌到 HTML 邮件体中进行展示。此时,需要为附件指定一个 CID ,以便在 HTML 中引用:

logo_filename = 'logo.png'
with open(logo_filename, 'rb') as f:
    logo = FileAttachment(
        filename=logo_filename,
        content=f.read(),
        content_id=logo_filename,
    )
message.attach(logo)
message.body = HTMLBody('<html><body>Hello logo: <img src="cid:%s"></body></html>' %(logo_filename,))
message.send()

四、报错处理

使用autodiscover=True,发现DNS解析域名出错,AttributeError ‘Resolver’ object has no attribute ‘resolve’,

Python玩转Outlook邮箱

解决方式,使用config方式配置域名,config = Configuration(server=’mail.myserver.com’, credentials=credentials)


原文始发于微信公众号(洋洋自语):Python玩转Outlook邮箱

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/272982.html

(0)
明月予我的头像明月予我bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!