郵件功能中的那些事

揍敵玩玩發表於2019-02-26

郵件系統的背景

在日常工作,生活乃至休閒娛樂中,訊息始終難以規避。到底是什麼讓她那麼具有魔力,對我們起著不可言喻的作用,抑或讓我們苦不堪言,接下來就讓我們一起去揭開了她神祕的面紗,一窺究竟。
無論是一個系統的誕生,抑或一個功能的online,抑或一個需求的萌發,比較佛性的解釋為:萬事皆有因果。操著商業化的口音,我們稱之為“業務”,歸根結底,是業務的需求推動著這一切的運作。系統的運營方想要通過己方有限的資源去實現收益的最大化,無非通過一些手段讓客戶瞭解一些新的值得投入資金的活動,而這其中的手段莫過於:陌拜,電銷,簡訊推廣,應用及訊息,系統級訊息,郵件等主要手段。較時間花費,資金消耗,價效比等而言,郵件系統便脫穎而出。
複製程式碼

郵件系統的應用

對於一個沒有在程式碼層級接觸過郵件系統的人而言,這是一個陌生的課題,在一定意義上可能要從“三次握手”講起。
情景題:兩個人隔著一道門,互相看不到物件,而又想要聊天,請問應該怎樣建立對話?
第一次握手:一個人對另外一個人說,hello?
第二次握手:另外一個人聽到hello後,發出一個hello的聲音進行迴應;
第三次握手:前者聽到hello後,雙方確認online,開始交流。
以上便是TCP下的三次握手。
瞭解了以上的連結建立的過程,我們此時不難推斷出郵件系統成為天選之人的原因:郵件我發給你了,就存在著達到目的的可能,即便沒有被檢視,開銷也小,幾乎無成本,沒有絲毫損耗。接下來讓我們瞭解下郵件傳送中的三種協議後,一吐為快。
複製程式碼

什麼是POP3、SMTP和IMAP?

1.POP3是Post Office Protocol 3的簡稱,即郵局協議的第3個版本,它規定怎樣將個人計算機連線到Internet的郵件伺服器和下載電子郵件的電子協議。POP3允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的郵件。
2.IMAP全稱是Internet Mail Access Protocol,即互動式郵件存取協議,它是跟POP3類似郵件訪問標準協議之一。與POP3不同的是,開啟了IMAP後,您在電子郵件客戶端收取的郵件仍然保留在伺服器上,同時在客戶端上的操作都會反饋到伺服器上,如:刪除郵件,標記已讀等,伺服器上的郵件也會做相應的動作。所以無論從瀏覽器登入郵箱或者客戶端軟體登入郵箱,看到的郵件以及狀態都是一致的。
3.SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它幫助每臺計算機在傳送或中轉信件時找到下一個目的地。SMTP 伺服器就是遵循 SMTP 協議的傳送郵件伺服器。
複製程式碼

如何選擇smtp埠

https://pepipost.com/blog/25-465-587-2525-choose-the-right-smtp-port/
複製程式碼

郵件系統中挖過的那些坑

這個世界的進步是由懶人推動的,因為他們對自我修養的要求甚高,無止境的追求“複用性”與簡潔,能動手解決的問題從來不瞎吵吵,接下來是show time。
1、上述程式碼塊雖然立足不同覺度實現了不同的功能,但洋洋灑灑的呈現出來顯然不是一個有著高度自我追求的開發者應留下的痕跡;
2、上述臃腫程式碼產生的原因歸根結底還是沒有對需求進行預判,沒有對欄位進行預留;
3、上述程式碼沒有將方法的抽取進行到底。
4、能動手解決的問題,拒絕瞎吵吵,來解決問題吧。
複製程式碼

郵件系統中的那些事

