閱讀43 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 網絡編程之基於SMTP發送電子郵件

        本文主要講述基於C#網絡編程的發送郵件的編程,郵件發送功能是基於郵件協議的,常見的電子郵件協議有SMTP(簡單郵件傳輸協議)、POP3(郵局協議)、IMAP(Internet郵件訪問協議),文章主要參考周存傑的《C#網絡編程實例教程》.這也是最後一篇參照該書的網絡編程文章,之後的該係列文章都是基於網絡實際應用的,不會再大量講述原理知識.

一.SMTP協議

        SMTP協議是TCP/IP協議家族定義的機器間交換郵件的標準,它主要負責底層郵件係統如何將一個報文從一台機器傳輸到另一台機器,而不關心郵件如何存儲及傳輸速度.它的步驟基本如下:
       
客戶端首先建立與服務器TCP連接,然後服務器發送220報文(服務就緒),客戶端收到220報文後發送HELLO命令,服務器收到HELLO後作出響應,最後服務器和客戶端可以開始郵件通信.
       
本文不準備對SMTP命令(該命令定義了郵件傳輸或用戶定義的係統功能)和SMTP應答狀態碼進行描述,你隻需要知道使用SMTP發送郵件的操作通常如下:
       
1.由MAIL命令(用於將郵件發送到一個多個郵箱)開始給出發送者標識,RCPT命令(用於確定郵件內容的接受者)給出接受者信息.
        2.用DATA命令(用於郵件內容加入緩衝區,<CRLF>.<CRLF>標識結束)列出發送郵件的內容.
        3.郵件內容指示符確認操作,如果此命令被接受,接收方返回一個250 OK應答.
       
.NET平台上SmtpMail類實現了對SMTP協議的封裝.所以我主要通過這些類介紹如何SMTP郵件收發.
        POP3:Post Office Protocol,目前版本為POP3,它是把郵件從電子郵箱中傳輸到本地計算機的協議.
        IMAP:Internet Message Access Protocol,是POP3的一種替代協議,提供了郵件檢索和郵件處理的新功能,用戶可以完全不必下載郵件正文就可以看到郵件的標題摘要,從郵件客戶端軟件就可以對服務器上的郵件和文件夾目錄進行操作.

二.SMTP協議封裝的類(舊版)

        1.SmtpMail類
        該類用於發送郵件,其命名空間為System.Web.Mail.該類常用屬性隻有一個:
        public static string SmtpServer {get; set;}
        獲取或設置SMTP服務器名稱,如不設置將使用本地主機名.如果提示添加命名空間不存在,需要在項目中添加引用,添加System.Web.dll即可.

//SMTP類常用方法
//構造方法
public SmtpMail();

//Send()方法 發送郵件 返回值:無
public static void Send(
    MailMessage message //郵件
);
public static void Send(
    string from,        //發送者地址
    string to,          //收信人地址
    string subject,     //郵件主題
    string messageText  //郵件內容
);

        2.MailMessage類
        其命名控件為System.Web.Mail,該類用於設置郵件內容以及與郵件內容相關的信息,如發送人地址、收信人地址等.

//MailMessage常用屬性
//1.Attachments屬性 用於獲取附件的文件列表
public IList Attachments {get;}
//2.Bcc屬性 用於獲取或設置暗送於地址,被暗送者的地址
public string Bcc {get; set;}
//3.Body屬性 用於獲取或設置郵件內容
public string Body {get; set;}
//4.BodyFormat屬性 用於獲取或設置郵件內容的格式 有Html Text格式
public MailFormat BodyFormat {get; set;}
//5.Cc屬性 用於獲取或設置抄送於地址,被抄送者的地址
public string Cc {get; set;}
//6.From屬性 用於獲取或設置發信人的地址
public string From {get; set;}
//7.Headers屬性 用於獲取郵件標頭
public IDictionary Headers {get;}
//8.Priority屬性 用於獲取或設置郵件的優先級,包括High Low Normal
public MailPriority Priority {get; set;}
//9.Subject屬性 用於獲取或設置郵件的主題
public string Subject {get; set;}
//10.To屬性 用於獲取或設置郵件的收信人地址
public string To {get; set;}

//構造方法
 public MailMessage();

        3.MailAttachment類
        該類用於構造和設置郵件的附件,命名空間為System.Web.Mail.

//MailAttachment類常用屬性
//Encoding屬性 用於設置附件的編碼
public MailEncoding Encoding {get;}
//Filename屬性 用於設置附件的文件名
public string Filename {get;}

//構造方法
public MailAttachment(
    string filename        //文件名
);
public MailAttachment(
    string filename,       //文件名
    MailEncoding encoding  //編碼
);

三.SMTP協議封裝的類(新版)

        使用舊版的SMTP可能會出現很多錯誤,譬如“SendUsing 配置值無效”或“服務器未響應”等,但是它與新版的方法及屬性基本沒有變換.
       
