尽管下面的解决方案只使用了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)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