首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python连接到Exchange邮箱

用Python连接到Exchange邮箱
EN

Stack Overflow用户
提问于 2008-11-13 22:19:01
回答 4查看 112.7K关注 0票数 27

我需要连接到Python脚本中的Exchange邮箱,而无需使用本地计算机上的任何配置文件设置(包括使用Outlook)。如果我使用win32com创建一个MAPI.Session,我可以用现有的配置文件登录(使用Logon()方法),但我只想提供一个用户名和密码。

这个是可能的吗?如果是的话,有人能提供示例代码吗?我更希望它只使用标准库和pywin32包。不幸的是,无法为Exchange服务器启用IMAP访问(然后使用imaplib)。

如果有必要的话:脚本所要做的就是连接到邮箱,并运行收件箱中的消息,检索内容。如果我一开始就能得到一个连接,我就可以处理编写代码的问题了!

要澄清Outlook: Outlook将安装在本地计算机上,但它没有任何帐户设置(即所有适当的库都可用,但我需要独立于Outlook内部的任何设置操作)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-13 22:28:28

我非常肯定,如果不使用Outlook和MAPI配置文件,这将是不可能的。如果你能用甜言蜜语说服你的邮件管理员在Exchange服务器上启用IMAP,这将使你的生活变得容易得多。

票数 1
EN

Stack Overflow用户

发布于 2010-06-18 19:21:29

我知道这是个老生常谈但是..。

如果使用Exchange2007或更高版本或Office365,请查看。它是一个非常全面的基于SOAP的Exchange接口,您几乎可以完成Outlook能够做的任何事情,包括对其他用户帐户的委托或模拟访问。

https://learn.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-reference-for-exchange

更新:我在PyPI上发布了一个支持自动发现、日历、收件箱、任务、联系人等功能的PyPI:

代码语言:javascript
运行
复制
from exchangelib import DELEGATE, Account, Credentials

credentials = Credentials(
    username='MYWINDOMAIN\\myusername',  # Or myusername@example.com for O365
    password='topsecret'
)
a = Account(
    primary_smtp_address='john@example.com', 
    credentials=credentials, 
    autodiscover=True, 
    access_type=DELEGATE
)
# Print first 100 inbox messages in reverse order
for item in a.inbox.all().only('subject').order_by('-datetime_received')[:100]:
    print(item.subject)
票数 142
EN

Stack Overflow用户

发布于 2014-06-03 16:48:07

我知道了,要连接到出站交换机,您需要这样连接:

代码语言:javascript
运行
复制
import smtplib

url = YOUR_EXCHANGE_SERVER
conn = smtplib.SMTP(url,587)
conn.starttls()
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD)
conn.login(user,password)

现在你可以像普通的连接一样发送

代码语言:javascript
运行
复制
message = 'From: FROMADDR\nTo: TOADDRLIST\nSubject: Your subject\n\n{}'
from, to = fromaddr,toaddrs
txt = 'This is my message'
conn.sendmail(fromaddr,toaddrs,msg.format(txt))

从你的收件箱里收到邮件有点不一样

代码语言:javascript
运行
复制
import imaplib

url = YOUR_EXCHANGE_URL
conn = imaplib.IMAP4_SSL(url,993)
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD)
conn.login(user,password)
conn.select('INBOX')
results,data = conn.search(None,'ALL')
msg_ids = data[0]
msg_id_list = msg_ids.split()

这给了你一个信息id列表,你可以用它来获取你的电子邮件。

代码语言:javascript
运行
复制
latest_email_id = msg_id_list[-1]
result,data = conn.fetch(latest_email_id,"(RFC822)")
raw_email = data[0][1]

现在,raw_email是您的电子邮件消息,但是它不是很漂亮,如果您想解析它,可以这样做

代码语言:javascript
运行
复制
from email.parser import Parser

p = Parser()
msg = p.parsestr(raw_email)

现在你可以做了

代码语言:javascript
运行
复制
msg.get('From')
msg.get('Subject')

或就内容而言

代码语言:javascript
运行
复制
msg.get_payload()

但是,如果这是一个多部分消息,您需要进行更多的处理,幸运的是,递归解决方案对于这种情况是完美的。

代码语言:javascript
运行
复制
def process_multipart_message(message):
    rtn = ''
    if message.is_multipart():
        for m in message.get_payload():
            rtn += process_multipart_message(m)
    else:
        rtn += message.get_payload()
    return rtn

现在

代码语言:javascript
运行
复制
msg_contant = process_multipart_message(msg)

每次都会给你整个信息。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/288546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档