当前位置: 首页 > news >正文

C#发送正文带图片带附件的邮件

1,开启服务,获取授权码。以QQ邮箱为例:

点击管理服务,进入账号与安全页面

 2,相关设置参数,以QQ邮箱为例:

登录时,请在第三方客户端的密码输入框里面填入授权码进行验证。(不是填入QQ的密码)
IMAP/SMTP 设置方法用户名/帐户: 你的QQ邮箱完整的地址密码: 生成的授权码电子邮件地址: 你的QQ邮箱的完整邮件地址接收邮件服务器: imap.qq.com,使用SSL,端口号993发送邮件服务器: smtp.qq.com,使用SSL,端口号587POP3/SMTP 设置方法用户名/帐户: 你的QQ邮箱完整的地址密码: 生成的授权码电子邮件地址: 你的QQ邮箱的完整邮件地址接收邮件服务器: pop.qq.com,使用SSL,端口号995发送邮件服务器: smtp.qq.com,使用SSL,端口号587

3,2次包装代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Net.Mime;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Common
{/// <summary>/// 软件的邮箱类,用于发送邮箱数据/// </summary>public class Emailhelp{public static Emailhelp MailSystem163 = new Emailhelp(mail =>{mail.Host = "smtp.163.com";//使用163的SMTP服务器发送邮件//mail.UseDefaultCredentials = true;//在winform平台使用默认值mail.EnableSsl = true;mail.UseDefaultCredentials = false;//在.framework或mvc下使用这个mail.Port = 25;//端口号mail.DeliveryMethod = SmtpDeliveryMethod.Network;mail.Credentials = new System.Net.NetworkCredential("邮件发送地址(自己的邮件号)如1234656@qq.com", "刚才获取的授权码");},"邮件发送地址(自己的邮件号)如1234656@qq.com","邮件发送地址(自己的邮件号)如1234656@qq.com");/// <summary>/// 系统连续发送失败的次数,为了不影响系统,连续三次失败就禁止发送/// </summary>private static long SoftMailSendFailedCount { get; set; } = 0L;/// <summary>/// 系统的邮件发送客户端/// </summary>private SmtpClient smtpClient { get; set; }/// <summary>/// 发送邮件的地址/// </summary>private string MailFromAddress { get; set; } = "";/// <summary>/// 邮件发送的地址/// </summary>public string MailSendAddress { get; set; } = "";/// <summary>/// 实例化一个邮箱发送类,需要指定初始化信息/// </summary>/// <param name="mailIni">初始化的方法</param>/// <param name="addr_From">发送地址,应该和账户匹配</param>/// <param name="addr_to">邮件接收地址</param>/// <remarks>/// </remarks>public Emailhelp(Action<SmtpClient> mailIni, string addr_From = "", string addr_to = ""){smtpClient = new SmtpClient();mailIni(smtpClient);MailFromAddress = addr_From;MailSendAddress = addr_to;}private string GetExceptionMail(Exception ex){return ex.Message;}/// <summary>/// 发送邮件/// </summary>/// <param name="addr_from">发送地址</param>/// <param name="name">发送别名</param>/// <param name="addr_to">接收地址</param>/// <param name="subject">邮件主题</param>/// <param name="body">邮件内容</param>/// <param name="attachment">附件地址</param>/// <param name="isHtml">邮件内容是否是HTML语言</param>/// <param name="priority">优先级</param>/// <returns>发生是否成功,内容不正确会被视为垃圾邮件</returns>public bool SendMail(string addr_from, string name, string[] addr_to, string subject, string body, string[] attachment, bool isHtml = false, MailPriority priority = MailPriority.Normal){if (SoftMailSendFailedCount > 10){SoftMailSendFailedCount++;return true;}MailMessage mailMessage = new MailMessage();try{mailMessage.From = new MailAddress(addr_from, name, Encoding.UTF8);foreach (string addresses in addr_to){mailMessage.To.Add(addresses);}mailMessage.Subject = subject;mailMessage.Body = body;MailMessage mailMessage2 = mailMessage;mailMessage2.Body = mailMessage2.Body + Environment.NewLine + Environment.NewLine + Environment.NewLine;mailMessage.SubjectEncoding = Encoding.UTF8;mailMessage.BodyEncoding = Encoding.UTF8;mailMessage.Priority = priority;mailMessage.IsBodyHtml = isHtml;for (int i = 0; i < attachment.Length; i++){Attachment address = new Attachment(attachment[i]);mailMessage.Attachments.Add(address);}smtpClient.Send(mailMessage);SoftMailSendFailedCount = 0L;return true;}catch (Exception ex){SoftMailSendFailedCount++;return false;}}/// <summary>/// 发送内容带有图片的邮件/// </summary>/// <param name="sfrom">发件人邮箱地址</param>/// <param name="displayName">显示名</param>/// <param name="addr_to">收件人地址</param>/// <param name="sSubject">标题</param>/// <param name="sBody">邮件内容</param>/// <param name="attachment">邮件附件</param>/// <returns></returns>public bool Send(string sfrom, string displayName, string[] addr_to, string sSubject, string sBody, string[] attachment){MailMessage oMail = new MailMessage();oMail.From = new MailAddress(sfrom, displayName, Encoding.UTF8);foreach (var item in addr_to){oMail.To.Add(item);}//  添加附件if (attachment != null){foreach (var item in attachment){oMail.Attachments.Add(new Attachment(item));}}sBody = ReplaceImg(sBody, oMail);  // 处理图片oMail.Subject = sSubject;  //邮件标题oMail.Body = sBody;   //邮件内容oMail.IsBodyHtml = true;  //邮件格式oMail.BodyEncoding = Encoding.GetEncoding("GB2312");  //邮件采用的编码oMail.Priority = MailPriority.High;  //设置邮件的优先级为高try{smtpClient.Send(oMail);return true;}catch (Exception e){SoftMailSendFailedCount++;return false;}finally{oMail.Dispose();  //释放资源}}/// <summary>/// 处理邮件内容中的图片/// 将图片改为附件形式在body中显示/// </summary>/// <param name="body"></param>/// <returns></returns>private string ReplaceImg(string body, MailMessage m){try{Dictionary<string, Stream> imgDic = new Dictionary<string, Stream>();body = GetImgStream(body, imgDic);AlternateView avHtml = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);if (imgDic.Count != 0) // 内容添加图片{foreach (var dic in imgDic){LinkedResource lrImage = new LinkedResource(dic.Value, "image/gif");lrImage.ContentId = dic.Key;avHtml.LinkedResources.Add(lrImage);}}m.AlternateViews.Add(avHtml);return body;}catch (Exception){return body;}}private string GetImgStream(string body, Dictionary<string, Stream> imgDic){string mactch;Regex reg = new Regex(@"(?i)<img[^>]*?\ssrc\s*=\s*(['""]?)(?<src>[^'""\s>]+)\1[^>]*>");MatchCollection mc = reg.Matches(body);for (int i = 0; i < mc.Count; i++){string key = "pic" + i;mactch = mc[i].Groups["src"].Value;body = body.Replace(mactch, "cid:" + key);FileStream fs = new FileStream(mactch, FileMode.Open);imgDic.Add(key, fs);}return body;}}
}

