2024-04-29 01:15:22 发布
网友
我想使用已登录的Windows用户的凭据来使用NTLM验证到Exchange服务器的SMTP连接。
我知道python-ntlm模块和twopatches启用了SMTP的NTLM身份验证,但是我想使用当前用户的安全令牌,而不必提供用户名和密码。
与Windows Authentication with Python and urllib2非常相似的问题。
code, response = smtp.docmd("", ntlm_message)
这最终会将正确的响应发送回服务器,但是由于docmd()调用putcmd()的性质,它会预先挂起一个空格。
smtplib.py版本:
def putcmd(self, cmd, args=""): """Send a command to the server.""" if args == "": str = '%s%s' % (cmd, CRLF) else: str = '%s %s%s' % (cmd, args, CRLF) self.send(str) # ... def docmd(self, cmd, args=""): """Send a command, and return its response code.""" self.putcmd(cmd, args) return self.getreply()
其结果是采用else条件的路径,从而发送str(' ' + ntlm_message + CRLF),从而产生(501, 'Syntax error in parameters or arguments')。
str(' ' + ntlm_message + CRLF)
(501, 'Syntax error in parameters or arguments')
因此,修复方法只是将NTLM消息作为cmd发送。
code, response = smtp.docmd(ntlm_message)
已提交对上述答案的修订,但谁知道何时将对其进行审查/接受。
尽管下面的解决方案仅使用Python Win32扩展(Python Win32扩展中包含的sspi示例代码非常有用),但问题中提到的Python ntlm IMAP&;SMTP修补程序也可以作为有用的指南。
from smtplib import SMTPException, SMTPAuthenticationError import string import base64 import sspi # NTLM Guide -- http://curl.haxx.se/rfc/ntlm.html SMTP_EHLO_OKAY = 250 SMTP_AUTH_CHALLENGE = 334 SMTP_AUTH_OKAY = 235 def asbase64(msg): return string.replace(base64.encodestring(msg), '\n', '') def connect_to_exchange_as_current_user(smtp): """Example: >>> import smtplib >>> smtp = smtplib.SMTP("my.smtp.server") >>> connect_to_exchange_as_current_user(smtp) """ # Send the SMTP EHLO command code, response = smtp.ehlo() if code != SMTP_EHLO_OKAY: raise SMTPException("Server did not respond as expected to EHLO command") sspiclient = sspi.ClientAuth('NTLM') # Generate the NTLM Type 1 message sec_buffer=None err, sec_buffer = sspiclient.authorize(sec_buffer) ntlm_message = asbase64(sec_buffer[0].Buffer) # Send the NTLM Type 1 message -- Authentication Request code, response = smtp.docmd("AUTH", "NTLM " + ntlm_message) # Verify the NTLM Type 2 response -- Challenge Message if code != SMTP_AUTH_CHALLENGE: raise SMTPException("Server did not respond as expected to NTLM negotiate message") # Generate the NTLM Type 3 message err, sec_buffer = sspiclient.authorize(base64.decodestring(response)) ntlm_message = asbase64(sec_buffer[0].Buffer) # Send the NTLM Type 3 message -- Response Message code, response = smtp.docmd("", ntlm_message) if code != SMTP_AUTH_OKAY: raise SMTPAuthenticationError(code, response)
很好的答案,但作为Python3.0+的更新
def asbase64(msg): # encoding the message then convert to string return((base64.b64encode(msg)).decode("utf-8"))
code, response = smtp.docmd("", ntlm_message)
这最终会将正确的响应发送回服务器,但是由于docmd()调用putcmd()的性质,它会预先挂起一个空格。
smtplib.py版本:
其结果是采用else条件的路径,从而发送
str(' ' + ntlm_message + CRLF)
,从而产生(501, 'Syntax error in parameters or arguments')
。因此,修复方法只是将NTLM消息作为cmd发送。
code, response = smtp.docmd(ntlm_message)
已提交对上述答案的修订,但谁知道何时将对其进行审查/接受。
尽管下面的解决方案仅使用Python Win32扩展(Python Win32扩展中包含的sspi示例代码非常有用),但问题中提到的Python ntlm IMAP&;SMTP修补程序也可以作为有用的指南。
很好的答案,但作为Python3.0+的更新
相关问题 更多 >
编程相关推荐