C# 发送邮件(内容中可以插入图片,邮件可以添加附件,163邮箱、QQ邮箱等都可以使用)

韩阳飙
2023-12-01
主要是用到了 System.Net.Mail 命名空间,用到了此空间的三个类,分别是:
●MailMessage类,用于构造电子邮件
●MailAttachment类,用于构造电子邮件附件
●SmtpMail类,用于发送电子邮件及其附件
1、MailMessage类构造电子邮件
 此类主要有以下属性和方法
 ★From     发件人的地址
 ★To       以分号分隔的收件人的地址列表
 ★Cc       以分号隔开的抄送的收件人的邮件地址列表
 ★Subject  电子邮件的主题
 ★Body     电子邮件的正文
 ★BodyFormat 电子邮件的正文内容类型,由MailFormat枚举值指定,MailFormat.Text或MailFormat.Html
 ★Attachments 电子邮件附件集合
 ★Priority  电子邮件的优先级,由MailPriority枚举值指定,可以是MailPriority.Low ,MailPriority.Normal或MailPriority.High三者之一
2、Attachment用来构造电子邮件附件.用此类构造了电子邮件附件然后添加到MailMessage对象的Attachments集合即可

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,则会提示服务器不需要安全连接。原因:暂时未知,可询问新浪客服等


本文转自http://blog.csdn.net/ful1021/article/details/11131561

 类似资料: