很早的時候,大概是剛學習C#那會兒,就很想使用C#來發送自己的郵件,可是一直在網上都沒有找到合適的代碼,前陣子有幾個哥們兒在做Socket編程,一個區域網路辦公管理軟體,我就跟著看了看,主要實現了區域網路聊天、檔案傳輸、視頻和音頻聊天等功能,這個時侯我忽然又很想寫一個發送郵件的軟體了。沒辦法,只能再次一點一點的學習,在查了幾次MSDN之後,居然讓我給實現了,並且感覺還是蠻好用的,所以就拿出來給園友分享一下,寫的不夠清楚的地方,您就多多包含了,如果對你還有點協助,那就麻煩頂一下了。。。閑話就到這裡,馬上開始!
先做一個Windows應用程式,把介面設計成這個樣子:
圖1、程式設計介面
下面來一一介紹介面的控制項:
1、在寄件者資訊的groupbox中,先是一個下拉式清單,用來選擇SMTP伺服器,SMTP伺服器是為你提供發送郵件的伺服器,如果你使用的是163郵箱,那麼SMTP伺服器就是smtp.163.com;如果是Gmail,那麼SMTP伺服器就是smpt.gmail.com。使用者名稱是你在登陸該郵箱的名稱,比如我有一個gmail帳號youring2@gmail.com,那麼這裡就應該填寫youring2。要顯示的姓名是郵件接收方能夠看到的姓名,你可以隨便填寫,比如我想讓收件者知道這封郵件來自齊飛,那麼我這裡就填寫齊飛,這是一個非必選項,可以不填寫。郵箱密碼就是你的郵箱密碼,是123就填寫123,是456就填寫456,我這裡就不公開我的郵箱密碼了。
2、在收件者資訊的groupbox中,收件者姓名為要收到這封郵件人的姓名,可以填寫,也可以不填。例如我這封信是寫給youring2的,我就可以在這裡填寫youring2。Email是收件者的地址,如果我要發給youring2的163郵箱,我就可以填寫youring2@163.com。這個是一定要寫的,原因我就不說了。。。
3、郵件資訊裡面首先是主題,然後是附件,再然後是內容,這裡不再多說。點擊添加按鈕來添加附件,點擊刪除按鈕刪除選中的附件,點擊發送將郵件發送出去。
如果你的介面設計水平已經很厲害了,那麼就自己設計一個介面,直接到下面的代碼設計!
你需要添加命名空間: using System.Net.Mail;
using System.Net.Mime;
using System.Net;
using System.IO;
第一步,添加一個Form Load事件。在這個事件的代碼裡,主要實現表單初始化的工作。這些代碼同樣可以放在Form的建構函式中完成。
private void Form1_Load(object sender, EventArgs e)
{
//添加倆個smpt伺服器的名稱
cmbBoxSMTP.Items.Add("smtp.163.com");
cmbBoxSMTP.Items.Add("smtp.gmail.com");
//設定為下拉式清單
cmbBoxSMTP.DropDownStyle = ComboBoxStyle.DropDownList;
//預設選中第一個選項
cmbBoxSMTP.SelectedIndex = 0;
//在下面添加你想要初始化的內容,比如顯示姓名、使用者名稱等
}
第二步,添加一個"添加"按鈕的單擊事件。用來實現選擇檔案,並把檔案添加到TreeView中。
//添加按鈕的單擊事件
private void btnAdd_Click(object sender, EventArgs e)
{
//定義並初始化一個OpenFileDialog類的對象
OpenFileDialog openFile = new OpenFileDialog();
openFile.InitialDirectory = Application.StartupPath;
openFile.FileName = "";
openFile.RestoreDirectory = true;
openFile.Multiselect = false;
//顯示開啟檔案對話方塊,並判斷是否單擊了確定按鈕
if (openFile.ShowDialog() == DialogResult.OK)
{
//得到選擇的檔案名稱
string fileName = openFile.FileName;
//將檔案名稱添加到TreeView中
treeViewFileList.Nodes.Add(fileName);
}
}
第三步,添加一個"刪除"按鈕的單擊事件,用來實現選中一個TreeView項後,把該選項刪除掉。
//刪除按鈕的單擊事件
private void btnDelete_Click(object sender, EventArgs e)
{
//判斷是否選中了節點
if (treeViewFileList.SelectedNode != null)
{
//得到選擇的節點
TreeNode tempNode = treeViewFileList.SelectedNode;
//刪除選中的節點
treeViewFileList.Nodes.Remove(tempNode);
}
else
{
MessageBox.Show("請選擇要刪除的附件。");
}
}
第四步,也是最關鍵的一步,"發送"按鈕的單擊事件,用來實現發送郵件功能。
//發送按鈕的單擊事件
private void btnSend_Click(object sender, EventArgs e)
{
try
{
//確定smtp伺服器位址。執行個體化一個Smtp用戶端
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(cmbBoxSMTP.Text);
//產生一個發送地址
string strFrom = string.Empty;
if (cmbBoxSMTP.SelectedText == "smtp.163.com")
strFrom = txtUserName.Text + "@163.com";
else
strFrom = txtUserName.Text + "@gmail.com";
//構造一個寄件者地址對象
MailAddress from = new MailAddress(strFrom, txtDisplayName.Text, Encoding.UTF8);
//構造一個收件者地址對象
MailAddress to = new MailAddress(txtEmail.Text, txtToName.Text, Encoding.UTF8);
//構造一個Email的Message對象
MailMessage message = new MailMessage(from, to);
//為 message 添加附件
foreach (TreeNode treeNode in treeViewFileList.Nodes)
{
//得到檔案名稱
string fileName = treeNode.Text;
//判斷檔案是否存在
if (File.Exists(fileName))
{
//構造一個附件對象
Attachment attach = new Attachment(fileName);
//得到檔案的資訊
ContentDisposition disposition = attach.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(fileName);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(fileName);
disposition.ReadDate = System.IO.File.GetLastAccessTime(fileName);
//向郵件添加附件
message.Attachments.Add(attach);
}
else
{
MessageBox.Show("檔案" + fileName + "未找到!");
}
}
//添加郵件主題和內容
message.Subject = txtSubject.Text;
message.SubjectEncoding = Encoding.UTF8;
message.Body = rtxtBody.Text;
message.BodyEncoding = Encoding.UTF8;
//設定郵件的資訊
client.DeliveryMethod = SmtpDeliveryMethod.Network;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.IsBodyHtml = false;
//如果伺服器支援安全連線,則將安全連線設為true。
//gmail支援,163不支援,如果是gmail則一定要將其設為true
if (cmbBoxSMTP.SelectedText == "smpt.163.com")
client.EnableSsl = false;
else
client.EnableSsl = true;
//設定使用者名稱和密碼。
//string userState = message.Subject;
client.UseDefaultCredentials = false;
string username = txtUserName.Text;
string passwd = txtPassword.Text;
//使用者登陸資訊
NetworkCredential myCredentials = new NetworkCredential(username, passwd);
client.Credentials = myCredentials;
//發送郵件
client.Send(message);
//提示發送成功
MessageBox.Show("發送成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
下面是我的運行結果:
圖2、發送Email
現在開啟我的Gmail郵箱,看看是不是已經收到的郵件,我果然收到了,不信你看:
圖3、收件匣查看郵件
看到了吧,就是這麼簡單,趕緊動手自己做一個!最後需要說明一點,這裡用的是Send方法進行發送的,你也可以使用SendAsync方法來發送郵件,如果採用了非同步,你就需要設定一個回呼函數來處理髮送完成以後的工作,我這裡偷懶了啊!我現在有兩個樣本,一個是同步的,就是上面說的這個,還有一個是採用非同步方式發送的,如果你需要原始碼,點擊這裡下載:SendEmail.rar。 感謝你能夠看到最後,謝謝!