許多網站上面會有聯絡表單或是訂購表單的程式,從前的作法是使用者填寫完畢後按「發送」,瀏覽器會呼叫電腦內與 mailto:// 協定關聯的應用程式,如 Outlook Express 或 Microsoft Outlook ,把表單內容發送給網站的管理員。

但是比較近代的作法,則是在使用者按下「發送」後,使用網頁表單程式內設定的 SMTP 伺服器與帳密,寄到設定好的信箱,使用者不用暴露自己的 email 位址,也不用裝 Outlook 等本機郵件軟體。

SMTP 伺服器與帳密哪裡來? 如果是用 HiNet 的寬頻上網,會有一組信箱帳號,但一般最常見的是用 Google 帳號當作網站表單的 SMTP,畢竟免費的嘛,只能限制很多就是了。

如果表單程式用 Gmail 當SMTP,遇到信寄不出去,遭遇症狀:
* 程式錯誤訊息「5.5.1 Authentication required」,
* 收到一封「Google 帳戶:登入嘗試遭拒」的郵件

該怎麼辦呢? 這一些都是為了安全性,Google 把所有不是透過 Gmail 網頁操作的發信需求,通通都先擋起來了。可以透過以下步驟解開限制:

1.將「安全性較低的應用程式存取權限」設為「啟用」

進入此網頁 https://www.google.com/settings/security/lesssecureapps ,設為「啟用」。
如果怕我給的連結是騙人的,您也可以到 Google 帳戶內找到「安全性較低的應用程式存取權限」的設定,是一樣的東西。

這時候再寄看看,通常只要啟用這個,網站的表單就可以正常寄送了。
如果還不行,請再往下看。

2.解除人機驗證鎖定

進入此網頁 https://accounts.google.com/b/0/DisplayUnlockCaptcha 點擊「繼續」。

這時候再寄看看,通常只要啟用這個,網站的表單就可以正常寄送了。
如果還不行,請再往下看。

3.檢查SMTP帳號與收件人名稱是否相符

MailMessage mail = new MailMessage();
mail.From = new MailAddress("123@gmail.com", "系統發信");
SmtpClient smtpServer = new SmtpClient();
smtpServer.Credentials = new NetworkCredential("123@gmail.com", "ABCDEFGHIJK");

似乎2019年下半年出現的新問題,mail.From 一定要跟 NetworkCredential 裡的帳號是同一組,以前 mail.From 是可以設別組信箱的,這樣收到系統寄的信,收件人可以顯示得比較好看。

跟主機設定有關

1.如果程式是放在 Microsoft Azure,要去調整 SSL 的設定跟 Web.config,才能用 Gmail 當網站程式的 SMTP。(點此相關 stackflow 的討論串)。
2.如果程式放在 GoDaddy,信也無法直接寄出來,可以直接改用 Godaddy 的郵件轉送伺服器,參考 Send form mail using an SMTP relay server | GoDaddy

還是不行?

  • 請檢查表單程式內的 Gmail 帳號、密碼、SSL、PORT 有沒有打錯。帳號把完整的 @gmail.com 也打上。
  • Google 帳號是否有改過密碼?
  • 寄件程式根本就寫錯了?
  • 如果明明一切設定都正常,但不管怎麼寄都是 5.5.1 Authentication required,還時好時壞,遇到這種情況建議可以換別組 Google 帳號再試試。

SMTP密碼改用應用程式專用密碼(需啟用兩步驟驗證)

進入此網頁 https://accounts.google.com/b/0/SmsAuthConfig?hl=zh_TW,啟用兩步驟驗證。
從此以後,在尚未信任的裝置上用email跟密碼登入 Google 帳號,是無法使用的。一定還要再透過電話或簡訊驗證,才能真正登入帳戶。
進入此網頁 https://security.google.com/settings/security/apppasswords?pli=1,產生一組應用程式專用密碼,然後把寄件程式內的 google 密碼換成這組應用程式密碼。

這組應用程式專用密碼只能登入一個地方,如果把這組密碼先拿來當smtp寄信,又再拿去登入其他東西,後來那個是無法登入的。

