3、使用SmtpMail类发送电子邮件,可以通过系统本身的SMTP邮件服务或者其它SMTP服务器来发送,发送电子邮件首先需要设置SmtpMail类的SmtpServer属性,然后使用Send方法发送就可以了
添加引用
using System.Net.Mail;
using System.IO;
using System.Text;
主要代码:
//设置邮件的主体内容
private void SetMailBody(MailMessage Email)
{
StringBuilder body = new StringBuilder();
body.Append("尊敬的用户:<br><br>您好!<br><br> 你的登录用户名是:XXX 这是你的超级密码: XXXXXX");
body.Append("为了您的账号安全,我们建议您在收到邮件的72小时之内,到官方网站进行修改,并把该邮件删除。");
body.Append("<br><br>");
body.Append(" 如有任何疑问,欢迎致电×××××发展有限责任公司客服热线:028-×××××××,我们将热情为您解答。");
body.Append(" 感谢您的支持!<br><br>");
body.Append(" ××××××发展有限责任公司<br><br>");
body.AppendFormat(" {0}年{1}月{2}日<br><br>", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
body.Append(" 官网:http://www.×××××.com<br><br>");
body.Append(" ××××:http://www.××××.com");
Email.Body += body.ToString();
InsertImage(Server.MapPath("/images/2.jpg"), Email);
Email.Body += "<br />图片后面的内容,再插入一次图片";
InsertImage(Server.MapPath("/images/2.jpg"), Email);
Email.Body += "<br />更多资料,查看博客<a href=\"http://blog.csdn.net/ful1021\">http://blog.csdn.net/ful1021</a>";
}
/// <summary>
/// 发送邮件,具体根据项目、需求修改此方法
/// </summary>
/// <param name="emailFrom">发送人邮件地址</param>
/// <param name="toList">收件人邮件地址,用";"分割多个收件人</param>
/// <param name="mailSubject">邮件主题</param>
/// <param name="arrFilePath">邮件附件</param>
/// <param name="copyToList">抄送人邮件地址,用";"分割多个收件人</param>
/// <param name="mailBCC">秘件抄送人邮箱地址,用";"分割多个收件人</param>
/// <returns></returns>
public bool SendEmail(string emailFrom, string mailTo, string mailSubject, List<string> arrFilePath = null, string mailCC = null, string mailBCC = null)
{
using (MailMessage eMail = new MailMessage())
{
//设置发件人地址;发件人姓名,默认为邮箱地址@前面的内容,姓名编码
//MailAddress EmailFrom = new MailAddress(emailFrom, "张三", Encoding.UTF8);
MailAddress EmailFrom = new MailAddress(emailFrom);
eMail.From = EmailFrom; //指定发件人
//如果执行了方法没有收到邮件,请取消下面的注释,将发件人作为抄送人发一份,查看是否能收到,如果能收到,则为邮箱安全的设置问题,与此方法没有关系
//eMail.CC.Add(EmailFrom);
string[] arrMailAddr;
//用";"分割多个收件人.
//eMail.To.Clear();
if (!string.IsNullOrEmpty(mailTo))
{
arrMailAddr = mailTo.Split(';');
foreach (string strTo in arrMailAddr)
{
eMail.To.Add(strTo);
}
}
//用";"分割多个抄送人.
//eMail.CC.Clear();
if (!string.IsNullOrEmpty(mailCC))
{
arrMailAddr = mailCC.Split(';');
foreach (string strCC in arrMailAddr)
{
eMail.CC.Add(strCC);
}
}
//用";"分割多个秘件抄送人.
//eMail.Bcc.Clear();
if (!string.IsNullOrEmpty(mailBCC))
{
arrMailAddr = mailBCC.Split(';');
foreach (string strBCC in arrMailAddr)
{
eMail.Bcc.Add(strBCC);
}
}
//设置邮件内容,具体根据需求,项目调整里面内容
eMail.IsBodyHtml = true;
eMail.BodyEncoding = System.Text.Encoding.UTF8;
SetMailBody(eMail);
//邮件优先级
eMail.Priority = MailPriority.High;
//邮件主题
eMail.Subject = mailSubject;
eMail.SubjectEncoding = Encoding.GetEncoding(936);
//附件邮件附件
if (arrFilePath != null && arrFilePath.Count > 0)
{
foreach (var arr in arrFilePath)
{
AddAttachment(arr, eMail);
}
}
using (SmtpClient Client = GetSmtpClient(emailFrom, "password"))
{
try
{
Client.Send(eMail);
}
catch (SmtpFailedRecipientsException ex)
{
for (int i = 0; i < ex.InnerExceptions.Length; i++)
{
SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
if (status == SmtpStatusCode.MailboxBusy || status == SmtpStatusCode.MailboxUnavailable)
{
//Response.Write("Delivery failed - retrying in 5 seconds.");
System.Threading.Thread.Sleep(5000);
Client.Send(eMail);
}
}
}
catch (Exception ex)
{
//throw ex;
return false;
}
finally
{
for (int i = 0; i < eMail.Attachments.Count; i++) //释放占用excel资源
{
eMail.Attachments[i].Dispose();
}
}
return true;
}
}
}
/// <summary>
/// 设置邮件协议,需传人发送邮箱地址和密码
/// </summary>
/// <param name="fromAddress">邮箱地址</param>
/// <param name="sendPassword">密码</param>
/// <returns></returns>
private SmtpClient GetSmtpClient(string fromAddress, string sendPassword)
{
string[] sendUsername = fromAddress.Split('@');
SmtpClient client = new SmtpClient("smtp." + sendUsername[1].ToString());
client.UseDefaultCredentials = false;//这一句得写前面
//client.EnableSsl = true;//服务器不支持SSL连接
client.DeliveryMethod = SmtpDeliveryMethod.Network; //通过网络发送到Smtp服务器
//通过用户名和密码 认证
client.Credentials = new System.Net.NetworkCredential(sendUsername[0].ToString(), sendPassword);
return client;
}
/// <summary>
/// 在邮件内容中添加图片
/// </summary>
/// <param name="filePath">图片在服务器上面的绝对路径</param>
/// <param name="Email"></param>
private void InsertImage(string filePath, MailMessage Email)
{
if (!File.Exists(filePath))
{
return;
}
System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(filePath);
Email.Attachments.Add(attachment);
Email.Body += "<img src=\"cid:" + attachment.ContentId + "\"/>";
}
/// <summary>
/// 添加邮件附件
/// </summary>
/// <param name="filePath">文件在服务器上面的绝对路径</param>
/// <param name="Email"></param>
private void AddAttachment(string filePath, MailMessage Email)
{
if (!File.Exists(filePath))
{
return;
}
Attachment data = new Attachment(filePath, System.Net.Mime.MediaTypeNames.Application.Octet);
//使用这些代码,会有这个异常:在邮件标头中找到无效的字符:“周”
//参考:http://www.cnblogs.com/wybin/archive/2012/08/30/2663679.html
//System.Net.Mime.ContentDisposition disposition = data.ContentDisposition;
//disposition.CreationDate = File.GetCreationTime(filePath);
//disposition.ModificationDate = File.GetLastWriteTime(filePath);
//disposition.ReadDate = File.GetLastAccessTime(filePath);
Email.Attachments.Add(data);
}
List<string> arrFile = new List<string>();
arrFile.Add(Server.MapPath("/files/1.txt"));
SendEmail("a123a@qq.com", "b123b@qq.com; c123c@qq.com; d123d@qq.com", "测试主题", arrFile);
经测试,163邮箱和qq邮箱都可以使用,其中qq邮箱在使用前需进行设置,下面是我第一次使用时QQ邮箱给我发的邮件内容:
==================================
尊敬的QQ邮箱用户:
我们发现您尝试设置SMTP服务,但设置未成功。 您可以检查以下的细节来解决:
您是否在邮箱中开启了这项服务,如果尚未开启,请您在【邮箱设置】的【帐号】中开启相关服务。
您是否设置了邮箱独立密码,如果您设置了独立密码,在客户端设置时,密码输入项需填写邮箱独立密码。
其他可能对您有用的帮助信息:
POP3/SMTP服务设置帮助
QQ邮箱管理员
==================================
但用新浪邮箱时会提示:
SMTP 服务器要求安全连接或客户端未通过身份验证。 服务器响应为: Authentication required
如果是要求安全连接的错误,只需加client.EnableSsl = true;但新浪邮箱并未设置安全,如果将SSL设为true,则会提示服务器不需要安全连接。原因:暂时未知,可询问新浪客服等