用Python连接到Exchange邮箱

2024-06-08 07:05:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如果有必要:脚本将要做的就是连接到邮箱,并在收件箱中的邮件中运行,检索内容。如果我能在第一时间得到一个连接的话,我就可以为它编写代码了!

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


Tags: 方法代码脚本密码示例exchangesession配置文件
3条回答

如果不使用Outlook和MAPI配置文件,我确信这是不可能的。如果你能甜言蜜语地说服你的邮件管理员在Exchange服务器上启用IMAP,这会让你的生活更轻松。

我明白了,要连接到出站exchange,您需要这样连接:

import smtplib

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

现在你可以像正常连接一样发送

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))

从你的收件箱收到邮件有点不同

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的列表' 你可以用来收发邮件

latest_email_id = msg_id_list[-1]
result,data = conn.fetch(latest_email_id,"(RFC822)")
raw_email = data[0][1]

现在raw_email是你的email消息,但是它不是很漂亮,如果你想解析它的话,可以这样做

from email.parser import Parser

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

现在你可以了

msg.get('From')
msg.get('Subject')

或内容

msg.get_payload()

但是如果它是一个多部分消息,你需要做更多的处理,幸运的是递归解决方案非常适合这种情况

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

现在

msg_contant = process_multipart_message(msg)

每次都会给你完整的信息。

我知道这是一条老线索,但是。。。

如果您使用的是Exchange 2007或更新版本,或Office365,请查看Exchange Web服务。这是一个非常全面的基于SOAP的Exchange接口,您可以做Outlook能够做的任何事情,包括委派或模拟对其他用户帐户的访问。

http://msdn.microsoft.com/en-us/library/bb204119.aspx

更新:我在PyPI上发布了一个Python EWS client,它支持自动发现、日历、收件箱、任务、联系人等:

from exchangelib import DELEGATE, Account, Credentials

credentials = Credentials(
    username='MYWINDOMAIN\\myusername',  # Or myusername@example.com for O365
    password='topsecret'
)
account = 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 account.inbox.all().order_by('-datetime_received')[:100]:
    print(item.subject, item.body, item.attachments)

相关问题 更多 >

    热门问题