4,邮件效果:

特别说明:若要实现:

第1,正文带有背景图片。
第2,正文为自定义编辑风格(带有边框,不同颜色的字体)。
正文需要为html格式,普通文本格式无法实现。

http://www.lryc.cn/news/434016.html

相关文章:

  • 【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门
  • 请解释Java中的死锁产生的原因和解决方法。什么是Java中的并发工具类?请列举几个并解释其用途。
  • 三分钟带你看懂,低代码开发赋能办公方式转变
  • 视频剪辑软件哪个好用?11款软件轻松上手,让创意视频流畅呈现!
  • pytest二次开发:生成用例参数
  • 想抹黑华为的 请换一种方式
  • 学习学习学习
  • requestAnimationFrame原理和使用
  • 线程的状态(java)
  • Linux IO模型:IO多路复用
  • [数据集][目标检测]电梯内广告牌电动车检测数据集VOC+YOLO格式2787张4类别
  • MATLAB下载详细教程及下载链接
  • 利用发电量和气象数据分析来判断光伏仿真系统的准确性
  • Model-based RL动态规划(基于价值、基于策略,泛化迭代)
  • 外接串口板,通过串口打开adb模式
  • ssm微信小程序校园失物招领论文源码调试讲解
  • iOS 15推出后利用邮件打开率的7种方法
  • 以太网--TCP/IP协议(一)
  • LeetCode刷题:找到第K大的元素
  • HTML页面配置高德地图,获取位置
  • HTTrack
  • 干货分享|分享一款微软出品的工作效率神器 PowerToys
  • 神经网络的线性部分和非线性部分
  • 微信支付开发避坑指南
  • Qt5.4.1连接odbc驱动操作达梦数据库
  • 计算机组成原理(第一课)
  • 计算机网络练级第一级————认识网络
  • Java基于微信小程序的家庭财务管理系统,附源码
  • P2343 宝石管理系统
  • Spring6梳理6——依赖注入之Setter和构造器注入