C# 发送邮件
1.安装 NuGet 包

2.代码如下
SendMailUtil
using MimeKit;
using Srm.CMER.Application.Contracts.CmerInfo;namespace Srm.Mail
{
public class SendMailUtil
{
public async static Task<string> SendEmail(SendEmialDto sendEmialDto,List<string> tolist, List<string> cclist, BodyBuilder builder, string title, CancellationToken cancellationToken)
{// MimeMessage可以堪称MailKit里的一个邮件对象
var sendMessage = new MimeMessage();sendMessage.Subject = title;
// 也可以添加多个发件人,二选其一
// sendMessage.From.Add(new MailboxAddress(data.Name, data.Address));
// sendMessage.From.Add(new MailboxAddress("2799788752", "2799788752@qq.com"));
sendMessage.From.Add(new MailboxAddress(sendEmialDto.UserName, sendEmialDto.Eamil));
// 添加收件人信息
string mailtos = string.Empty;
foreach (var it in tolist)
{
if (!it.IsNullOrEmpty())
{
if (mailtos.IsNullOrEmpty())
{
mailtos = it + ";";
}
else
{
mailtos += it + ";";
}
sendMessage.To.Add(new MailboxAddress(it, it));
}
}// 添加抄送(CC)人信息
string mailccs = string.Empty;
foreach (var it in cclist)
{
if (!it.IsNullOrEmpty())
{
if (mailccs.IsNullOrEmpty())
{
mailccs = it + ";";
}
else
{
mailccs += it + ";";
}
if (it.Contains(";"))
{
string[] emial = it.Split(';');
foreach (string s in emial)
{
sendMessage.Cc.Add(new MailboxAddress(s, s));
}
}
else
{
sendMessage.Cc.Add(new MailboxAddress(it, it));
}}
}
//sendMessage.Cc.Add(new MailboxAddress("gyn", "gaoyanan@jshzxx.com"));// 邮件正文两种形式
// 1. 不带附件
// html
sendMessage.Body= builder.ToMessageBody();
//sendMessage.Body = new TextPart(TextFormat.Html) { Text = builder.HtmlBody };
// 或者纯文本
// sendMessage.Body = new TextPart(TextFormat.Plain) { Text = context };// 2. 带附件
/*var builder = new BodyBuilder();
builder.TextBody = "邮件正文文字描述";
// 添加附件,需带完整路径或者相对路径
builder.Attachments.Add("test.xlsx");
sendMessage.Body = builder.ToMessageBody();*/using (var smtp = new MailKit.Net.Smtp.SmtpClient())
{
try
{
// 1. 注册邮件发送成功之后的事件,比如记录log
// MessageSent事件里可以通过args参数,获得服务器的响应信息,以便于记录Log。
smtp.MessageSent += (sender, args) => {
// args.Response;};
smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
// 2. 连接服务器
//if (sendEmialDto.AccountName == "forehopetcs@forehope-elec.com")
//{
await smtp.ConnectAsync("smtp.exmail.qq.com", 465, true, cancellationToken);
//}
//else
//{
// await smtp.ConnectAsync("smtp.qq.com", 465, true, cancellationToken);
//}
// 3. 验证账号
// await smtp.AuthenticateAsync(data.UserName, data.MailPassword, cancellationToken);// await smtp.AuthenticateAsync("2799788752", "qrjozanttznpdeei", cancellationToken);
await smtp.AuthenticateAsync(sendEmialDto.AccountName, sendEmialDto.AuthCode, cancellationToken);
// 4. 发送邮件
var success = await smtp.SendAsync(sendMessage, cancellationToken);
// 5. 释放链接
await smtp.DisconnectAsync(true, cancellationToken);return success;
}
catch (Exception e)
{
return e.Message;
}
}
}
}
}
SendEmialDto
namespace Srm.CMER.Application.Contracts.CmerInfo
{
public class SendEmialDto
{
//账号名
public string? AccountName { get; set; }
public string? Eamil { get; set; }
//授权码
public string? AuthCode { get; set; }
//用户名
public string? UserName { get; set; }}
}
示例
SendEmailCommand
using System;
using System.Data;
using AutoMapper;
using MediatR;
using Microsoft.Extensions.Configuration;
using MimeKit;
using Srm.CMER.Application.Contracts.CmerInfo;
using Srm.COC.Application.Contracts.SpecApprove;
using Srm.Config;
using Srm.Core.Application.Commands;
using Srm.Core;
using Srm.Mail;
using Srm.Autofac;
using Srm.COC.Application.Contracts.Spec;namespace Srm.Audit.Application.AuditFindings.Commands
{
public class SendEmailCommand : IRequest<bool>
{
public string SupplierName { get; }public SendEmailCommand(string supplierName)
{
this.SupplierName = supplierName;
}
}
public class SendEmailCommandHandler : CommandRequestHandler<SendEmailCommand, bool>
{
public SendEmailCommandHandler(IMediator mediator, IMapper mapper, IDbContext dbContext) : base(mediator, mapper, dbContext)
{
}public override async Task<bool> HandleAsync(SendEmailCommand request, IDbConnection dbConnection, CancellationToken cancellationToken)
{
string module = "供应商稽核";
//收件人
var tolist = new List<string>();SendEmialDto sendEmailDto = new SendEmialDto();
sendEmailDto.AuthCode = "Foref7!00HopeTCS";
sendEmailDto.AccountName = "forehopetcs@forehope-elec.com";
sendEmailDto.Eamil = "forehopetcs@forehope-elec.com";
sendEmailDto.UserName = "供应商管理系统(甬矽电子)";IConfiguration confing = SrmConfig.GetConfig();
IConfigurationSection HttpUrlSection = confing.GetSection("GradeURL");
string httpUrl = HttpUrlSection["HTTPURL"];var builder = new BodyBuilder();
builder.TextBody += request.SupplierName+ " ,请登录供应商系统("+httpUrl+")完成FINDINGS的填写,系统邮件无需回复,谢谢。";
var SpecApproveQueryService = ServiceLocator.GetService<ISpecApproveQueryService>();
var SpecQueryService = ServiceLocator.GetService<ISpecQueryService>();
List<string> sqeemail = await SpecQueryService.GetSqeEmailsByModule(request.SupplierName,module, cancellationToken);
List<string> SupplierEmails = await SpecApproveQueryService.GetSupEmailbyModule(request.SupplierName, module, cancellationToken);
List<string> supccemail=await SpecApproveQueryService.GetSupccemail(request.SupplierName,module, cancellationToken);
// 邮箱
tolist.AddRange(SupplierEmails);
var cclist=new List<string>();
if (supccemail.Count > 0)
{
cclist.AddRange(supccemail);
}
if (sqeemail.Count < 1)
{
List<string> sqeemailTotal = await SpecQueryService.GetSqeEmails(cancellationToken);
sqeemail.AddRange(sqeemailTotal);
}
cclist.AddRange(sqeemail);
await SendMailUtil.SendEmail(sendEmailDto, tolist,cclist, builder, "FINDINGS提醒", cancellationToken);
return true;
}}
}
相关文章:
C# 发送邮件
1.安装 NuGet 包 2.代码如下 SendMailUtil using MimeKit; using Srm.CMER.Application.Contracts.CmerInfo; namespace Srm.Mail { public class SendMailUtil { public async static Task<string> SendEmail(SendEmialDto sendEmialDto,List<strin…...
Zeal下载文档慢的问题
1. 安装Zeal 官方下载网站: https://zealdocs.org/ 2. 安装文档(在线安装方式)(下载速度非常慢) Tools - Docsets Available中下载安装对应的文档 3. 安装文档(离线安装方式) ①下载文档…...
HR模块开发(1):简单的开发流程和注意事项
HR模块开发 一、模块概述 人力资源管理解决方案关注3个领域:每位雇员都发展和维护着‘公司内’和‘公司外’的种种‘关系’。运用科技,强化这些关系,可以提高忠诚度和生产力,公司整体得到商业价值。 员工关系管理员工职业生命周期管理员工事务处理管理HR模块的基本知识和构…...
创建Vue实例
我们已经知道了Vue框架可以 基于数据帮助我们渲染出用户界面,那应该怎么做呢? 核心步骤(4步): 准备容器 引包(官网) — 开发版本/生产版本 创建Vue实例 new Vue() 指定配置项,渲…...
2024上海国际人工智能展(CSITF)以“技术,让生活更精彩”为核心理念,以“创新驱动发展,保护知识产权,促进技术贸易”为主题
2024上海国际人工智能展(CSITF) China(Shanghai)International Technology Fair 时间:2024年6月12-14日 地点:上海世博展览馆 主办单位 中华人民共和国商务部 中华人民共和国科学技术部 中华人民共和国国家知识产权局 上海市…...
Vue3使用Monaco-editor
Monaco-editor,一个vs code 编辑器,需要将其集成到项目。不说闲话了,直接上代码。 npm地址:https://www.npmjs.com/package/monaco-editor 中文文档:https://aydk.site/editor/ 安装: pnpm add monaco…...
java 根据ip获取到城市 GeoLite2-City.mmdb
本文可解决 根据ip定位获取不到问题,提供多种方式仅供参考: 1.选型 1.1 实现方式 Java可以实现IP地址解析和省市区信息查询,但是需要借助一些外部数据源或数据库来实现。常用的方法有以下几种: 1.1.1 本地文件解析 可以通过下…...
kaggle使用说明
kaggle kaggle使用参考1、kaggle目录2、kaggle上传本地文件后,如何不改代码就可运行3、已上传文件的修改3.1 重新上传3.2 重写文件 4、创建文件夹5、结果下载5.1 多文件:先打包再下载5.2 重定文件下载链接 kaggle使用参考 Kaggle 新手入门必看ÿ…...
BUUCTF FLAG 1
BUUCTF:https://buuoj.cn/challenges 题目描述: 注意:请将 hctf 替换为 flag 提交,格式 flag{} 密文: 下载附件,得到一张.png图片。 解题思路: 1、因为附件是一张图片,先放到StegSolve中&…...
万物皆可“云” 从杭州云栖大会看数智生活的未来
文章目录 前言一、云栖渐进:一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会:云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日,202…...
LeetCode1518 换水问题
题目描述 超市正在促销,你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始,你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水,那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange ,返回你 最多 可以喝…...
强大日志查看器,助力数据联动分析
前言 我们曾讨论过观测云查看器强大的查询筛选和搜索功能,能够帮助用户快速、精准地检索数据,定位故障问题(参见《如何使用查看器筛选、搜索功能进行数据定位?》)。除此之外,日志查看器不仅可以帮助我们收…...
HIBS一些简介
文章目录 距离发展:意义使用挑战安全IOT活动服务频带可行性频谱 距离 海拔约20KM的平流层中,国际电联无线电条例(RR)将HAPS定义为位于20-50公里高度和相对于地球的指定标称固定点的物体上的无线电台。 #高空平台作为IMT基站(HIB…...
OpenCV实现人脸关键点检测
目录 实现过程 1,代码解读 1.1 导入工具包 1.2导入所需图像,以及训练好的人脸预测模型 1.3 将 dlib 的关键点对象转换为 NumPy 数组,以便后续处理 1.4图像上可视化面部关键点 1.5# 读取输入数据,预处理 1.6进行人脸检测 1…...
300万美元!澳大利亚昆士兰州投资当地首家量子公司AQC
澳大利亚模拟量子电路公司(AQC)联合创始人 Tom Stace 教授和 Arkady Federov 副教授(图片来源:网络) 澳大利亚风险投资基金会Uniseed为澳大利亚昆士兰大学的两名教授提供了300万美元的资金,资助他们创办了…...
Android Studio打包AAR
注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同,gradle的版本和gradle plugins的版本都会影响使用方式。 基于此,本文只能作为参考,而不能作为唯一答案,如果要完全依赖本文,则…...
【Python基础知识四】控制语句
Python基础知识:控制语句 1 条件控制1.1 if语句1.2 match...case语句 2 循环语句2.1 for循环2.2 for...else语句2.3 while循环2.4 while 循环使用 else 语句2.5 无限循环2.6 break 和 continue 语句及循环中的 else 子句2.6.1 break语句2.6.2 continue语句 2.7 pass…...
Jmeter压测 —— 1秒发送1次请求
场景:有时候测试场景需要设置请求频率为一秒一次(或几秒一次)实现方法一:1、首先需要在线程组下设置循环次数(可以理解为请求的次数) 次数设置为请求300次,其中线程数跟时间自行设置 2、在设置…...
目标检测YOLO实战应用案例100讲-基于改进YOLOv4算法的自动驾驶场景 目标检测
目录 前言 国内外目标检测算法研究现状 传统目标检测算法的发展现状...
Spring Cloud智慧工地源码,利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术开发,微服务架构
智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术,以PC端,移动端,设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