1、騰訊企業郵箱用著還是比較舒服的,拿著賬號和密碼,匹配上對應的伺服器即可實現郵件的傳送,過程很愉快;
2、與騰訊企業郵箱相比,QQ郵箱與163郵箱有著神同步的操作,首先你要去設定中開啟SMTP服務,屆時進行簡訊驗證是必要的,最狗血的是它會當時給你展示授權碼來當密碼用,在程式中用這個授權碼來代替密碼,下面是噴它時間:授權碼只展示一次。你當時沒有用別的途徑自己記下的話,你以後再用時會發現再也找不到這個授權碼了,再也找不到了,只能重複著關閉SMTP服務,開啟SMTP服務,傳送簡訊,在頁面上獲取到代替密碼的授權碼。用過你就會知道什麼是絕望。友情提示:此處會報認證失敗錯誤(JavaMail javax.mail.AuthenticationFailedException);
3、下面再來說說比較神祕的EOF錯誤,滿論壇的解決方案几乎一樣,漫天的扯淡嚇得我趕緊丟出了乾貨,郵件內容不能為空,通常是測試資料過於隨意,甚至不寫造成的,javax.mail.MessagingException: IOException while sending message 報錯也是同樣的原因,比較詭異的事同樣的敗筆居然可能會導致不同的報錯資訊,目前測試看來是使用的郵箱伺服器不同,導致報錯資訊不同;
4、你可能在實際開發中會多種郵箱摻雜著進行書寫或測試,其中郵件傳送的伺服器可能沒有換成對應郵箱的伺服器,此處應有認證失敗報錯(javax.mail.AuthenticationFailedException);
5、或許你很奇怪郵件程式本身沒有報錯,為沒有在收件箱中卻遲遲沒有找到,其實程式給你的體現已經是最真實的了,原因肯定在於後者,沒有找到是因為它可能由於是程式發抑或所傳送的資訊過於敏感抑或過於簡單而被攔截到郵箱垃圾回收站裡去了。而且郵件本身也沒有提醒的,這一點也是很狗血的;
6、網路上關於JavaMail的code一抓一大把,在我看來那些只不過一個個的坑罷了,此處應該講解下
	Session session = Session.getInstance(properties,authenticator);
	Session session = Session.getDefaultInstance(properties,authenticator);
	這裡存在的問題就是session的獲取了,getDefaultInstance會去javaMail Session中獲取defaultSession,所以當你用單一郵箱地址傳送郵件是沒有問題的,但是當你用多個郵箱地址去傳送的時候問題就來了,你會發現它永遠用的是你第一個郵箱地址傳送出去郵件的,此處應該填坑一處,接下來是重頭戲;
7、gmail郵件在國內(China)是難以進行測試的,因為無法連線到gmail的伺服器,在你程式碼準確無誤地情況下,此時再出現javax.mail.AuthenticationFailedException報錯資訊時,你可能短則幾天長達數十天可能也無法解決這個問題,網上的千篇一律鞭策著我做一個有良知的開發人員,我們不只是程式碼的搬運工,坑總是被有追求的人給填的。此時你需要做的是登陸該郵箱地址,到其google賬戶中心去設定一番即可:登陸gmail郵箱 -> 點選右上角賬戶圖示 -> 點選google賬戶 -> 點選登入和安全 -> 拉到最底部 允許不夠安全的應用:已停用 —> 開啟即可:允許不夠安全的應用:已啟用。
複製程式碼

工作總結

從最開始的為了郵件功能而做郵件功能開始,我們就疲於功能的開發,而忽略了一個優秀開發者應具備的基本素養,所以從最開始來說那就是個mistake。從一塊馬蹄鐵到一個國家滅亡的寓言為人所知,然而歷史總是驚人的相似。從一開始的沒有進行資料結構的合理設計及預留,帶來的結果是每次關於郵件的功能都像是從新開發,其中摻雜著就自己記憶力的過於自信,沒有及時的記錄下具體的解決方案,所產生的結果是每次繼續開發起來都有新感覺。接下來我想談一下作為一名開發者應具備的基本素養。
曾幾何時我也想過從網上能找到有點含金量的東西搬過來給大家燉點雞湯,可能是我沒有找到吧,遂提筆揮毫。人法地,地法天,天法道,道法自然。這就闡明瞭萬物皆有章可循,技術開發莫過於此。作為一名開發人員,時刻保持頭腦的清醒,邏輯的清晰是必要的,因為任何人都無法預知自己在腦子一熱時會做出什麼樣的事情,這就是那塊馬蹄鐵。搞技術需要造輪子,這就可複用性,亦可謂前人栽樹,後人乘涼,或許這就是那匹馬。在閱讀時沒人願意讀一團糟的內容,尤其是在讀到後面時發現書寫者的思緒可能已經混亂了,這便是凝練了:方法的抽取見名知意,物件的封裝點到為止,閱讀者的閱讀行雲流水,書寫者的一氣呵成。團隊開發是工作常態,說明文件的書寫也是勢在必行,這樣能大大節約團隊間協作的溝通成本。需求分析能力,專案設計方法和流程處理能力,複用設計和模組分解能力,整體專案的評估能力,團隊組織管理能力,諸如此類不勝列舉,這是我們在職業生涯中應學習到的東西。至少能在哪天被嘲諷為“鹹魚”的時候,高傲的說出“至少我還鹹”的話語。
如同“君子有所為,有所不為”,即有取名“有所為”,“吳所謂”,這才是人生。這裡要講的是在其位謀其政,我們不僅要有自身素養的卓越追求,更要有強烈的責任感。自己的一時疏忽可能為整個團隊的效率大打折扣,甚至有更大的犧牲,這便是團隊中的木桶效應。關於人生觀論點自處不願長篇大論,唯有願意聽的人聞此醍醐灌頂。
言歸正傳,郵件中出現的問題雖然當時解決時感覺到很棘手,現在再次來做時又有新感覺,其實問題就擺在我們的眼前,早早確信程式碼無誤,執行著的程式報錯連連,解決方案卻遲遲拿不出來,如此鮮明的對比不禁讓人痛惜。前者確信無誤,後者端倪不明,線上問題層出不窮,推此及彼,我們需要做的只不過順藤摸瓜罷了。
複製程式碼

相關文章