封裝Javamail的原因
兩個(gè)字需求
1. 去年已經(jīng)寫過一個(gè)Message channel,抽象出了消息發(fā)送的統(tǒng)一接口,已經(jīng)支持FTP, JMS。底層還提出來了一套統(tǒng)一的connection pool結(jié)構(gòu)。用戶通過依賴注入方式配置選擇通信方式,connection pool的策略,具體實(shí)現(xiàn)在代碼中對(duì)用戶都是透明的,用戶可以方便地通過配置文件切換選擇的通信方式。Email通信方式也需要加到這套已有的設(shè)計(jì)上。
2. 直接使用javaMail,用戶需要自己處理整個(gè)email的復(fù)雜結(jié)構(gòu),比如在接收時(shí)還需要處理正文和附件,并存儲(chǔ),使用完后還需要清理。
3. 用戶可以提供郵件模板,從業(yè)務(wù)程序的上下文環(huán)境中提取有用的信息,替換模板中的placeholder,形成郵件內(nèi)容。
4. 自動(dòng)ACK,每收到一份郵件,就自動(dòng)發(fā)送應(yīng)答,應(yīng)答也提供了模板定制功能,可以引用原郵件的標(biāo)題,附件,正文等。
5. 郵件匹配和過濾,javamail提供了search功能,可以對(duì)郵件進(jìn)行過濾,但是它不滿足1中系統(tǒng)中已有的接口。
6. 對(duì)于匹配和過濾郵件,javamail已經(jīng)設(shè)計(jì)了套語言的面向?qū)ο竽P?/span>(SearchTerm, AndTerm, OrTerm, NotTerm…)。但是在實(shí)際應(yīng)用中,我們不可能讓用戶直接使用這套面向?qū)ο髾C(jī)制,特別是前臺(tái)用戶,前臺(tái)用戶應(yīng)該只需要提供一個(gè)表達(dá)式,描繪出接收的郵件必須滿足的格式,然后后臺(tái)把用戶的表達(dá)式解釋成javamail的面向?qū)ο竽P汀_@就需要我們?cè)O(shè)計(jì)DSL和解釋器。
7. 默認(rèn)情況下用JavaMail收發(fā)中文郵件會(huì)出現(xiàn)亂碼
8. 可對(duì)email socket connection 進(jìn)行pool,提高性能
9. 在發(fā)送和接收時(shí),Email Message需要序列化下來,并可反序列化。在發(fā)送時(shí),偶爾也會(huì)衰地遇到SMTP服務(wù)器down掉的情況,這時(shí)email message需要能夠備份下來,并能自動(dòng)retry重發(fā)。
上文: 在JavaMail的基礎(chǔ)上構(gòu)建自己的Email Channel(1):基礎(chǔ)知識(shí)