Просмотр исходного кода

😁邮件发送库改为MailKit

zuohuaijun 2 лет назад
Родитель
Сommit
c038d45cab

+ 1 - 2
Admin.NET/Admin.NET.Application/Configuration/Email.json

@@ -4,10 +4,9 @@
   "Email": {
     "Host": "smtp.163.com", // 主机
     "Port": 465, // 端口 465、994、25
+    "EnableSsl": true, // 启用SSL
     "DefaultFromEmail": "zuohuaijun@163.com", // 默认发件者邮箱
     "DefaultToEmail": "515096995@qq.com", // 默认接收人邮箱
-    "EnableSsl": true, // 启用SSL
-    "UseDefaultCredentials": false, // 是否使用默认凭据
     "UserName": "zuohuaijun@163.com", // 邮箱账号
     "Password": "", // 邮箱授权码
     "DefaultFromName": "Admin.NET 通用权限开发平台" // 默认邮件标题

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -21,7 +21,6 @@
     <PackageReference Include="AspNet.Security.OAuth.Gitee" Version="6.0.15" />
     <PackageReference Include="AspNet.Security.OAuth.Weixin" Version="6.0.15" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
-    <PackageReference Include="FluentEmail.Smtp" Version="3.0.2" />
     <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.7" />
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.7" />
     <PackageReference Include="Furion.Pure" Version="4.9.1.7" />
@@ -29,6 +28,7 @@
     <PackageReference Include="Lazy.Captcha.Core" Version="2.0.6" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.5" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.4.5" />
+    <PackageReference Include="MailKit" Version="4.3.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.25" />
     <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="6.0.25" />
     <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="6.0.25" />

+ 2 - 2
Admin.NET/Admin.NET.Core/EventBus/AppEventSubscriber.cs

@@ -45,8 +45,8 @@ public class AppEventSubscriber : IEventSubscriber, ISingleton, IDisposable
         //var mailTemp = File.ReadAllText(mailTempPath);
         //var mail = await _serviceScope.ServiceProvider.GetRequiredService<IViewEngine>().RunCompileFromCachedAsync(mailTemp, );
 
-        var title = "Admin.NET 框架异常";
-        await _serviceScope.ServiceProvider.GetRequiredService<SysMessageService>().SendEmail(JSON.Serialize(context.Source.Payload), title, true);
+        var title = "Admin.NET 系统异常";
+        await _serviceScope.ServiceProvider.GetRequiredService<SysEmailService>().SendEmail(JSON.Serialize(context.Source.Payload), title);
     }
 
     /// <summary>

+ 54 - 0
Admin.NET/Admin.NET.Core/Service/Message/SysEmailService.cs

@@ -0,0 +1,54 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using MailKit.Net.Smtp;
+using MimeKit;
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 系统邮件发送服务
+/// </summary>
+[ApiDescriptionSettings(Order = 370)]
+public class SysEmailService : IDynamicApiController, ITransient
+{
+    private readonly EmailOptions _emailOptions;
+
+    public SysEmailService(IOptions<EmailOptions> emailOptions)
+    {
+        _emailOptions = emailOptions.Value;
+    }
+
+    /// <summary>
+    /// 发送邮件
+    /// </summary>
+    /// <param name="content"></param>
+    /// <param name="title"></param>
+    /// <returns></returns>
+    [DisplayName("发送邮件")]
+    public async Task SendEmail([Required] string content, string title = "Admin.NET 系统邮件")
+    {
+        var message = new MimeMessage();
+        message.From.Add(new MailboxAddress(_emailOptions.DefaultFromEmail, _emailOptions.DefaultFromEmail));
+        message.To.Add(new MailboxAddress(_emailOptions.DefaultToEmail, _emailOptions.DefaultToEmail));
+        message.Subject = title;
+        message.Body = new TextPart("html")
+        {
+            Text = content
+        };
+
+        using var client = new SmtpClient();
+        client.Connect(_emailOptions.Host, _emailOptions.Port, _emailOptions.EnableSsl);
+        client.Authenticate(_emailOptions.UserName, _emailOptions.Password);
+        client.Send(message);
+        client.Disconnect(true);
+
+        await Task.CompletedTask;
+    }    
+}

+ 0 - 17
Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs

@@ -7,7 +7,6 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
-using FluentEmail.Core;
 using Microsoft.AspNetCore.SignalR;
 
 namespace Admin.NET.Core.Service;
@@ -20,17 +19,14 @@ public class SysMessageService : IDynamicApiController, ITransient
 {
     private readonly SysCacheService _sysCacheService;
     private readonly EmailOptions _emailOptions;
-    private readonly IFluentEmail _fluentEmail;
     private readonly IHubContext<OnlineUserHub, IOnlineUserHub> _chatHubContext;
 
     public SysMessageService(SysCacheService sysCacheService,
         IOptions<EmailOptions> emailOptions,
-        IFluentEmail fluentEmail,
         IHubContext<OnlineUserHub, IOnlineUserHub> chatHubContext)
     {
         _sysCacheService = sysCacheService;
         _emailOptions = emailOptions.Value;
-        _fluentEmail = fluentEmail;
         _chatHubContext = chatHubContext;
     }
 
@@ -89,17 +85,4 @@ public class SysMessageService : IDynamicApiController, ITransient
         }
         await _chatHubContext.Clients.Clients(userlist).ReceiveMessage(input);
     }
