smtplibでSSL接続
Python2.5のsmtplibでSMTPサーバーにSSL接続しようとするとうまくいかない
import smtplib srv = smtplib.SMTP("smtp.hoge.com", 465) #フリーズ
ソースを見てみるとなるほど、connectメソッドでsocket.sslしていない。
つまりソケット接続はできてるけどSSL接続を確立してないから返答が帰ってこないと。
なのでconnectメソッドをまるコピしてきてこんなクラスを書いた。
sslsmtpclient.py
import smtplib import socket from sys import stderr class SSLSMTP(smtplib.SMTP): def connect(self, host='localhost', port = 0): #前略。 try: self.sock = socket.socket(af, socktype, proto) if self.debuglevel > 0: print>>stderr, 'connect:', sa self.sock.connect(sa) #ssl接続を確立する。 sslobj = socket.ssl(self.sock, None, None) self.sock = smtplib.SSLFakeSocket(self.sock, sslobj) self.file = smtplib.SSLFakeFile(sslobj) except socket.error, msg: if self.debuglevel > 0: print>>stderr, 'connect fail:', msg #後略。
これでソケット接続>SSL接続確立までやれるようになった。
処理はSMTP.starttls()からパクってきました。というかどうしてSSLが無視されてるんだろう・・・
利用はこんな感じで。
import sslsmtpclient srv = sslsmtpclient.SSLSMTP("smtp.hoge.com", 465) srv.ehlo() srv.login("myaccount", "mypassword") #以下通常のSMTPクラス利用方法で。
余談
ちなみにTLSは普通に可能。以下方法。
import smtplib srv = smtplib.SMTP("smtp.hoge.com") srv.ehlo() srv.starttls() srv.ehlo() srv.login("myaccount", "mypassword") #以下略