はじめに
Difyをバージョン0.6.10へのアップデート後にメール送信機能が突然失敗するようになりました。この記事では、問題の発見から解決までの調査プロセスをここに残します。
Difyのメールの設定はこちらで残しています。
問題の発見
Dify v0.6.10へのアップデート直後、それまで正常に機能していたメール送信機能が動作しなくなりました。エラーログを確認したところ、以下のエラーメッセージが表示されていました:
SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)
このエラーは、SSL/TLS接続の確立に問題があることを示唆しています。
エラーの分析
WRONG_VERSION_NUMBER
エラーは通常、クライアントとサーバーが異なるプロトコルバージョンを使用しようとしている場合に発生します。具体的には:
- クライアントがSSL/TLS接続を試みているのに対し、サーバーが非暗号化接続を期待している。
- あるいは、クライアントとサーバーが互換性のないSSL/TLSバージョンを使用しようとしている。
このエラーは、接続方法が突然変更されたことをと推測できますね。
初期調査
- SMTPサーバーの設定(ホスト、ポート、認証情報)が正しいことを再確認しました。
- ネットワーク接続に問題がないことを確認しました。
- ファイアウォールの設定に変更がないことを確認しました。
これらの基本的なチェックでは問題の原因が特定できませんでした。
コードの詳細調査
問題の原因を特定するため、Dify v0.6.10のソースコードの変更点を調査しました。すると、api/libs/smtp.py
ファイルに変更があることがわかりました。
変更の詳細(api/libs/smtp.py):
def send(self, mail: dict):
smtp = None
try:
smtp = smtplib.SMTP(self.server, self.port, timeout=10)
- if self._use_tls:
- smtp.starttls()
+ if self.use_tls:
+ if self.opportunistic_tls:
+ smtp = smtplib.SMTP(self.server, self.port, timeout=10)
+ smtp.starttls()
+ else:
+ smtp = smtplib.SMTP_SSL(self.server, self.port, timeout=10)
+ else:
+ smtp = smtplib.SMTP(self.server, self.port, timeout=10)
if self.username and self.password:
smtp.login(self.username, self.password)
新しく self.opportunistic_tls
というパラメータが導入されて、TLS使用時の接続ロジックに変更がありますね。
解決策
v0.6.9以前と同じような方法でメール送信を行う場合、opportunistic_tls
パラメータを True
に設定しないといけません。
これは環境変数で設定できるので以下に変更しておきましょう。
SMTP_OPPORTUNISTIC_TLS: 'true'
最後に
以下の時にうまくできる方法はわかっていないので知っている人がいれば教えて欲しいです。
SMTP_OPPORTUNISTIC_TLS: 'false'