Mail Transport Protocol)傳送到SMTP伺服器做傳送的動作。
分成3個部份
1.發送mail函式。
/// <summary>
/// 完整的寄信函數
/// </summary>
/// <param name="MailFrom">寄信人Email Address</param>
/// <param name="MailTos">收信人Email Address</param>
/// <param name="Ccs">副本Email Address</param>
/// <param name="MailSub">主旨</param>
/// <param name="MailBody">內文</param>
/// <param name="isBodyHtml">是否為Html格式</param>
/// <param name="files">要夾帶的附檔</param>
/// <returns>回傳寄信是否成功(true:成功,false:失敗)</returns>
public bool Send_Mail(string MailFrom, string[] MailTos, string[] Ccs, string MailSub, string MailBody, bool isBodyHtml, Dictionary<string, Stream> files)
{
try
{
//沒給寄信人mail address
if (string.IsNullOrEmpty(MailFrom))
{//※有些公司的Smtp Server會規定寄信人的Domain Name須是該Smtp Server的Domain Name,例如底下的 system.com.tw
MailFrom = "sysadmin@system.com.tw";
}
//建立MailMessage物件
MailMessage mms = new MailMessage();
//指定一位寄信人MailAddress
mms.From = new MailAddress(MailFrom);
//信件主旨
mms.Subject = MailSub;
//信件內容
mms.Body = MailBody;
//信件內容 是否採用Html格式
mms.IsBodyHtml = isBodyHtml;
if (MailTos != null)//防呆
{
for (int i = 0; i < MailTos.Length; i++)
{
//加入信件的收信人(們)address
if (!string.IsNullOrEmpty(MailTos[i].Trim()))
{
mms.To.Add(new MailAddress(MailTos[i].Trim()));
}
}
}//End if (MailTos !=null)//防呆
if (Ccs != null) //防呆
{
for (int i = 0; i < Ccs.Length; i++)
{
if (!string.IsNullOrEmpty(Ccs[i].Trim()))
{
//加入信件的副本(們)address
mms.CC.Add(new MailAddress(Ccs[i].Trim()));
}
}
}//End if (Ccs!=null) //防呆
//附件處理
if (files != null && files.Count > 0)//寄信時有夾帶附檔
{
foreach (string fileName in files.Keys)
{
Attachment attfile = new Attachment(files[fileName], fileName);
mms.Attachments.Add(attfile);
}//end foreach
}//end if
using (SmtpClient client = new SmtpClient(smtpServer,smtpPort))//或公司、客戶的smtp_server
{
if (!string.IsNullOrEmpty(mailAccount) && !string.IsNullOrEmpty(mailPwd))//.config有帳密的話
{
client.Credentials = new NetworkCredential(mailAccount, mailPwd);//寄信帳密
}
client.Send(mms);//寄出一封信
}//end using
//釋放每個附件,才不會Lock住(不過即使附加檔案失敗,也會寄出信去)
if (mms.Attachments != null && mms.Attachments.Count>0)
{
for (int i = 0; i < mms.Attachments.Count;i++ )
{
mms.Attachments[i].Dispose();
//mms.Attachments[i] = null;
}
}
return true;//成功
}
catch (Exception ex)
{
//寄信失敗,寫Log文字檔
Console.WriteLine("寄信失敗" + ex.StackTrace);
return false;
}
}//End 寄信
2.將附加檔案轉換成Stream。
/// <summary>
/// 將附加檔案轉換成Stream
/// </summary>
/// <param name="file">檔案完整路徑</param>
/// <returns>回傳Stream</returns>
private Stream FileToStream(string file)
{
Stream sf = File.OpenRead("d:\\cpu.txt");
System.IO.MemoryStream data = new System.IO.MemoryStream();
sf.CopyTo(data);
data.Seek(0, SeekOrigin.Begin);
byte[] buf = new byte[data.Length];
data.Read(buf, 0, buf.Length);
//再移到位置0,附加檔案時才可以被讀取
data.Seek(0, SeekOrigin.Begin);
return data;
}
3.主程式
private string smtpServer = "your mail smtp server";
private int smtpPort = 25;
private string mailAccount="sample";
private string mailPwd = "sampelPW";
private void button1_Click(object sender, EventArgs e)
{
//收件人名單
string receiveMails = "sample1@yahoo.com.tw,sample2@yahoo.com.tw";
//主旨
string mailTitle = "C# 寄信來了";
//寄件人(通常是寄件本人)
string sendMail = "sample1@yahoo.com.tw";
//副件名單
string[] Cc ={"sample3@gmail.com"};
//信件內容
string mailbody="test send mail by c#" ;
//切割收件人名單
string[] _receiveMail=receiveMails.Split(new string[]{","},StringSplitOptions.RemoveEmptyEntries);
//附加檔案
string filename="d:\\CPU.TXT";
Dictionary<string, Stream> listFile = new Dictionary<string, Stream>();
//把檔案轉換成Stream
listFile.Add(Path.GetFileName(filename), FileToStream(filename));
//寄信
Send_Mail(sendMail, _receiveMail, Cc, mailTitle, mailbody, true, listFile);
}
程式碼中的Email以及帳密已經過變更,請以自己的為主,以下截圖為真實收到信的情況
接下來我們來打開附檔,是本機的CPU資訊檔案。
其實是可以發送HTML格式的內文。
例如我們把
string mailbody="test send mail by c#" ;
改成
string mailbody="test <br />send <br />mail ";
則會有如下的結果
還有另一件事就是寄件人的問題,一般而言是應該要寫在smtp伺服器上你自己的e-mail,
但有些伺服器並不會擋,所以即使你亂寫,它還是會讓你寄,有些則會擋下假的email
地址,所以還是要守規矩,建立良好的信用,本篇純教學用途。
參考資料來源
http://www.dotblogs.com.tw/shadow/archive/2011/05/23/25887.aspx
沒有留言:
張貼留言