-
-    /// <summary>
-    /// 发送邮件
-    /// </summary>
-    /// <param name="message"></param>
-    /// <param name="title"></param>
-    /// <param name="isHtml"></param>
-    /// <returns></returns>
-    [DisplayName("发送邮件")]
-    public async Task SendEmail([Required] string message, string title = "系统邮件", bool isHtml = false)
-    {
-        await _fluentEmail.To(_emailOptions.DefaultToEmail).Subject(title).Body(message, isHtml).SendAsync();
-    }
 }

+ 15 - 22
Admin.NET/Admin.NET.Core/Service/Sms/SysSmsService.cs → Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs

@@ -49,31 +49,24 @@ public class SysSmsService : IDynamicApiController, ITransient
             code = verifyCode
         });
 
-        try
+        var client = CreateClient();
+        var sendSmsRequest = new SendSmsRequest
         {
-            var client = CreateClient();
-            var sendSmsRequest = new SendSmsRequest
-            {
-                PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔
-                SignName = _smsOptions.Aliyun.SignName, // 短信签名
-                TemplateCode = _smsOptions.Aliyun.TemplateCode, // 短信模板
-                TemplateParam = templateParam.ToString(), // 模板中的变量替换JSON串
-                OutId = YitIdHelper.NextId().ToString()
-            };
-            var sendSmsResponse = client.SendSms(sendSmsRequest);
-            if (sendSmsResponse.Body.Code == "OK" && sendSmsResponse.Body.Message == "OK")
-            {
-                // var bizId = sendSmsResponse.Body.BizId;
-                _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60));
-            }
-            else
-            {
-                throw Oops.Oh($"短信发送失败:{sendSmsResponse.Body.Code}-{sendSmsResponse.Body.Message}");
-            }
+            PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔
+            SignName = _smsOptions.Aliyun.SignName, // 短信签名
+            TemplateCode = _smsOptions.Aliyun.TemplateCode, // 短信模板
+            TemplateParam = templateParam.ToString(), // 模板中的变量替换JSON串
+            OutId = YitIdHelper.NextId().ToString()
+        };
+        var sendSmsResponse = client.SendSms(sendSmsRequest);
+        if (sendSmsResponse.Body.Code == "OK" && sendSmsResponse.Body.Message == "OK")
+        {
+            // var bizId = sendSmsResponse.Body.BizId;
+            _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60));
         }
-        catch (Exception ex)
+        else
         {
-            throw Oops.Oh($"短信发送失败:{ex.Message}");
+            throw Oops.Oh($"短信发送失败:{sendSmsResponse.Body.Code}-{sendSmsResponse.Body.Message}");
         }
 
         await Task.CompletedTask;

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs

@@ -9,9 +9,9 @@
 
 using AngleSharp.Html.Parser;
 using AspNetCoreRateLimit;
-using FluentEmail.Core;
 using Lazy.Captcha.Core;
 using Magicodes.ExporterAndImporter.Pdf;
+using MailKit.Net.Smtp;
 using Nest;
 using OnceMi.AspNetCore.OSS;
 
@@ -107,7 +107,7 @@ public class SysServerService : IDynamicApiController, ITransient
         var nestAssembly = typeof(IElasticClient).Assembly.GetName();
         var limitAssembly = typeof(IpRateLimitMiddleware).Assembly.GetName();
         var htmlParserAssembly = typeof(HtmlParser).Assembly.GetName();
-        var fluentEmailAssembly = typeof(IFluentEmail).Assembly.GetName();
+        var fluentEmailAssembly = typeof(SmtpClient).Assembly.GetName();
 
         return new[]
         {

+ 0 - 10
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -122,16 +122,6 @@ public class Startup : AppStartup
         var ossOpt = App.GetConfig<OSSProviderOptions>("OSSProvider", true);
         services.AddOSSService(Enum.GetName(ossOpt.Provider), "OSSProvider");
 
-        // 电子邮件
-        var emailOpt = App.GetConfig<EmailOptions>("Email", true);
-        services.AddFluentEmail(emailOpt.DefaultFromEmail, emailOpt.DefaultFromName)
-            .AddSmtpSender(new SmtpClient(emailOpt.Host, emailOpt.Port)
-            {
-                EnableSsl = emailOpt.EnableSsl,
-                UseDefaultCredentials = emailOpt.UseDefaultCredentials,
-                Credentials = new NetworkCredential(emailOpt.UserName, emailOpt.Password)
-            });
-
         // 模板引擎
         services.AddViewEngine();