Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python连接到Exchange邮箱_Python_Email_Connection_Exchange Server_Pywin32 - Fatal编程技术网

使用Python连接到Exchange邮箱

使用Python连接到Exchange邮箱,python,email,connection,exchange-server,pywin32,Python,Email,Connection,Exchange Server,Pywin32,我需要用Python脚本连接到Exchange邮箱,而不需要在本地计算机上使用任何配置文件设置(包括使用Outlook)。如果我使用win32com创建MAPI.Session,我可以使用现有配置文件登录(使用logon()方法),但我只想提供用户名和密码 这可能吗?如果是,有人能提供示例代码吗?我更希望它只使用标准库和pywin32包。遗憾的是,无法为Exchange服务器启用IMAP访问(然后使用imaplib) 如果有必要:脚本将要做的全部工作是连接到邮箱,并在收件箱中的邮件中运行,检索内

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

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

如果有必要:脚本将要做的全部工作是连接到邮箱,并在收件箱中的邮件中运行,检索内容。我可以处理编写代码,如果我可以得到一个连接在第一位


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

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

您必须找到一种方法以该特定用户的身份运行该过程


我认为这是你需要走的道路的起点。最后一次编辑。登录的用户句柄是通过使用方法获得的

我知道这是一个旧线程,但是

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

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

从exchangelib导入委托、帐户、凭据
凭证=凭证(
username='MYWINDOMAIN\\myusername',#或myusername@example.comO365
密码class='topsecret'
)
帐户(
主smtp地址=john@example.com', 
凭证=凭证,
自动发现=真,
访问类型=委托
)
#按相反顺序打印前100封收件箱邮件
对于account.inbox.all()中的项目,订购人('-datetime_received')[:100]:
打印(item.subject、item.body、item.attachments)

我明白了,要连接到出站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是您的电子邮件消息,但它不是很漂亮,如果您想解析它,请执行以下操作

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
现在


每次都会给您完整的消息。

您可以使用powershell对Exchange 2007执行任何操作,但我不太了解。+1因为这应该是公认的答案。是否有实现该功能的python包装库?此EWS客户端是否在python 2.7中提供?是,它支持Python2和Python3您的库以及您提供的示例代码,它们工作得完美无缺。谢谢。我需要连接到端口443并将安全设置为SSL/TLS(接受所有证书)。我该怎么做?一直在搜索,但到目前为止没有结果。在登录inIf之前,如果我需要处理使用脚本发送到电子邮件的文件,我如何才能找到他?谢谢如果Exchange服务器未配置为允许IMAP连接,则此答案无效。使用Python 3,需要将电子邮件数据从字节解码为字符串。使用以下内容进行修正:原始电子邮件=数据[0][1]。解码('utf-8')
msg_contant = process_multipart_message(msg)