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")

#以下略