2008-11-13 190 views
16

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

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

如果有必要:所有的脚本将会连接到邮箱,并通过收件箱中的邮件运行,检索内容。如果我能在第一时间获得连接,我可以处理为此编写代码!

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

回答

1

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

+0

启用IMAP不是一个选项(如果是的话,整个事情将变得微不足道,但可悲的是它不是)。 – 2008-11-13 22:32:41

+0

是的,这是我的想法,但它值得一试。 – 2008-11-13 22:40:00

+0

我应该首先把它放在问题中(现在编辑)。感谢:) – 2008-11-13 22:50:41

59

我知道这是一个古老的线程获得的,但是......

如果您使用的是Exchange 2007或更高版本,或Office365,看看交易所网页服务。这是一个非常全面的基于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 [email protected] for O365 
    password='topsecret' 
) 
account = Account(
    primary_smtp_address='[email protected]', 
    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) 
21

Ive得到它,连接到出站交换需要连接像这样:

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的” s表示你可以用它来获得你的电子邮件列表,收邮件

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

现在raw_email是你的电子邮件消息,但它不是非常漂亮,如果你想解析它是这样做的

from email.parser import Parser 

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

现在你可以做

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

或内容

msg.get_payload() 

,但如果你将需要做更多一点处理的多部分消息,luckly递归的解决方案是为这个完美的情况

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) 

每次都会给你全部的信息。

相关问题