1. 程式人生 > >ASP.NET自動傳送郵件功能的實現

ASP.NET自動傳送郵件功能的實現

實現傳送郵件功能

首先說一下在.Net下如何傳送郵件。.Net已經為我們準備好了與傳送郵件相關的類,只要直接呼叫即可,非常方便。下面是我自己寫的一個郵件通知類:

///<summary>

///郵件通知服務類。

///</summary>

publicclassEmailNotificationService{

///<summary>

///構造一個郵件通知服務類的例項。

///</summary>

///<param name="smtpService">SMTP伺服器的IP地址</param>

///<param name="enableSSL">是否使用

SSL連線SMTP伺服器器</param>

///<param name="port">SMTP伺服器埠</param>

///<param name="loginName">用於登入SMTP伺服器的使用者名稱</param>

///<param name="password">登入密碼</param>

publicEmailNotificationService(

stringsmtpService,

boolenableSSL,

intport,

stringloginName,

stringpassword) {

this.m_smtpService = smtpService;

this.m_loginName = loginName;

this.m_password = password;

this.m_enableSSL = enableSSL;

this.m_port = port;

}

privatereadonlystringm_smtpService;

privatereadonlystringm_loginName;

privatereadonlystringm_password;

privatereadonlyboolm_enableSSL;

privatereadonlyintm_port;

///<summary>

///傳送郵件通知到指定的

EMAIL地址。

///</summary>

///<param name="senderName">顯示在發件人一欄上的名稱</param>

///<param name="address">目的EMAIL地址</param>

///<param name="title">郵件標題</param>

///<param name="content">郵件內容</param>

publicvoidSendTo(stringsenderName,stringaddress,stringtitle,stringcontent) {

MailMessagemail =newMailMessage();

mail.To.Add(address);

mail.From =newMailAddress(this.m_loginName, senderName,Encoding.UTF8);

mail.Subject = title;

mail.Body = content;

mail.BodyEncoding =Encoding.UTF8;

mail.IsBodyHtml =false;

mail.Priority =MailPriority.Normal;

SmtpClientsmtp =newSmtpClient();

smtp.Credentials =newNetworkCredential(this.m_loginName,this.m_password);

smtp.Host =this.m_smtpService;

smtp.EnableSsl =this.m_enableSSL;

smtp.Port =this.m_port;

smtp.Send(mail);

}

}

在使用時,首先構造一個EmailNotificationService類,再呼叫SendTo方法即可。例如:

EmailNotificationService mailNotificationService = new EmailNotificationService("smtp.gmail.com", true, 587, "[email protected]", "LoginPassword");

mailNotificationService.SendTo("SenderName", "[email protected]", "Title", "Content");

傳送郵件實現方案

上面建立好了一個負責傳送郵件的類,接下來的問題是應該在什麼時候呼叫這個類。傳送電子郵件需要進行網路通訊,耗時比較多,而且SmtpClientSend方法是會阻塞呼叫執行緒的,一旦呼叫了該方法,就要等到郵件傳送完畢或出錯才能結束方法呼叫,所以不能將對EmailNotificationService的呼叫放在ASP.NET頁面的程式碼中。如果這麼做,客戶端就要等待很長時間才能獲得響應,使用者體驗是比較差的。

SmtpClient還有一個SendAsync方法,該方法與Send方法的區別是,SendAsync是非同步的,呼叫該方法之後會產生一個新的執行緒來負責傳送郵件,之後呼叫執行緒立即返回,不會再等待郵件傳送結束。那麼我們是不是可以用SendAsync代替Send,並在頁面程式碼中呼叫呢?答案是否定的,雖然客戶端可以很快獲得相應,但郵件根本沒有傳送出去。這是由ASP.NET頁面生命週期的特性決定的,客戶端向伺服器的每一次請求,頁面都會經歷一個由產生到銷燬的過程,當頁面銷燬的時候,負責傳送郵件的執行緒還沒有完成傳送郵件的工作就被強制結束了。

