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;

}

}

}

相关推荐
临床数据科学和人工智能兴趣组26 分钟前
在R语言中, 使用 as.factor() 函数转换数值型变量
开发语言·r语言
andyweike4 小时前
php笔记
开发语言·笔记·php
Circ.4 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
波力海苔夹心脆6755 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
现任明教教主~6 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
Zhou1411366 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
码匠许师傅7 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
小小小小钰儿8 小时前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全