程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C# 網絡編程之基於SMTP發送電子郵件

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

編輯:C#基礎知識

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

一.SMTP協議

        SMTP協議是TCP/IP協議家族定義的機器間交換郵件的標准,它主要負責底層郵件系統怎樣將一個報文從一台機器傳輸到還有一台機器,而不關心郵件怎樣存儲及傳輸速度.它的步驟基本例如以下:
       
client首先建立與serverTCP連接,然後server發送220報文(服務就緒),client收到220報文後發送HELLO命令,server收到HELLO後作出響應,最後server和client能夠開始郵件通信.
       
本文不准備對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的一種替代協議,提供了郵件檢索和郵件處理的新功能,用戶能夠全然不必下載郵件正文就能夠看到郵件的標題摘要,從郵件client軟件就能夠對server上的郵件和文件夾文件夾進行操作.

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

        1.SmtpMail類
        該類用於發送郵件,其命名空間為System.Web.Mail.該類經常使用屬性僅僅有一個:
        public static string SmtpServer {get; set;}
        獲取或設置SMTPserver名稱,如不設置將使用本地主機名.假設提示加入命名空間不存在,須要在項目中加入引用,加入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 配置值無效”或“server未響應”等,可是它與新版的方法及屬性基本沒有變換.
       
C#更新的smtp命名空間為System.Net.Mail,當中SmtpClient類用於smtp發送郵件.
        1.Host屬性用於設置主機名或IP地址
        2.Port屬性用於設置SMTP事務port
        3.Credentials屬性用於驗證寄件者的認證
        4.DeliveryMethod屬性用於指定怎樣處理待送的電子郵件訊息
        5.Send方法用於將電子郵件發送到 SMTP server以便傳遞
       
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();
        //郵件server設置smtpport 默認25
        client.Host = "smtp.163.com";           
        client.Port = 25;                       
        //郵件發送方式 通過網絡發送到SMTPserver
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        //憑證 發件人登錄郵箱的username和password
        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:[email protected]”就可以調用發送郵件.使用該軟件時首先須要測試賬戶,我綁定的是163郵箱.讀者感興趣能夠自己完畢.
        本文主要講述C#網絡編程中SMTP郵件協議,怎樣發送郵件的過程,並比較了新版的和舊版的方法.這將是我的C#網絡編程的最後一篇文章,接下來想學習C#網絡編程爬蟲、下載網上圖片、數據挖掘結合之類的知識.希望文章對大家有所幫助,假設有錯誤或不足之處,請海涵!眼下法國VS瑞士 3:0.
 (By:Eastmount 2014-6-21 夜4點 原創CSDN http://blog.csdn.net/eastmount/)
        推薦相參考的關資料,很不錯,值得學習:
        1.[C# 網絡編程系列]專題十:實現簡單的郵件收發器 -- Learning_Hard

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved