[Review Board] 寄信時出現 SMTP AUTH extension not supported by server 錯誤訊息
今天在設定 Review Board 的寄信功能,
不過信件一直寄不出來…
從 reviewboard.log 裡面,
看到 SMTP AUTH extension not supported by server 這個錯誤訊息:
2019-06-05 05:29:24,582 - ERROR - - root - Failed to send test e-mail. Traceback (most recent call last): File "/opt/venv/local/lib/python2.7/site-packages/reviewboard/admin/forms.py", line 736, in save fail_silently=False) File "/opt/venv/local/lib/python2.7/site-packages/django/core/mail/__init__.py", line 50, in send_mail connection=connection).send() File "/opt/venv/local/lib/python2.7/site-packages/django/core/mail/message.py", line 276, in send return self.get_connection(fail_silently).send_messages([self]) File "/opt/venv/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 87, in send_messages new_conn_created = self.open() File "/opt/venv/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 54, in open self.connection.login(self.username, self.password) File "/usr/lib/python2.7/smtplib.py", line 586, in login raise SMTPException("SMTP AUTH extension not supported by server.") SMTPException: SMTP AUTH extension not supported by server.
嗯… 我設定的是一台 relay.testdomain.com,
在舊的 Review Board 上可以運作,
沒道理在新建立的 Review Board 上就不行…
直接用 netcat 打打看 SMTP 協定吧~
連上之後,先下個 EHLO 打聲招呼,
郵件伺服器就回傳了支援的指令回來:
root@7ba54830d8fe:/# nc -v relay.testdomain.com 25 relay.testdomain.com [11.22.33.44] 25 (smtp) open 220 ESMTP Postfix EHLO client.testdomain.com 250-relay02.testdomain.com 250-PIPELINING 250-SIZE 34603008 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
試試幾個 SMTP 裡驗證身分相關的指令 (wikipedia: SMTP AUTH),
結果都是 authentication not enabled:
AUTH PLAIN 503 5.5.1 Error: authentication not enabled AUTH LOGIN 503 5.5.1 Error: authentication not enabled AUTH CRAM-MD5 503 5.5.1 Error: authentication not enabled
真是奇怪,看起來好像驗證的功能沒有開?
再用 Python 的 smtplib 模組來試試,
執行 ehlo() 後取得的資訊是相同的:
>>> import smtplib >>> s = smtplib.SMTP("relay.testdomain.com", 25) >>> s.ehlo() (250, 'relay02.testdomain.com\nPIPELINING\nSIZE 34603008\nETRN\nSTARTTLS\nENHANCEDSTATUSCODES\n8BITMIME\nDSN')
可以啟用 TLS:
>>> s.starttls() (220, '2.0.0 Ready to start TLS')
使用 login() 登入時就出現一樣的錯誤:
>>> s.login("testuser@testdomain.com", "password") Traceback (most recent call last): File "", line 1, in File "/usr/local/Cellar/python@2/2.7.16/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtplib.py", line 586, in login raise SMTPException("SMTP AUTH extension not supported by server.") smtplib.SMTPException: SMTP AUTH extension not supported by server.
問了一下設定舊 Review Board 的同事,
說這台 mail relay 伺服器是不需要帳號密碼的… (?!)
實驗了一下,也確實不需要登入,就能寄信成功:
>>> s.sendmail("testuser@testdomain.com", ["testuser@testdomain.com"], "From: testuser@testdomain.com\nSubject:subject\nhihi test")
回到 Review board 上的 Email 設定頁,
看到目前使用者名稱/密碼是有值的:
但等等,我不可能是用 admin 登入郵件伺服器的,
這也不像是我輸入的設定,
是怎麼回事呢?
研究了一下,終於搞清楚,
那個使用者名稱/密碼呈現藍色狀態,
是因為那是 Chrome 的表單自動填入 (或是我在用的 LastPass)。
當我再勾選「Send a test email」並儲存時,
被自動填入的帳號密碼,就被拿去試著登入郵件伺服器。
但這台伺服器根本不支援登入,登入的功能鐵定失敗。
後來,將使用者名稱與密碼欄位都清空,
再勾選「Send a test email」並儲存,信件就成功寄出來了~
經此一事,發現表單自動填入的功能其實也要很小心,
它可能填錯的值,會導致後面連環的錯誤啊~Orz
參考資料:
SMTP AUTH extension not supported by server : Forums : PythonAnywhere