現在科技日新月異,不只有電子郵件通知,還有簡訊通知,或是行動裝置 App 推播…
我們都知道天下沒有白吃的午餐、免費的最貴的道理,

用免費信箱當 SMTP 有什麼壞處呢?

1. 信件容易寄到垃圾郵件匣去

如果網站管理員沒去看垃圾郵件匣,容易發生遺憾。 甚至還有用自動轉信的,信留在原信箱的垃圾信件匣裡面,而不會出現在轉寄的信箱裡案例。
不過此題其實無解,付費使用的 HiNet 或 Hibox 信箱、學校信箱,也常常被 Gmail 誤判為垃圾郵件。

2. 免費信箱通常有單日寄件封數上限、單封信收件人數上限…等限制

如網站使用 Gmail 當 SMTP,一天寄超過 500 封信,伺服器會回應 “5.4.5 Daily sending quota exceeded” 而無法寄出信件。

如果發生這種情況,會有兩種下場:
一種是程式沒設定錯誤畫面,所以使用者會看到主機錯誤訊息,但沒仔細看上面寫些什麼,以為信有寄出去。第二種是程式設定發生錯誤時直接跳轉到首頁,使用者也會以為信有寄出,但是實際上並沒有。

使用者等了一陣子沒收到回覆,事實上信根本沒寄出,管理員也根本沒收到信,這就容易起爭議。

3. 免費信箱有單日寄件封數上限,那改成付費信箱或企業信箱總行了吧?

付費信箱或企業信箱因為功能特殊,雖然只要付得起錢,功能要多少就有多少,但是一般方案的「信箱總容量」或「單封郵件大小限制」,通常比免費信箱給的額度還少,附件大一點的信收個幾封,信箱就滿了。信箱滿了是有可能收不到信的。如果網站表單沒設驗證碼,有心人士可以用按鍵精靈腳本或 greasemonkey 腳本直接重複發信,輕易把管理員信箱灌爆,或是讓網站SMTP超出寄件限額,讓網站的信寄不出去。

除了拿 Gmail 來當網站程式的 SMTP,有些「跨國企業」則會使用免費的 QQ 企業信箱(QQ企業郵箱)。

QQ 企業信箱拿來當 SMTP,有什麼要點要注意呢?

1. 寄件速度很快

按下發送到程式回傳「發送成功」的時間極短,寄送的 loading 動畫都來不及看,很不方便。反觀 Gmail 通常至少都要 2 秒以上。

2. 寄件人email 要跟 SMTP 帳號吻合

許多寄件程式都會有這種下面這種效果設定,通常名稱會用網站名稱,username 會用一個好看的 email。
但是 QQ 郵件如果照這樣寫,會得到”553 Mail from must equal authorized user”而無法寄信。
mail.from 的名稱必須要改成跟 smtp 的 username 一樣才能寄。

3.QQ 信箱一樣有信件寄送數量之類的限額

QQ企业邮箱收发邮件的数量限制(发信量上限)
反正就是要防堵使用者拿來大量發信、廣發電子報。天底下沒有白吃的午餐。

4.是內容言論審查?還是垃圾信判斷機制?

這跟表單程式沒啥關係,有一次客人反映 QQ 企業信箱收不到信,於是順便測試了一下,在信中加入以下「退支咒」,即使寄件人是通訊錄內的人,信也會直接到 QQ 的垃圾郵件匣去,完全不會進收件匣。

六四 六四事件 天安门事件 虐杀 坦克
台独 藏独 达赖
香港 占领中环 投票 独立
新疆 炸弹制造 配方
胡锦涛 温家宝 江泽民 癞蛤蟆 习近平 周永康
毛泽东 文化大革命 三年自然灾害
法轮功 天灭共产党 九评共产党 大纪元
民主 自由 人权 上访 抗议 镇压 无国界记者
零八宪章 新公民运动 南方街头运动 莉莉花革命 洋紫荆革命
Tibetan separatist
facebook youtube google
democracy freedom human rights