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()方法中的第二个参数
}
}
这些发送邮件的类使用起来比较简单,所以功能也很简单。比如想在邮件发送之前计算邮件的大小(一般是正文内容大小 加上 附件大小),或者是获取邮件发送中的进度等这些功能是没有的,或者说我没有找到有,而且我个人也认为这种封装程度高的类,使用方便,就是灵活性不够。