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格式,普通文本格式无法实现。
相关文章:
C#发送正文带图片带附件的邮件
1,开启服务,获取授权码。以QQ邮箱为例: 点击管理服务,进入账号与安全页面 2,相关设置参数,以QQ邮箱为例: 登录时,请在第三方客户端的密码输入框里面填入授权码进行验证。࿰…...
【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门
1. C#与.NET的发展历程 C#是由Microsoft开发的现代编程语言,最初伴随着.NET Framework发布。随着技术的进步,特别是针对跨平台开发的需求,Microsoft推出了.NET Core,这是一个开源且跨平台的框架,支持Windows、macOS和…...
请解释Java中的死锁产生的原因和解决方法。什么是Java中的并发工具类?请列举几个并解释其用途。
请解释Java中的死锁产生的原因和解决方法。 Java中的死锁是指两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的现象,若无外力作用,这些线程都将无法向前推进。死锁是并发编程中常见的问题,它会导致程序运行…...
三分钟带你看懂,低代码开发赋能办公方式转变
随着技术的不断进步,企业对办公效率和灵活性的需求日益增长。低代码开发作为一种新兴的开发模式,正在改变传统的办公方式,让非技术背景的业务人员也能参与到应用的创建和维护中来。本文将带你快速了解低代码开发如何赋能办公方式的转变。 什么…...
视频剪辑软件哪个好用?11款软件轻松上手,让创意视频流畅呈现!
视频剪辑已经涉及到很多个领域,视频剪辑软件的需求也是越来越普遍了。很多朋友在日常办公学习中,经常会遇到视频剪辑的问题。借助专业的视频剪辑软件,我们可以快速的对视频进行剪辑,制作出属于自己的作品。 市面上有各种各样的视频…...
pytest二次开发:生成用例参数
pytest.fixture是一个装饰器,用于声明一个fixture。Fixture是pytest中的一个核心概念,它提供了一种将测试前的准备代码(如设置测试环境、准备测试数据等)和测试后的清理代码(如恢复测试环境、删除临时文件等࿰…...
想抹黑华为的 请换一种方式
文|琥珀食酒社 作者 | 积溪 咱能不能有点创意? 能不能换个方式? 之前我说预测过 我说华为的三折叠手机 MateXT非凡大师发布 会引来一大波华为黑 还真是被我说中了 华为MateXT刚曝光 就被黄牛炒到10多万 有人说华为要割韭菜 是电子…...
学习学习学习
1. 面试算法 算法题空间限制64MB 2x 10^7 int codetop.cc 数字中文读 🔗 kmp 奶牛生小牛问题 丑数LCR 168. 丑数 - 力扣(LeetCode) 166. 分数到小数 - 力扣(LeetCode) 小数循环节 深入解析力扣166题ÿ…...
requestAnimationFrame原理和使用
requestAnimationFrame 是一个用于在浏览器中实现高效动画的方法。它告诉浏览器你希望执行一个动画,并在下一次重绘之前调用指定的回调函数来更新动画。浏览器会自动优化动画的刷新频率,以确保动画的流畅性和性能。 原理 帧刷新:浏览器通常…...
线程的状态(java)
“苦? 何止是苦~~~~~” 本期内容来分享一下线程状态相关的知识哦!!! 对于进程来说,进程是有两种状态的。 一种是就绪状态:正在CPU上执行,或者随时可以去CPU上执行的。 另一种是阻塞状态&…...
Linux IO模型:IO多路复用
● 应用程序中同时处理多路输入输出流,若采用阻塞模式,得不到预期的目的; ● 若采用非阻塞模式,对多个输入进行轮询,但又太浪费CPU时间; ● 若设置多个进程/线程,分别处理一条数据通路ÿ…...
[数据集][目标检测]电梯内广告牌电动车检测数据集VOC+YOLO格式2787张4类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2787 标注数量(xml文件个数):2787 标注数量(txt文件个数):2787 标注…...
MATLAB下载详细教程及下载链接
欢迎大家进评论区交流经验 1. 准备工作 下载MATLAB安装包:首先,从MathWorks官方网站(http://www.mathworks.com)下载适合您操作系统的MATLAB安装包。确保选择与您的操作系统(如Windows、macOS或Linux)兼容的…...
利用发电量和气象数据分析来判断光伏仿真系统的准确性
随着光伏产业的迅速发展,光伏仿真系统通过集成气象数据分析、发电量分析、投融资分析及损耗估算等功能,为光伏项目的全生命周期管理提供了科学依据。 光伏仿真系统集成了气象数据分析、发电量预测、投融资分析、损耗估算及光伏设计等功能。其中…...
Model-based RL动态规划(基于价值、基于策略,泛化迭代)
白盒环境和黑盒环境 白盒环境:知道环境的状态转移函数P(s’|s)或P(s’|s,a)和奖励函数R(s)或R(s,a): 白盒环境下的学习相当于直接给出了有监督学习的数据分布(就是有了目标靶子),不需要采样了,直接最小…...
外接串口板,通过串口打开adb模式
一、依赖库 import subprocess import serial from serial.tools import list_ports import logging import time 二、代码 import subprocessimport serial from serial.tools import list_ports import logging import timedef openAdb(com):# com []# for i in list_por…...
ssm微信小程序校园失物招领论文源码调试讲解
第二章 开发技术与环境配置 以Java语言为开发工具,利用了当前先进的SSM框架,以MyEclipse10为系统开发工具,MySQL为后台数据库,开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出,该公司于20…...
iOS 15推出后利用邮件打开率的7种方法
自从苹果在2021年底推出iOS 15以来,邮件打开率就一直是一个让人头疼的指标。 Klaviyo市场情报主管Mindy Regnell表示:“对于启用了Apple邮件隐私保护(MPP)的用户来说,苹果会打开这些邮件并预先下载内容到他们的服务器…...
以太网--TCP/IP协议(一)
概述 以太网是局域网的一种,其他的比如还有令牌环、FDDI。和局域网对应的就是广域网,如Internet,城域网等。 从网络层次看,局域网协议主要偏重于低层(业内一般把物理层、数据链路层归为低层)。以太网协议…...
LeetCode刷题:找到第K大的元素
本题其实就是考察排序算法,为了减低时间复杂度,所以采用堆排序 import java.security.Key; import java.util.Scanner;public class FindKtopElements {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String lin…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
