C# 发送邮件

news2024/11/23 19:10:30

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;
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1164932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11月2日星期四今日早报简报微语报早读

11月2日星期四&#xff0c;农历九月十九&#xff0c;早报微语早读分享。 1、茅台深夜提价&#xff1a;11月1日起飞天、五星出厂价格平均上调约20&#xff05;&#xff0c;贵州茅台&#xff1a;市场指导价不变&#xff1b; 2、杭州拟发文规范直播电商业&#xff1a;不得要求商…

2015年亚太杯APMCM数学建模大赛C题识别网络中的错误连接求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 C题 识别网络中的错误连接 原题再现 网络是描述真实系统结构的强大工具——社交网络描述人与人之间的关系&#xff0c;万维网描述网页之间的超链接关系。随着现代技术的发展&#xff0c;我们积累了越来越多的网络数据&#xff0c;但这些数据部…

vs2013/2015/2019扩展-联机提示“未能建立到服务器的连接“/“基础连接已经关闭: 发送时发生错误“/“远程主机强迫关闭了一个现有的连接“

VS2013\VS2015 输入命令 [Net.ServicePointManager]::SecurityProtocol[Net.ServicePointManager]::SecurityProtocol-bOR [Net.SecurityProtocolType]::Tls12 采用上述方法偶尔可以有效&#xff0c;重新启动VS就没用了 VS2019 怎么样都不行 最终解决办法&#xff1a;换一…

CRM系统如何帮助企业实现管理信息化?

21世纪的今天&#xff0c;企业不重视CRM信息化会导致什么后果&#xff1f;我们先来看这个例子—— 假设有一家中小型电子商务公司&#xff0c;他们销售各种电子产品&#xff0c;如手机、平板、电脑和配件等。在开始使用CRM系统之前&#xff0c;他们的客户数据分散在各个部门的…

自己动手实现一个深度学习算法——三、神经网络的学习

文章目录 1.从数据中学习1&#xff09;数据驱动2&#xff09;训练数据和测试数据 2.损失函数1)均方误差2)交叉熵误差3)mini-batch学习 3.数值微分1&#xff09;概念2&#xff09;数值微分实现 4.梯度1&#xff09;实现2&#xff09;梯度法3&#xff09;梯度法实现4&#xff09;…

kvm--存储挂载

创建存储卷 然后后面分别挂载到虚拟机不同目录下 查看磁盘 格式化&#xff08;需要挂载的分区或磁盘&#xff09; 获得UUID 挂载磁盘或分区 开机自动挂载 vim /etc/fstab mount -a 不报错就可以了

linux驱动学习加强版-7(平台虚拟总线的引入)

文章目录 一、为什么要引入平台虚拟总线二、平台虚拟总线架构三、使用platform框架去写一个驱动 一、为什么要引入平台虚拟总线 Linux platform driver机制和传统的device_driver机制相比&#xff0c;一个十分明显的优势在于platform机制将本身的资源注册进内核&#xff0c;由…

【sql注入】sql关卡1~4

前言&#xff1a; 靶场自取 level-1 测试注入点 POC: 1,1,1,1"",1/1,1/0 》存在注入点 爆破 POC: id-1andextractvalue(1,concat(0x7e,user(),0x7e))-- level-2 尝试注入点 POC1:admin POC2:admin POC3:adminandsleep(3)-- POC4: adminandif(1,1,0)0-- POC…

AtCoder abc143

D - Triangles 排序后two pointer # -*- coding: utf-8 -*- # time : 2023/6/2 13:30 # author : yhdutongwoo.cn # desc : # file : atcoder.py # software : PyCharmimport bisect import copy import sys from sortedcontainers import SortedList from coll…

Spring-Spring 之底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Bean是否是懒加载initMeth…

书接上回,如何用 LlamaIndex 搭建聊天机器人?

LlamaIndex 是领先的开源数据检索框架&#xff0c;能够在各种应用中发挥优势&#xff0c;其中一个典型的应用就是在企业内部搭建聊天机器人。 对于企业而言&#xff0c;随着文档数量不断增多&#xff0c;文档管理会变得愈发困难。因此&#xff0c;许多企业会基于内部知识库搭建…

视频增强和修复工具 Topaz Video AI mac中文版功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等。 使用Topaz Video AI非常简单&#xff0c…

动态创建链表

动态创建链表的好处 相比于之前链表的几种功能介绍&#xff0c;都是在设定好的链表基础之上进行插入、删除等&#xff0c;那么如果我们要创建链表元素很多&#xff0c;就得去定义很多个元素结构体&#xff0c;非常不方便&#xff0c;这个时候应该用到动态创建链表。 动态创建…

MySQL在CentOS7环境下的安装

自己由于换了新的服务器&#xff0c;所以打算顺手编写此篇文章记录下来整个环境的重新安装过程 注意&#xff1a;切换为root身份进行操作 -->指令 su root 1、如果存在老安装包&#xff0c;将其卸载 这里我们使用管道grep进行过滤&#xff0c;查看是否之前已经安装过安装包…

【电路笔记】-相量图和相量代数

相量图和相量代数 文章目录 相量图和相量代数1、概述2、相量图3、相量代数3.1 加减3.2 差异化与整合 4、总结 1、概述 交流电信号可以用三种不同的方法来表示&#xff0c;以便表征和实现代数运算。 前面的文章中已经介绍了两种方法&#xff0c;本文稍后将介绍一种新的图形方法…

STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出

1. 课程概述&#xff08;297.1&#xff09; 课程要求&#xff1a;C语言熟练&#xff0c;提前学完 C51 2. 开发软件Keil5的安装&#xff08;298.2&#xff09; 开发环境的安装 编程语言&#xff1a;C语言需要安装的软件有两个&#xff1a;Keil5 和 STM32CubeMX Keil5 的安装…

使用pinia报错:setriderList()not a function

setriderList是我定义的事件&#xff0c;引用没有问题&#xff0c;但是就是请求不到&#xff0c;刷新就没有了&#xff0c;但是一会又开始报错了&#xff0c;进行排查吧 1&#xff1a;首先&#xff0c;需要确认报错信息是这样的&#xff1a; setriderList() not a function …

rwkv模型lora微调之accelerate和deepspeed训练加速

目录 一、rwkv模型简介 二、lora原理简介 三、rwkv-lora微调 1、数据整理 2、环境搭建 a、Dockerfile编写 b、制造镜像 c、容器启动 3、训练代码修改 四、模型推理 1、模型推理 2、lora权重合并 3、推理web服务 五、总结 由于业务采用的ChatGLM模型推理成本太大了…

短视频账号矩阵系统saas源码搭建/技术

一、短视频矩阵系统建模----技术api接口--获取用户授权 技术文档分享&#xff1a; 本系统采用MySQL数据库进行存储&#xff0c;数据库设计如下&#xff1a; 1.用户表&#xff08;user&#xff09;&#xff1a; - 用户ID&#xff08;user_id&#xff09; - 用户名&#xff08…

【C/C++笔试练习】new和deleted底层原理、静态数据成员、运算符重载、只能使用new创建的类、模版声明、另类加法、走方格的方案数

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;new和deleted底层原理&#xff08;2&#xff09;静态数据成员&#xff08;3&#xff09;运算符重载&#xff08;4&#xff09;程序分析&#xff08;5&#xff09;静态数据成员&#xff08;6&#xff09;只能使用new创建的…