由於ASP.NET頁面生命週期的特性,我們不能將呼叫程式碼放在頁面的程式碼中。我們需要一個與頁面無關的執行緒,一個在網站執行時始終存在的執行緒。我的方案是使用一個全域性物件來管理一個髮送郵件執行緒,同時維護一個待發送郵件連結串列。當全域性物件建立的時候,連結串列中沒有任何內容,傳送郵件執行緒處於掛起狀態。當某個頁面中的處理需要傳送電子郵件時,就將與傳送郵件相關的資訊新增到待發送郵件連結串列中。此時連結串列不為空,傳送郵件執行緒開始工作,逐個取出連結串列中的郵件資訊併發送,一直到連結串列為空,再次進入掛起狀態。如此迴圈反覆。

實現傳送郵件功能

基本的構思已經確定好了,接下來就是寫程式碼實現了。首先定義一個類來封裝待發送郵件的相關資訊,本文開頭已經說過要以一個網上投稿系統作為例子,所以這裡所用的資訊與該應用有關。

///<summary>

///封裝傳送郵件時所需資訊的類。

///</summary>

publicclassMailNotifyInfo{

///<summary>

///獲取或設定稿件的標題。

///</summary>

publicstringTitle {

get;

set;

}

///<summary>

///獲取或設定稿件的作者名稱。

///</summary>

publicstringAuthor {

get;

set;

}

///<summary>

///獲取或設定作者的電子郵件地址。

///</summary>

publicstringEmailAddress {

get;

set;

}

///<summary>

///獲取或設定稿件的狀態。

///</summary>

publicArticleStatusArticleStatus {

get;

set;

}

}

然後是全域性物件類的定義,我使用了單件模式來實現其全域性性。

///<summary>

///處理郵件傳送功能的類。

///</summary>

