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

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; }
        //email
        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 官方下载网站&#xff1a; https://zealdocs.org/ 2. 安装文档&#xff08;在线安装方式&#xff09;&#xff08;下载速度非常慢&#xff09; Tools - Docsets Available中下载安装对应的文档 3. 安装文档&#xff08;离线安装方式&#xff09; ①下载文档…...

HR模块开发(1):简单的开发流程和注意事项

HR模块开发 一、模块概述 人力资源管理解决方案关注3个领域:每位雇员都发展和维护着‘公司内’和‘公司外’的种种‘关系’。运用科技,强化这些关系,可以提高忠诚度和生产力,公司整体得到商业价值。 员工关系管理员工职业生命周期管理员工事务处理管理HR模块的基本知识和构…...

创建Vue实例

我们已经知道了Vue框架可以 基于数据帮助我们渲染出用户界面&#xff0c;那应该怎么做呢&#xff1f; 核心步骤&#xff08;4步&#xff09;&#xff1a; 准备容器 引包&#xff08;官网&#xff09; — 开发版本/生产版本 创建Vue实例 new Vue() 指定配置项&#xff0c;渲…...

2024上海国际人工智能展(CSITF)以“技术,让生活更精彩”为核心理念,以“创新驱动发展,保护知识产权,促进技术贸易”为主题

2024上海国际人工智能展&#xff08;CSITF&#xff09; China&#xff08;Shanghai&#xff09;International Technology Fair 时间:2024年6月12-14日 地点:上海世博展览馆 主办单位 中华人民共和国商务部 中华人民共和国科学技术部 中华人民共和国国家知识产权局 上海市…...

Vue3使用Monaco-editor

Monaco-editor&#xff0c;一个vs code 编辑器&#xff0c;需要将其集成到项目。不说闲话了&#xff0c;直接上代码。 npm地址&#xff1a;https://www.npmjs.com/package/monaco-editor 中文文档&#xff1a;https://aydk.site/editor/ 安装&#xff1a; pnpm add monaco…...

java 根据ip获取到城市 GeoLite2-City.mmdb

本文可解决 根据ip定位获取不到问题&#xff0c;提供多种方式仅供参考&#xff1a; 1.选型 1.1 实现方式 Java可以实现IP地址解析和省市区信息查询&#xff0c;但是需要借助一些外部数据源或数据库来实现。常用的方法有以下几种&#xff1a; 1.1.1 本地文件解析 可以通过下…...

kaggle使用说明

kaggle kaggle使用参考1、kaggle目录2、kaggle上传本地文件后&#xff0c;如何不改代码就可运行3、已上传文件的修改3.1 重新上传3.2 重写文件 4、创建文件夹5、结果下载5.1 多文件&#xff1a;先打包再下载5.2 重定文件下载链接 kaggle使用参考 Kaggle 新手入门必看&#xff…...

BUUCTF FLAG 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;请将 hctf 替换为 flag 提交&#xff0c;格式 flag{} 密文&#xff1a; 下载附件&#xff0c;得到一张.png图片。 解题思路&#xff1a; 1、因为附件是一张图片&#xff0c;先放到StegSolve中&…...

万物皆可“云” 从杭州云栖大会看数智生活的未来

文章目录 前言一、云栖渐进&#xff1a;一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会&#xff1a;云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日&#xff0c;202…...

LeetCode1518 换水问题

题目描述 超市正在促销&#xff0c;你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始&#xff0c;你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水&#xff0c;那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange &#xff0c;返回你 最多 可以喝…...

强大日志查看器,助力数据联动分析

前言 我们曾讨论过观测云查看器强大的查询筛选和搜索功能&#xff0c;能够帮助用户快速、精准地检索数据&#xff0c;定位故障问题&#xff08;参见《如何使用查看器筛选、搜索功能进行数据定位&#xff1f;》&#xff09;。除此之外&#xff0c;日志查看器不仅可以帮助我们收…...

HIBS一些简介

文章目录 距离发展&#xff1a;意义使用挑战安全IOT活动服务频带可行性频谱 距离 海拔约20KM的平流层中&#xff0c;国际电联无线电条例&#xff08;RR&#xff09;将HAPS定义为位于20-50公里高度和相对于地球的指定标称固定点的物体上的无线电台。 #高空平台作为IMT基站(HIB…...

OpenCV实现人脸关键点检测

目录 实现过程 1&#xff0c;代码解读 1.1 导入工具包 1.2导入所需图像&#xff0c;以及训练好的人脸预测模型 1.3 将 dlib 的关键点对象转换为 NumPy 数组&#xff0c;以便后续处理 1.4图像上可视化面部关键点 1.5# 读取输入数据&#xff0c;预处理 1.6进行人脸检测 1…...

300万美元!澳大利亚昆士兰州投资当地首家量子公司AQC

澳大利亚模拟量子电路公司&#xff08;AQC&#xff09;联合创始人 Tom Stace 教授和 Arkady Federov 副教授&#xff08;图片来源&#xff1a;网络&#xff09; 澳大利亚风险投资基金会Uniseed为澳大利亚昆士兰大学的两名教授提供了300万美元的资金&#xff0c;资助他们创办了…...

Android Studio打包AAR

注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同&#xff0c;gradle的版本和gradle plugins的版本都会影响使用方式。 基于此&#xff0c;本文只能作为参考&#xff0c;而不能作为唯一答案&#xff0c;如果要完全依赖本文&#xff0c;则…...

【Python基础知识四】控制语句

Python基础知识&#xff1a;控制语句 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次请求

场景&#xff1a;有时候测试场景需要设置请求频率为一秒一次&#xff08;或几秒一次&#xff09;实现方法一&#xff1a;1、首先需要在线程组下设置循环次数&#xff08;可以理解为请求的次数&#xff09; 次数设置为请求300次&#xff0c;其中线程数跟时间自行设置 2、在设置…...

目标检测YOLO实战应用案例100讲-基于改进YOLOv4算法的自动驾驶场景 目标检测

目录 前言 国内外目标检测算法研究现状 传统目标检测算法的发展现状...

Spring Cloud智慧工地源码,利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术开发,微服务架构

智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术&#xff0c;以PC端&#xff0c;移动端&#xff0c;设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...