Przeglądaj źródła

😊更换发送邮件组件FluentEmail

zuohuaijun 3 lat temu
rodzic
commit
1e1664f711

+ 9 - 8
Admin.NET/Admin.NET.Application/Configuration/Email.json

@@ -2,13 +2,14 @@
     "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",
 
     "Email": {
-        "Server": "smtp.163.com", // 主机
-        "Port": 465, // 端口 465/994 25
-        "SenderName": "系统邮件", // 发送者名称
-        "SenderEmail": "zuohuaijun@163.com", // 发件者邮箱
-        "ToEmail": "515096995@qq.com", // 接收人邮箱
-        "Account": "", // 发件邮箱账号
-        "Password": "", // 发件邮箱密码
-        "Security": true // 启用SSL和TLS
+        "Host": "smtp.163.com", // 主机
+        "Port": 465, // 端口 465、994、25
+        "DefaultFromEmail": "zuohuaijun@163.com", // 默认发件者邮箱
+        "DefaultToEmail": "515096995@qq.com", // 默认接收人邮箱
+        "EnableSsl": true, // 启用SSL
+        "UseDefaultCredentials": false, //是否使用默认凭据
+        "UserName": "", // 邮箱账号
+        "Password": "", // 邮箱密码
+        "DefaultFromName": "系统邮件" // 默认邮件标题
     }
 }

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

@@ -17,6 +17,7 @@
     <PackageReference Include="AngleSharp" Version="1.0.1" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
     <PackageReference Include="DotNetCore.Natasha.CSharp" Version="5.0.2" />
+    <PackageReference Include="FluentEmail.Smtp" Version="3.0.2" />
     <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.5.7" />
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.5.7" />
     <PackageReference Include="Furion.Pure" Version="4.8.5.7" />
@@ -25,7 +26,6 @@
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.4.2" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.13" />
     <PackageReference Include="NEST" Version="7.17.5" />
-    <PackageReference Include="NETCore.MailKit" Version="2.1.0" />
     <PackageReference Include="NewLife.Redis" Version="5.1.2023.203" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.22.0" />

+ 42 - 2
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -3683,9 +3683,49 @@
             邮件配置选项
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.EmailOptions.ToEmail">
+        <member name="P:Admin.NET.Core.EmailOptions.Host">
             <summary>
-            接收人邮箱
+            主机
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.Port">
+            <summary>
+            端口
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.DefaultFromEmail">
+            <summary>
+            默认发件者邮箱
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.DefaultToEmail">
+            <summary>
+            默认接收人邮箱
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.EnableSsl">
+            <summary>
+            启用SSL
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.UseDefaultCredentials">
+            <summary>
+            是否使用默认凭据
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.UserName">
+            <summary>
+            邮箱账号
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.Password">
+            <summary>
+            邮箱密码
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.DefaultFromName">
+            <summary>
+            默认邮件标题
             </summary>
         </member>
         <member name="T:Admin.NET.Core.OAuthOptions">

+ 44 - 6
Admin.NET/Admin.NET.Core/Option/EmailOptions.cs

@@ -1,14 +1,52 @@
-using NETCore.MailKit.Infrastructure.Internal;
-
-namespace Admin.NET.Core;
+namespace Admin.NET.Core;
 
 /// <summary>
 /// 邮件配置选项
 /// </summary>
-public sealed class EmailOptions : MailKitOptions, IConfigurableOptions
+public sealed class EmailOptions : IConfigurableOptions
 {
     /// <summary>
-    /// 接收人邮箱
+    /// 主机
+    /// </summary>
+    public string Host { get; set; }
+
+    /// <summary>
+    /// 端口
+    /// </summary>
+    public int Port { get; set; }
+
+    /// <summary>
+    /// 默认发件者邮箱
+    /// </summary>
+    public string DefaultFromEmail { get; set; }
+
+    /// <summary>
+    /// 默认接收人邮箱
+    /// </summary>
+    public string DefaultToEmail { get; set; }
+
+    /// <summary>
+    /// 启用SSL
+    /// </summary>
+    public bool EnableSsl { get; set; }
+
+    /// <summary>
+    /// 是否使用默认凭据
+    /// </summary>
+    public bool UseDefaultCredentials { get; set; }
+
+    /// <summary>
+    /// 邮箱账号
+    /// </summary>
+    public string UserName { get; set; }
+
+    /// <summary>
+    /// 邮箱密码
+    /// </summary>
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 默认邮件标题
     /// </summary>
-    public string ToEmail { get; set; }
+    public string DefaultFromName { get; set; }
 }

+ 6 - 12
Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs

@@ -1,5 +1,5 @@
-using Microsoft.AspNetCore.SignalR;
-using NETCore.MailKit.Core;
+using FluentEmail.Core;
+using Microsoft.AspNetCore.SignalR;
 
 namespace Admin.NET.Core.Service;
 
