dotnet中用SmtpClient来发送邮件,以前的System.Web.Mail已经不推荐使用了,新的方法在命名空间System.Net.Mail中。
涉及到的命名空间有:
using System.Net.Mail;
using System.Net;
using System.Net.Mime;
下面举两个简单的例子,是我测试时候用的:
//同步发送邮件 SmtpClient client = new SmtpClient(); //smtp server address client.Host = "mail1.ufida.com"; //smtp server port client.Port = 25; //connect timeout client.Timeout = 5000; //mail account client.Credentials = new NetworkCredential("***@ufida.com", "***");//登录邮箱的账户和密码 //simple send client.Send("***@ufida.com","***@qq.com","subject","msg");//发件人,收件人,主题,正文
这样一封简单的邮件就发送完成,其中client.Send()方法是同步发送邮件,简单的说就是单线程。
也可以使用异步发送邮件的方法,在邮件发送完成的时候,会返回一个SendCompletedEventHandler事件。
调用邮件发送的按钮事件如下:
private void button2_Click(object sender, EventArgs e) { //异步发送邮件 //create mail message MailAddress from = new MailAddress("***@ufida.com","UF"); MailAddress to = new MailAddress("***@qq.com", "QQ"); MailMessage mail = new MailMessage(from, to); //add more to添加多个收件人 MailAddress to2 = new MailAddress("***@qq.com", "QQ"); mail.To.Add(to2); //add more cc添加抄送 MailAddress cc = new MailAddress("***@qq.com", "QQ"); mail.CC.Add(cc); //add more bcc添加密送 MailAddress bcc = new MailAddress("***@qq.com", "QQ"); mail.Bcc.Add(bcc); mail.Subject = "subject"; mail.Body = "msg"; mail.BodyEncoding = System.Text.Encoding.UTF8;//正文编码格式 mail.IsBodyHtml = false;//正文是否为HTML邮件 //create attachment by stream 以文件流方式读取附件并发送 //System.IO.FileInfo file = new System.IO.FileInfo(@"E:\mycos_myjob_issue003.pdf"); //Attachment att = new Attachment(file.OpenRead(), MediaTypeNames.Application.Pdf); //or add file或者直接指定附件文件的绝对路径 //Attachment att = new Attachment(@"E:\mycos_myjob_issue003.pdf", MediaTypeNames.Application.Octet); //mail.Attachments.Add(att); //create account NetworkCredential account = new NetworkCredential("***@ufida.com", "***"); SmtpClient client = new SmtpClient(); //smtp server address client.Host = "mail1.ufida.com"; //ssl是否为ssl加密 client.EnableSsl = false; //smtp server port client.Port = 25; //connect timeout client.Timeout = 5000; //mail account client.Credentials = account; client.SendCompleted += new SendCompletedEventHandler(MailSendCompleted);//这里注册邮件发送完成的事件响应方法 //simple send异步发送 client.SendAsync(mail, "testMail");//第二个参数会被传入事件SendCompletedEventHandler中,所以可以将邮件相关的信息放到第二个参数中,这样在邮件发送完成的响应事件方法中,就可以判断出完成发送的是哪封邮件了。 }
下面是邮件发送完成的事件响应方法
public void MailSendCompleted(object sender, AsyncCompletedEventArgs e) { if (e.Cancelled) { label1.Text = "cancel"; } else if (e.Error != null) { label1.Text = "error" + e.Error.Message; } else { label1.Text = "completed" + e.UserState.ToString();//UserState是client.SendAsync()方法中的第二个参数 } }
这些发送邮件的类使用起来比较简单,所以功能也很简单。比如想在邮件发送之前计算邮件的大小(一般是正文内容大小 加上 附件大小),或者是获取邮件发送中的进度等这些功能是没有的,或者说我没有找到有,而且我个人也认为这种封装程度高的类,使用方便,就是灵活性不够。