phpmailer Gmail SMTP Error: Could not authenticate


以往在撰寫的許多程式裡面,總難免要送些信件,也許是驗證、也許是通知。
送信通知大概不脫兩種模式:localhost sendmail 或者 使用SMTP呼叫遠端信件伺服器。
兩種情形各有利弊,使用localhost呼叫sendmail,速度快、不怕大量送信(*)、減少跨到外部驗證時連線狀態穩不穩定的問題(就算暫時有壅塞的情形,也會自己重送)。使用遠端SMTP其實好處也不少,不管存放程式的伺服器有沒有mail service,只要防火牆會通,就可以通過遠端驗證送信、不怕大量送信被判定垃圾信(*)..等。
以上有兩點是相互矛盾的,就在於那個「大量送信」。

使用localhost sendmail大量送信,經常都會因為同一個寄件者發送信件的頻率太高而被許多信件伺服器判定為「廣告信、垃圾信」(即使正反解都可以正確查詢也一樣)。如果使用者沒有到垃圾郵件的收件匣去把信件救回來,通知信件就石沉大海了  @@ (而且,沒有去救信又回系統狂按送信的使用者,真的是殺手等級的 XD )

使用SMTP遠端驗證,如果大量送信呢?驗證的機制掌握在提供mail service的那一端,以最近遇過程式一個小時裡面有近百個註冊行為的情境來說,每一個送信就是一個驗證,換句話說,一個帳號在一個小時內做了近百次的驗證,要不被遠端SMTP SERVER給封掉也不容易 XD

好啦,講半天,我是要紀錄一個狀況。
最近所撰寫的程式盡量都省麻煩,反正google gmail很慷慨,你愛註冊幾個帳號就註冊幾個帳號,所以,每個不同的網站,通通註冊個帳號給他去發通知信件,然後透過信箱整合,把帳號通通併到自己慣用的gmail來作管理就好,不管有幾個帳號,使用者起來就等同於只有一個帳號。( 詳:以gmail整合教育部電子郵件設定(20140819) )
這樣的運作模式還蠻順利的,直到最近出現了前兩段敘述的密集登入的問題,然後 phpmailer 就不理人了  XD
信件送不出去,一直出現 「SMTP Error: Could not authenticate」網路上好像很多人遇到過,幾個人家分想過的解決方法如下:

  • $this->Mailer = 'smtp';  改成 $this->Mailer = 'SMTP';  (這個我無法理解 XD)
  • 修改 php.ini 
  • 修改 new PHPMailer() 時 $mail->Host ='smtp.gmail.com' 為 $mail->Host ='ssl://smtp.gmail.com'
  • .... (各種建議都有)
可是,其實各種建議都不是「原本可以運作,突然 SMTP Error: Could not authenticate」的狀況。


假如您也遇上了我描述的狀況,解決的方法說不定意外的簡單  ^^  就是被google gmail鎖了
登入那個用來送信的gmail帳號,然後到 https://www.google.com/settings/security 瞧瞧

如果有發現帳戶停用,看看是不是 phpmailer 造成的 *(看一下時間、登入來源應該很容易判斷)
然後,檢查一下「帳戶權限」→「安全性較低的應用程式存取權限」,狀態是停用還是啟用?
如果狀態是停用,就到 https://www.google.com/settings/security/lesssecureapps?pli=1 改成啟用
然後,到活動紀錄裡面去追認一下,把gmail判斷成非法登入的那些紀錄追認為本人使用,
一兩分鐘之後,phpmailer就又可以正常的利用SMTP透過Gmail送信啦  ^^

留言