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端,移动端,设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