C#更新的smtp命名空間為System.Net.Mail,其中SmtpClient類用於smtp發送郵件.
        1.Host屬性用於設置主機名或IP地址
        2.Port屬性用於設置SMTP事務端口
        3.Credentials屬性用於驗證寄件者的認證
        4.DeliveryMethod屬性用於指定如何處理待送的電子郵件訊息
        5.Send方法用於將電子郵件發送到 SMTP 服務器以便傳遞

       
MailMessage類中屬性也有變化,如To屬性(郵件收信人地址屬性)變為隻讀屬性需要通過Add函數添加收件人郵件地址,但大體都與舊版的相同.
        Attachment類是在System.Net.Mail中新增,表示電子郵件的附件,以前System.Web.Mail中的是MailAttachment類.下麵是具體的發送郵件的實例源代碼及效果:

//添加命名空間
using System.Net.Mail;

//添加私有成員
private MailMessage msg;      //用於構造郵件屬性和方法
private Attachment att;       //用於構造郵件附件屬性和方法

public Form1()
{
    InitializeComponent();
    msg = new MailMessage();  //實例化
}

//點擊"發送郵件"按鈕
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        //To郵件收信人地址屬性 隻讀屬性不能賦值
        msg.To.Add(textBox1.Text);
        //From郵件發件人地址屬性
        msg.From = new MailAddress(textBox2.Text);
        //Subject郵件主題屬性
        msg.Subject = textBox3.Text;
        msg.SubjectEncoding = Encoding.Default;
        //Body設置郵件內容屬性
        msg.Body = richTextBox1.Text;
        msg.BodyEncoding = Encoding.Default;

        //設置郵件的優先級Priority屬性
        if (radioButton1.Checked)
            msg.Priority = MailPriority.High;
        else if (radioButton2.Checked)
            msg.Priority = MailPriority.Low;
        else if (radioButton3.Checked)
            msg.Priority = MailPriority.Normal;
        else
            msg.Priority = MailPriority.Normal;

        //發送郵件
        SmtpClient client = new SmtpClient();
        //郵件服務器設置smtp端口 默認25
        client.Host = "smtp.163.com";           
        client.Port = 25;                       
        //郵件發送方式 通過網絡發送到SMTP服務器
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        //憑證 發件人登錄郵箱的用戶名和密碼
        client.Credentials = new System.Net.NetworkCredential("1520161xxxx", "19911203xxxx");
        client.Send(msg);
        MessageBox.Show("郵件發送成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);  
    }
    catch (Exception m) //異常處理
    {
        MessageBox.Show(m.Message);
    }
}

//點擊"添加附件"按鈕
private void button2_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.CheckFileExists = true;  //不存在文件名顯示警告
    openFileDialog.ValidateNames = true;    //值接受Win32文件
    openFileDialog.Multiselect = false;     //不允許多選文件
    openFileDialog.Filter = "所有文件(*.*)|*.*";
            
    //添加附件 現僅支持添加一個附件
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        richTextBox1.Text = openFileDialog.FileName;
        att = new Attachment(openFileDialog.FileName);
        msg.Attachments.Add(att);
    }
}

//點擊"刪除附件"按鈕
private void button3_Click(object sender, EventArgs e)
{
    msg.Attachments.Clear();
}

        運行結果如下圖所示:


        這僅僅是C#使用SMTP發送郵件的基礎知識,讀者可以自己完善做成更好的界麵.

四.總結

        你也可以調用Windows自帶的郵件發送程序實現,Windows自帶Outlook Express軟件,可以通過函數ShellExecute()或CreateProcess()調用Outlook Express,Ctrl+R調用"運行",輸入“mailto:eastmount@163.com”即可調用發送郵件.使用該軟件時首先需要測試賬戶,我綁定的是163郵箱.讀者感興趣可以自己完成.
        本文主要講述C#網絡編程中SMTP郵件協議,如何發送郵件的過程,並比較了新版的和舊版的方法.這將是我的C#網絡編程的最後一篇文章,接下來想學習C#網絡編程爬蟲、下載網上圖片、數據挖掘結合之類的知識.希望文章對大家有所幫助,如果有錯誤或不足之處,請海涵!目前法國VS瑞士 3:0.
 (By:Eastmount 2014-6-21 夜4點 原創CSDN https://blog.csdn.net/eastmount/)
        推薦相參考的關資料,非常不錯,值得學習:
        1.[C# 網絡編程係列]專題十:實現簡單的郵件收發器 -- Learning_Hard

        https://blog.csdn.net/learning_hard/article/details/9071041
        2.C#使用163的SMTP服務器發送郵件  -- PowerCoder
       
https://www.cnblogs.com/OpenCoder/archive/2010/07/16/1779247.html
        3.C#郵件下載 -- zhouquanandy
       
https://download.csdn.net/detail/zhouquanandy/4444802
        4.《C#網絡編程實例教程》-- 周存傑
        5.C#發送郵件(添加附件)-- 期待秋天的葉
        https://blog.csdn.net/kkkkkxiaofei/article/details/7941239

最後更新:2017-04-03 07:57:12

  上一篇:go ArcObjects與ArcGIS Engine
  下一篇:go JAVA線程中的生產者和消費者問題