新聞中心
發(fā)送郵件動(dòng)態(tài)內(nèi)容是B2B平臺(tái)的重要功能,起到與用戶(hù)溝通,訂單的處理等功能。通過(guò)HTML發(fā)送郵件動(dòng)態(tài)內(nèi)容是本文的重要部分。

需求:
一個(gè)B2B系統(tǒng)在注冊(cè)用戶(hù)申請(qǐng)買(mǎi)家,申請(qǐng)審批通過(guò),訂單創(chuàng)建,申批通過(guò)時(shí)都需要發(fā)送郵件,郵件內(nèi)容需要包括一些比較正規(guī)的格式,而且其中會(huì)包含用戶(hù)信息,訂單信息這些動(dòng)態(tài)內(nèi)容。另外郵件內(nèi)容以后可能會(huì)頻繁調(diào)整,需要有比較靈活的定制化。
實(shí)現(xiàn):
了解過(guò)這個(gè)需求后,大概想到了或找到了幾種實(shí)現(xiàn):
1.通過(guò)代碼構(gòu)造郵件內(nèi)容,對(duì)于其中的動(dòng)態(tài)的內(nèi)容,直接拼湊。優(yōu)點(diǎn)是最直接,不會(huì)涉及其它的技術(shù)思考。缺點(diǎn)是需要繁瑣的拼接代碼,不容易直接看到顯示效果,不方便發(fā)現(xiàn)問(wèn)題,對(duì)后不調(diào)整的話不容易修改。
2.和上面的方法類(lèi)似,但是一個(gè)文件中只指定好固定的格式,把變化的部分用特定的字符代替,由程序讀取這個(gè)”模板“文件內(nèi)容,用具體內(nèi)容替換模板文件中的指定字符即可。優(yōu)點(diǎn)是實(shí)現(xiàn)比較簡(jiǎn)單,固定的部分比較容易控制和修改,但是動(dòng)態(tài)讀取的內(nèi)容部分比較難以實(shí)現(xiàn)和維護(hù)。由于郵件中的內(nèi)容并不是簡(jiǎn)單的幾個(gè)字符,而是說(shuō)整個(gè)訂單信息,這其中包括單頭和單身列表,而且其中會(huì)有比較特殊的格式顯示控制。 所以使用這個(gè)方法也不合適。
相關(guān)連接:http://www.c-sharpcorner.com/UploadFile/dsdaf/sendEmailTemplate09292006221150PM/sendEmailTemplate.aspx
3.使用頁(yè)面來(lái)表示需要發(fā)送的郵件內(nèi)容,然后請(qǐng)求這個(gè)頁(yè)面生成的Html直接作為發(fā)送內(nèi)容。在這里可以使用用戶(hù)控件代替普通的APSX文件,在用戶(hù)控件的前臺(tái),我們直接象顯示頁(yè)面內(nèi)容那樣來(lái)顯示我們的郵件內(nèi)容:
MailTemplate.ascx
cellpadding="2" width="80%">
訂單號(hào): <%=Order.OrderNo%>
客戶(hù)編號(hào):<%=Order.CardCode%>
下單日期:<%=Order.CreateDate%>
運(yùn)費(fèi):<%=Order.Freight%>
交易幣種:<%=Order.Currency%>
送貨地址:<%=Order.ShipAddress%>
具體的交貨時(shí)將將由我們的客服人員與您聯(lián)系協(xié)商
align="center">
產(chǎn)品編號(hào)
單位
數(shù)量
單價(jià)
<% foreach (SendMailTemplate.OrderItem item in Order.OrderItems)
{ %><%=item.ItemCode%>
<%=item.Unit%>
<%=item.Quantity%>
<%=item.BasicPrice%>
<%} %>
這里只列出來(lái)代碼的一個(gè)片段,郵件還包括其它的一些固定的內(nèi)容,詳細(xì)的請(qǐng)直接下載源代碼查看,其中包括實(shí)體類(lèi)的代碼這里也就不再列出來(lái)了。在用戶(hù)控件的后臺(tái),我們只需要添加一個(gè)公開(kāi)的屬性:
1: public Order Order
2: {3: get;
4: set;
5: }
然后我們需要?jiǎng)討B(tài)加載這個(gè)用戶(hù)控件,指定屬性,再輸出成Html屬性即可:
1: Order order = Tools.CreateOrder();
2: Control mailTemplate = LoadControl("MailTemplate.ascx");3:
4: ((MailTemplate)mailTemplate).Order = order;
5: StringBuilder stringBuilder = new StringBuilder();
6: StringWriter stringWriter = new StringWriter(stringBuilder);
7: HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
8: mailTemplate.RenderControl(htmlTextWriter);
9: htmlTextWriter.Close();
10:
11: //發(fā)送郵件
12: MailMessage mm = new MailMessage();
13: mm.Subject = string.Format("您的訂單({0}) -- 訂單已經(jīng)確認(rèn)", order.OrderNo);14: mm.IsBodyHtml = true;
15: mm.To.Add("lonely_7345@hotmail.com");16: mm.Body = stringBuilder.ToString();
17: Tools.SendEmail(mm);
在這里我們也省略發(fā)郵件的代碼,運(yùn)行,查看一下收到的郵件,OK.
使用這種方法應(yīng)該是比較快捷的,相對(duì)于以上來(lái)說(shuō)靈活了不少,格式容易控制,以后修改起來(lái)也比較方便。不過(guò)就是模板文件和代碼文件混在一起。
4.使用模板引擎,比如Nvelocity,StringTemplate。因?yàn)橹敖佑|過(guò)Nvelocity,所以嘗試了使用Nvelocity,具體有關(guān)的配置可以參照這個(gè)文章 http://www.cnblogs.com/McJeremy/archive/2008/06/25/1229848.html
Nvelocity的模板文件和上面我們的方法也是相當(dāng)類(lèi)似的。
1:
7: 訂單號(hào):$order.OrderNo 8: | 10: 客戶(hù)編號(hào):$order.CardCode 11: | 13: 下單日期:$order.CreateDate 14: | ||||||||
18: 運(yùn)費(fèi):$order.Freight 19: | 21: 交易幣種:$order.Currency 22: | 24: 25: | ||||||||
29: 30: | ||||||||||
34: 送貨地址:$order.ShipAddress 35: | ||||||||||
41: 具體的交貨時(shí)將將由我們的客服人員與您聯(lián)系協(xié)商 42: | ||||||||||
48: 49:
85: 86: | ||||||||||
不同的是,我們的模板文件是單獨(dú)的一個(gè)文件,而我們只需要加載這個(gè)模板文件,指定參數(shù)就可以了。
1: public static VelocityEngine InitVelocity()
2: {3: //創(chuàng)建NVelocity引擎的實(shí)例對(duì)象
4: VelocityEngine velocity = new VelocityEngine();
5: //初始化該實(shí)例對(duì)象
6: ExtendedProperties props = new ExtendedProperties();
7: props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
8: props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.HttpContext.Current.Server.MapPath("\\mailTemplate"));9: props.AddProperty(RuntimeConstants.INPUT_ENCODING, "gb2312");
10: props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "gb2312");
11: velocity.Init(props);
12: return velocity;
13: }
14:
15: private void SendOrderConfirmdEmail()
16: {17: VelocityEngine velocity = InitVelocity();
18: //從文件中讀取模板
19: Template temp = velocity.GetTemplate("CreateOrderMail.vm");20:
21: Order order = Tools.CreateOrder();
22: IContext context = new VelocityContext();
23: context.Put("order", order);24: //合并模板
25: StringWriter writer = new StringWriter();
26: temp.Merge(context, writer);
27:
28: //發(fā)送郵件
29: MailMessage mm = new MailMessage();
30: mm.Subject = string.Format("您的訂單({0}) -- 訂單已經(jīng)確認(rèn)", order.OrderNo);31: mm.IsBodyHtml = true;
32: mm.To.Add("lonely_7345@hotmail.com");33: mm.Body = writer.GetStringBuilder().ToString();
34: Tools.SendEmail(mm);
35: }
在這里需要注意的是上面的第8行,這里需要加載的是你的模板文件所在父級(jí)物理路徑,我把模板文件放在mailTemplate文件夾下面。運(yùn)行,我們可以看到結(jié)果和上面的是一樣一樣的。這個(gè)方法要求對(duì)這個(gè)模板引擎有些了解,其實(shí)還是沒(méi)有啥難度的。帶來(lái)了比較大的靈活性,模板文件可以創(chuàng)建一個(gè)功能模塊,允許用戶(hù)編輯修改,而不會(huì)造成編譯錯(cuò)誤。
5.使用通常的XML+Xsl的方式生成html,這也是很容易想到的一個(gè)方法。但是由于發(fā)送郵件的點(diǎn)實(shí)在太多,使用這種方法編寫(xiě)的難度比較大了,而且需要匹配每個(gè)屬性,不可取。
6.搜索了一下有沒(méi)有相關(guān)的開(kāi)源項(xiàng)目,只搜索到了一個(gè)Email Template Framework,是通過(guò)xml文件來(lái)配置發(fā)送的選項(xiàng)和郵件的內(nèi)容,但是看介紹覺(jué)得對(duì)于比較簡(jiǎn)單的格式應(yīng)該能夠?qū)崿F(xiàn),但是比較復(fù)制的夾雜著比較多的html的郵件內(nèi)容,有可能會(huì)遇到問(wèn)題,另外由于時(shí)間問(wèn)題,應(yīng)盡量少用比較少見(jiàn)的開(kāi)源項(xiàng)目,避免遇到不能解決的問(wèn)題。
參照:http://www.bitethebullet.co.uk/EmailTemplateFramework/tabid/58/Default.aspx
結(jié)論:
1.通往一個(gè)目的地的途徑真的很多,大概了解了以上幾種方法之后,最后還是決定使用nvelocity模板的方式來(lái)完成這個(gè)功能,完成幾個(gè)點(diǎn)的郵件發(fā)送只用了半個(gè)小時(shí)。當(dāng)然,應(yīng)該還有更多的方法,更簡(jiǎn)單的方法,如果您有不同的思路和想法,請(qǐng)?jiān)谠u(píng)論中分享.
2.往往在研究某個(gè)技術(shù)的本身,有時(shí)會(huì)在遇到具體的功能問(wèn)題時(shí),反而不會(huì)把技術(shù)和實(shí)現(xiàn)聯(lián)系起來(lái)。而只有聯(lián)系起來(lái)才能夠使技術(shù)產(chǎn)生實(shí)用價(jià)值。
新聞標(biāo)題:實(shí)現(xiàn)B2B平臺(tái)發(fā)送郵件動(dòng)態(tài)內(nèi)容的幾種思路
網(wǎng)站網(wǎng)址:http://m.5511xx.com/article/cocchco.html


咨詢(xún)
建站咨詢(xún)
