昨日の続きで、Google Gmail LoaderをSMTP認証ありで使うときSMTPサーバーへの接続でうまくいっていない原因を探ってみました。まずはSMTP認証はどうなっているのだろうと、ソースであるgmlw.pyを覗きます。
ユーザー名はself.smtpusr、パスワードはself.smtppwdとして変数定義されています。で、これを検索して追いかけてみると、使われているのは最後のメッセージ表示部分だけでメール送信には使われていません。ユーザー名、パスワードを入力しても、使っているのはプログラム終了時の表示だけなのです。これは驚きました。驚愕的新事実的肩すかしというやつでしょうか。
メール送信の関数は295行目から308行目の以下の部分で定義されています。
# Send a Message (Internal) def _sendMessage(self): time.sleep(2) server = smtplib.SMTP(self.smtpsvr.get()) server.set_debuglevel(1) if self.rcvorsn.get() == self.rcvtyps[1]: fullmsg = re.sub(r'From: .*', 'From: %s' % self.recipnt.get(), self.msg.__str__( ) + '\x0a' + self.document, 1 ) server.sendmail(self.recipnt.get(), self.recipnt.get(), fullmsg) else: fullmsg = self.msg.__str__( ) + '\x0a' + self.document server.sendmail(self.msg.getaddr('From')[1], self.recipnt.get(), fullmsg) server.quit()
SMTPの接続関係をserverで作成して、server.sendmail()でメール送信、server.quit()で終了という流れです。やっぱりここに引数としてself.smtpusrやself.smtppwdは入っていません。ということで自分で実装してみました。
元のソースにおいて
server = smtplib.SMTP(self.smtpsvr.get()) server.set_debuglevel(1) if self.rcvorsn.get() == self.rcvtyps[1]:
の部分に
server = smtplib.SMTP(self.smtpsvr.get()) server.set_debuglevel(1) if self.needath.get(): server.login(self.smtpusr.get(), self.smtppwd.get()) if self.rcvorsn.get() == self.rcvtyps[1]:
と、認証が必要な場合は最初にログインを実行する部分を2行書き足します。これで実行してみたところ、うまくいきました。やりました。
最後に、こんな重要な機能をミスで積み忘れた、さらに長年多くの人が気づかなかった、最新のバージョン0.5bは2004年6月の日付です。というのは考えにくいので、なにか自分が見落としている可能性は高いと思います。でもまあこれで目的は達成されたのでいいかなぁ。ってところですね。