@@ -11,17 +11,17 @@ public class SysMessageService : IDynamicApiController, ITransient
 {
     private readonly SysCacheService _sysCacheService;
     private readonly EmailOptions _emailOptions;
-    private readonly IEmailService _emailService;
+    private readonly IFluentEmail _fluentEmail;
     private readonly IHubContext<OnlineUserHub, IOnlineUserHub> _chatHubContext;
 
     public SysMessageService(SysCacheService sysCacheService,
         IOptions<EmailOptions> emailOptions,
-        IEmailService emailService,
+        IFluentEmail fluentEmail,
         IHubContext<OnlineUserHub, IOnlineUserHub> chatHubContext)
     {
         _sysCacheService = sysCacheService;
         _emailOptions = emailOptions.Value;
-        _emailService = emailService;
+        _fluentEmail = fluentEmail;
         _chatHubContext = chatHubContext;
     }
 
@@ -94,12 +94,6 @@ public class SysMessageService : IDynamicApiController, ITransient
     /// <returns></returns>
     public async Task SendEmail(string message)
     {
-        //// 设置发送人邮件地址和名称
-        //var sendInfo = new SenderInfo
-        //{
-        //    SenderEmail = _emailOptions.SenderEmail,
-        //    SenderName = _emailOptions.SenderName,
-        //};
-        await _emailService.SendAsync(_emailOptions.ToEmail, _emailOptions.SenderName, message);
+        await _fluentEmail.To(_emailOptions.DefaultToEmail).Body(message).SendAsync();
     }
 }

+ 3 - 0
Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs

@@ -1,5 +1,6 @@
 using AngleSharp.Html.Parser;
 using AspNetCoreRateLimit;
+using FluentEmail.Core;
 using Lazy.Captcha.Core;
 using Magicodes.ExporterAndImporter.Excel;
 using Magicodes.ExporterAndImporter.Pdf;
@@ -95,6 +96,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();
 
         return new[]
         {
@@ -113,6 +115,7 @@ public class SysServerService : IDynamicApiController, ITransient
             new { nestAssembly.Name, nestAssembly.Version },
             new { limitAssembly.Name, limitAssembly.Version },
             new { htmlParserAssembly.Name, htmlParserAssembly.Version },
+            new { fluentEmailAssembly.Name, fluentEmailAssembly.Version },
         };
     }
 }

+ 30 - 24
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -10,12 +10,14 @@ using Microsoft.AspNetCore.HttpOverrides;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
-using NETCore.MailKit.Extensions;
+using NewLife.Model;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using OnceMi.AspNetCore.OSS;
 using System;
 using System.IO;
+using System.Net;
+using System.Net.Mail;
 using Yitter.IdGenerator;
 
 namespace Admin.NET.Web.Core;
@@ -58,28 +60,28 @@ public class Startup : AppStartup
         });
 
         services.AddControllersWithViews()
-            .AddAppLocalization()
-            .AddNewtonsoftJson(options =>
-            {
-                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 首字母小写(驼峰样式)
-                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 时间格式化
-                // options.SerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
-                // options.SerializerSettings.DateParseHandling = DateParseHandling.None;
-                // options.SerializerSettings.Converters.Add(new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal });
-                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 忽略循环引用
-                // options.SerializerSettings.Converters.Add(new LongJsonConverter()); // long转string(防止js精度溢出) 超过16位开启
-                // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; // 忽略空值
-            })
-            .AddInjectWithUnifyResult<AdminResultProvider>();
+                .AddAppLocalization()
+                .AddNewtonsoftJson(options =>
+                {
+                    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 首字母小写(驼峰样式)
+                    options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 时间格式化
+                    // options.SerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
+                    // options.SerializerSettings.DateParseHandling = DateParseHandling.None;
+                    // options.SerializerSettings.Converters.Add(new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal });
+                    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 忽略循环引用
+                    // options.SerializerSettings.Converters.Add(new LongJsonConverter()); // long转string(防止js精度溢出) 超过16位开启
+                    // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; // 忽略空值
+                })
+                .AddInjectWithUnifyResult<AdminResultProvider>();
 
         // 第三方授权登录
         services.AddAuthentication()
-            .AddWeixin(options =>
-            {
-                var opt = App.GetOptions<OAuthOptions>();
-                options.ClientId = opt.Weixin.ClientId;
-                options.ClientSecret = opt.Weixin.ClientSecret;
-            });
+                .AddWeixin(options =>
+                {
+                    var opt = App.GetOptions<OAuthOptions>();
+                    options.ClientId = opt.Weixin.ClientId;
+                    options.ClientSecret = opt.Weixin.ClientSecret;
+                });
 
         // ElasticSearch
         services.AddElasticSearch();
@@ -128,10 +130,14 @@ public class Startup : AppStartup
         });
 
         // 电子邮件
-        services.AddMailKit(options =>
-        {
-            options.UseMailKit(App.GetOptions<EmailOptions>());
-        });
+        var emailOpt = App.GetOptions<EmailOptions>();
+        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();