publicclassNotificationHandler{

///<summary>

///該類的靜態例項。

///</summary>

privatestaticreadonlyNotificationHandlerg_instance =newNotificationHandler();

///<summary>

///獲取該類的唯一例項。

///</summary>

publicstaticNotificationHandlerInstance {

get{

returng_instance;

}

}

///<summary>

///預設構造方法。

///</summary>

privateNotificationHandler() {

this.m_lockObject =newobject();

this.m_mailNotifyInfos =newLinkedList<MailNotifyInfo>();

this.m_threadEvent =newManualResetEvent(false);

this.m_workThread =newThread(this.ThreadStart);

this.m_workThread.Start();

}

privatereadonlyLinkedList<MailNotifyInfo> m_mailNotifyInfos;

privatereadonlyThreadm_workThread;

privatereadonlyManualResetEventm_threadEvent;

privatereadonlyObjectm_lockObject;

///<summary>

///新增待發送郵件的相關資訊。

///</summary>

publicvoidAppendNotification(MailNotifyInfomailNotifyInfo) {

lock(this.m_lockObject) {

this.m_mailNotifyInfos.AddLast(mailNotifyInfo);

if(this.m_mailNotifyInfos.Count != 0) {

this.m_threadEvent.Set();

}

}

}

///<summary>

///傳送郵件執行緒的執行方法。

///</summary>

privatevoidThreadStart() {

while(true) {

this.m_threadEvent.WaitOne();

MailNotifyInfomailNotifyInfo =this.m_mailNotifyInfos.First.Value;

EmailNotificationServicemailNotificationService =newEmailNotificationService("smtp.gmail.com",true, 587,"[email protected]","LoginPassword");

mailNotificationService.SendTo("稿件中心",

mailNotifyInfo.EmailAddress,

"稿件狀態變更通知",

String.Format("{0}你的稿件{1}狀態已變更為{2}", mailNotifyInfo.Author, mailNotifyInfo.Title, mailNotifyInfo.ArticleStatus));

lock(this.m_lockObject) {

this.m_mailNotifyInfos.Remove(mailNotifyInfo);

if(this.m_mailNotifyInfos.Count == 0) {

this.m_threadEvent.Reset();

}

}

}

}

該類比較簡單,首先在建構函式中初始化成員變數,然後啟動傳送郵件執行緒,此時該執行緒是掛起的。

當外部呼叫AppendNotification方法時,會在連結串列中新增一個MailNotifyInfo物件,然後喚醒傳送郵件執行緒。由於在生產環境下可能會出現同時呼叫AppendNotification方法的情形,所以這裡要進行同步。

傳送郵件執行緒喚醒後進入一個死迴圈,等待事件物件觸發。當事件物件出發之後就開始傳送郵件了。郵件傳送完畢後從連結串列中刪除已傳送的郵件,然後檢查連結串列是否為空,如果是則重置事件物件,重新進入掛起狀態。同樣地,在對連結串列進行操作時也要進行同步。

至此,傳送郵件的功能實現完畢。需要傳送郵件的時候只要像這樣呼叫即可:

MailNotifyInfo mailNotifyInfo = new MailNotifyInfo();

.....

NotificationHandler.Instance.AppendNotification(mailNotifyInfo);

這只是一個很粗陋的框架,而且還不完善。例如,這裡假設網站是不間斷執行的系統,沒有考慮當網站關閉時傳送郵件執行緒的處理。大家可以在這個基礎上添磚加瓦,使其更加完善。另外,自動傳送郵件也是常見的功能,例如定時檢查某個條件,如果成立則傳送郵件。要實現自動傳送郵件的話,只要對本文的方案稍加修改即可:在NotificationHandler中新增一個Timer,定時執行某個方法,在這個方法中進行條件檢查並觸發事件即可。

相關推薦

ASP.NET自動傳送郵件功能實現

實現傳送郵件功能 首先說一下在.Net下如何傳送郵件。.Net已經為我們準備好了與傳送郵件相關的類,只要直接呼叫即可,非常方便。下面是我自己寫的一個郵件通知類: ///<summary> ///郵件通知服務類。 ///</summary> publi

C# 傳送郵件功能實現

郵件傳送功能在OA以及一些網站驗證中很常用。下面是郵件傳送的一個函式,引數傳入收件人地址,郵件主題,郵件內容,讀者可根據自己的需求新增郵件的附件或者抄送人等。  /// <summary> /// 傳送郵件 /// </su

python的yagmail庫-自動傳送郵件功能

一、yagmail安裝 使用pip install yagmail命令安裝。我的環境是python2.7.15,使用pip直接安裝就ok了。 二、例項 1、開通SMTP服務 檢查使用的郵箱伺

SSM 框架整合 spring 傳送郵件功能實現

基於SSM的 spring 傳送郵件的實現 由於考慮到專案中需要,如果程式出現異常或其它問題,可以傳送郵件來及時提醒後臺維護人員處理。所以目前考慮使用JavaMail來實現郵件傳送!如下,是我整理的一些內容,做個筆記記錄下:(當然,在這功能實現之前,需要搭建好

C#中自動傳送郵件實現

原始碼: using System; using System.Windows.Forms; using System.Net.Mail; using System.Text.RegularExpressions; namespace 郵件 { public partial clas

SMTP自動傳送郵件功能程式碼

SMTP自動傳送郵件功能 我也是跟著各種部落格一步一步搜尋出來的,可能在設定郵箱的時候會有各種問題,請參考我的其他部落格進行設定 https://blog.csdn.net/ly021499/article/details/82423019 https://blog.csdn.net/l

SpringBoot 傳送郵件功能實現

背景 有個小夥伴問我你以前發郵件功能怎麼弄的。然後我就給他找了個demo,正好在此也寫一下,分享給大家。 理清痛點 傳送郵件,大家可以想一下,坑的地方在哪? 我覺得是三個吧。 第一:郵件白名單問題。 第二:郵件超時問題。 第三:郵件帶附件問題。 我下面的demo都會介紹這些問題及解決。 實現方案 準備工作 我

Jenkins+maven+git 實現自動構建、許可權管理、靜態程式碼檢測、遠端部署、傳送郵件功能

Jenkins配置 1. 使用者許可權設定 配置->Configure Global Security (注:想讓匿名使用者可以瀏覽jenkins網站 需勾選Overall 中的read 和 Job

node.js實現傳送郵件功能

準備事項 QQ郵箱設定:進入QQ郵箱->設定->賬戶->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務->開啟POP3/SMTP服務,並複製pass祕鑰 安裝nodemailer :npm install nodem

log4j實現傳送郵件功能

引言 最近預上線的一個機器人專案,因為這個專案中有很多的AI的東西,整個專案分為三部分組成,web工程——FS——NLU,整個web工程都是由我來負責,後面兩部分有大資料部門的東西負責,因為後面這兩部分對於我們貸後行業來說都是比較超前的,所以在整個連調的過程中會有很多的異常

Linux使用mail功能自動傳送郵件程式以及經常遇到的問題

在實現Linux中mail功能自動傳送郵件時,需要傳送中文內容,以及中文主題的郵件。 整個實現過程中遇到了三大問題,如下: 1、如何傳送html格式的郵件內容? 2、如何傳送中文內容的郵件? 3、如何傳送中文標題的郵件?(在解決這個問題時話費不少時間) 4、傳送的郵件內容以

ASP.NET的FileUpload控制元件實現帶對話方塊的FTP檔案上傳功能

      最近不得已開始做網頁,一個ASP.NET的專案,需要實現FTP上傳功能,於是上網廣搜程式碼,發現FTP上傳的程式碼到處都是,隨手拈來,可是一般來說客戶端上傳檔案都需要一個檔案選擇對話方塊,正好自帶的FileUpload控制元件能夠實現。但是網上搜到FileUpl

實現傳送郵件功能

原文出自:www.hangge.com 轉載請保留原文連結:http://www.hangge.com/blog/cache/detail_792.html 使用MessageUI.framework框架除了可以傳送簡訊,還能傳送Email,步驟如下: (

JavaWeb中使用JavaMail實現傳送郵件功能例項詳解

現在很多的網站都提供有使用者註冊功能, 通常我們註冊成功之後就會收到一封來自注冊網站的郵件。郵件裡面的內容可能包含了我們的註冊的使用者名稱和密碼以及一個啟用賬戶的超連結等資訊。今天我們也來實現一個這樣的功能,使用者註冊成功之後,就將使用者的註冊資訊以Email的形式傳送到使

JAVA實現傳送郵件功能

/** * 傳送郵件功用方法 * @param mailTo * @param html * @param userName */ public void sendEmployeeCommon(String mailTo , String html , Stri

thinkphp5中使用phpmailer實現傳送郵件功能

一、開啟SMTP服務(使用php傳送郵件需要用到SMTP服務,這裡以163郵箱的SMTP服務為例)。 1.登入163郵箱,在首頁上找到“設定”。 2.選擇開啟的服務,一般都全選,POP3/SMTP/IMAP,開啟SMTP服務就得先開通客戶授權碼。 3.點選開通客戶授權

thinkphp5中使用phpmailer實現傳送郵件功能 及自己遇到的坑

一、開啟SMTP服務(使用php傳送郵件需要用到SMTP服務,這裡以163郵箱的SMTP服務為例)。 1.登入163郵箱,在首頁上找到“設定”。 2.選擇開啟的服務,一般都全選,POP3/SMTP/IMAP,開啟SMTP服務就得先開通客戶授權碼。 3.點選

Django實現傳送郵件功能

最近用python寫了官網的後臺。官網的後臺功能比較簡單,一個多語言支援,一個聯絡我們,即給公司發郵件的功能。多語言支援的方式寫在另一篇部落格了。這裡先來說一說Django的傳送郵件功能。 其實pyt

Flask實現傳送郵件功能

郵件服務用途較多,如:註冊時驗證使用者、找回密碼、線上程式出現重大bug時觸發郵件提醒以及伺服器關鍵資料(CPU、網路、記憶體)監控提醒等,可以說隨處可以用到,下面講解了一個使用flask_mail實現的郵件傳送功能,有完整程式碼,測試可行。首先下載依賴庫flask_mail

實現自動郵件功能

.text 函數 stp con tps desc htm -s lambda 在實際的項目中,當腳本執行完畢,生成測試報告,我們需要把報告通過郵件發送到對應的測試人員和開發人員,下面學習下在Python中如何實現郵件發送功能,在Python中提供了smtplib模塊來發送