Explorar o código

增加邮件发送(异常日志发送邮件)

zuohuaijun %!s(int64=3) %!d(string=hai) anos
pai
achega
3386df98a9

+ 1 - 2
Admin.NET/Admin.NET.Application/Service/TestService.cs

@@ -37,8 +37,7 @@ public class TestService : IDynamicApiController, ITransient
     public async Task<List<Test>> TestUnitOfWork()
     {
         await _testRep.InsertAsync(new Test() { Name = "admin" });
-        var a = 0;
-        var b = 1 / a;
+        throw new Exception("异常");
         return await _testRep.GetListAsync();
     }
 }

+ 5 - 4
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -20,16 +20,17 @@
 
   <ItemGroup>
     <PackageReference Include="Caching.CSRedis" Version="3.8.3" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="3.9.0" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="3.9.0" />
-    <PackageReference Include="Furion.Pure" Version="3.9.0" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="3.9.1" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="3.9.1" />
+    <PackageReference Include="Furion.Pure" Version="3.9.1" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.6.4" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.7" />
     <PackageReference Include="MySql.Data" Version="8.0.29" />
+    <PackageReference Include="NETCore.MailKit" Version="2.1.0" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.6" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.16.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.11.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.0.9.7" />
+    <PackageReference Include="SqlSugarCore" Version="5.0.9.8" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.19" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />

+ 32 - 9
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -2941,6 +2941,16 @@
             数据库配置集合
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.EmailOptions">
+            <summary>
+            邮件配置选项
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EmailOptions.ToEmail">
+            <summary>
+            接收人邮箱
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.OSSProviderOptions">
             <summary>
             对象存储配置选项
@@ -5149,7 +5159,7 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.ISendMessageService.SendMessageToUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
+        <member name="M:Admin.NET.Core.Service.IMessageService.SendMessageToUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
             <summary>
             发送消息给某个人
             </summary>
@@ -5159,7 +5169,7 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.ISendMessageService.SendMessageToUsers(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Collections.Generic.List{System.Int64})">
+        <member name="M:Admin.NET.Core.Service.IMessageService.SendMessageToUsers(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Collections.Generic.List{System.Int64})">
             <summary>
             发送消息给某些人
             </summary>
@@ -5169,7 +5179,7 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.ISendMessageService.SendMessageToAllUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum)">
+        <member name="M:Admin.NET.Core.Service.IMessageService.SendMessageToAllUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum)">
             <summary>
             发送消息给所有人
             </summary>
@@ -5178,7 +5188,7 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.ISendMessageService.SendMessageToOtherUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
+        <member name="M:Admin.NET.Core.Service.IMessageService.SendMessageToOtherUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
             <summary>
             发送消息给除了发送人的其他人
             </summary>
@@ -5188,12 +5198,19 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="T:Admin.NET.Core.Service.SendMessageService">
+        <member name="M:Admin.NET.Core.Service.IMessageService.SendEmail(System.String)">
+            <summary>
+            发送邮件
+            </summary>
+            <param name="message"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Admin.NET.Core.Service.MessageService">
             <summary>
             消息发送服务
             </summary>
         </member>
-        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToAllUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum)">
+        <member name="M:Admin.NET.Core.Service.MessageService.SendMessageToAllUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum)">
             <summary>
             发送消息给所有人
             </summary>
@@ -5202,7 +5219,7 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToOtherUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
+        <member name="M:Admin.NET.Core.Service.MessageService.SendMessageToOtherUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
             <summary>
             发送消息给除了发送人的其他人
             </summary>
@@ -5212,7 +5229,7 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
+        <member name="M:Admin.NET.Core.Service.MessageService.SendMessageToUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
             <summary>
             发送消息给某个人
             </summary>
@@ -5222,7 +5239,7 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToUsers(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Collections.Generic.List{System.Int64})">
+        <member name="M:Admin.NET.Core.Service.MessageService.SendMessageToUsers(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Collections.Generic.List{System.Int64})">
             <summary>
             发送消息给某些人
             </summary>
@@ -5232,6 +5249,12 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
+        <member name="M:Admin.NET.Core.Service.MessageService.SendEmail(System.String)">
+            <summary>
+            发送邮件
+            </summary>
+            <returns></returns>
+        </member>
         <member name="P:Admin.NET.Core.Service.OrgInput.Pid">
             <summary>
             父Id

+ 10 - 0
Admin.NET/Admin.NET.Core/AdminNETConfig.json

@@ -70,5 +70,15 @@
     "SecretKey": "",
     "IsEnableHttps": true,
     "IsEnableCache": true
+  },
+  "Email": {
+    "Server": "smtp.163.com", // 主机
+    "Port": 465, // 端口 465/994 25
+    "SenderName": "系统邮件", // 发送者名称
+    "SenderEmail": "zuohuaijun@163.com", // 发件者邮箱
+    "ToEmail": "515096995@qq.com", // 接收人邮箱
+    "Account": "zuohuaijun@163.com", // 发件邮箱账号
+    "Password": "XXXXXXXXXXXXXXXXX", // 发件邮箱密码
+    "Security": true // 启用SSL和TLS
   }
 }

+ 9 - 6
Admin.NET/Admin.NET.Core/EventBus/LogEventSubscriber.cs

@@ -5,11 +5,11 @@
 /// </summary>
 public class LogEventSubscriber : IEventSubscriber
 {
-    public IServiceProvider Services { get; }
+    private readonly IServiceProvider _serviceProvider;
 
-    public LogEventSubscriber(IServiceProvider services)
+    public LogEventSubscriber(IServiceProvider serviceProvider)
     {
-        Services = services;
+        _serviceProvider = serviceProvider;
     }
 
     /// <summary>
@@ -20,7 +20,7 @@ public class LogEventSubscriber : IEventSubscriber
     [EventSubscribe("Add:OpLog")]
     public async Task CreateOpLog(EventHandlerExecutingContext context)
     {
-        using var scope = Services.CreateScope();
+        using var scope = _serviceProvider.CreateScope();
         var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogOp>>();
         await _rep.InsertAsync((SysLogOp)context.Source.Payload);
     }
@@ -33,9 +33,12 @@ public class LogEventSubscriber : IEventSubscriber
     [EventSubscribe("Add:ExLog")]
     public async Task CreateExLog(EventHandlerExecutingContext context)
     {
-        using var scope = Services.CreateScope();
+        using var scope = _serviceProvider.CreateScope();
         var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogEx>>();
         await _rep.InsertAsync((SysLogEx)context.Source.Payload);
+
+        // 发送邮件
+        await scope.ServiceProvider.GetRequiredService<IMessageService>().SendEmail(JSON.Serialize(context.Source.Payload));
     }
 
     /// <summary>
@@ -46,7 +49,7 @@ public class LogEventSubscriber : IEventSubscriber
     [EventSubscribe("Add:VisLog")]
     public async Task CreateVisLog(EventHandlerExecutingContext context)
     {
-        using var scope = Services.CreateScope();
+        using var scope = _serviceProvider.CreateScope();
         var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogVis>>();
         await _rep.InsertAsync((SysLogVis)context.Source.Payload);
     }

+ 2 - 0
Admin.NET/Admin.NET.Core/Filter/LogExceptionHandler.cs

@@ -17,6 +17,8 @@ public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton
     public async Task OnExceptionAsync(ExceptionContext context)
     {
         var stackTrace = EnhancedStackTrace.Current();
+
+        // 写日志数据库
         await _eventPublisher.PublishAsync("Add:ExLog", new SysLogEx
         {
             ClassName = context.Exception.TargetSite.DeclaringType?.FullName,

+ 2 - 2
Admin.NET/Admin.NET.Core/Hub/ChatHub.cs

@@ -10,10 +10,10 @@ namespace Admin.NET.Core;
 public class ChatHub : Hub<IChatClient>
 {
     private readonly ISysCacheService _cache;
-    private readonly ISendMessageService _sendMessageService;
+    private readonly IMessageService _sendMessageService;
 
     public ChatHub(ISysCacheService cache,
-        ISendMessageService sendMessageService)
+        IMessageService sendMessageService)
     {
         _cache = cache;
         _sendMessageService = sendMessageService;

+ 1 - 1
Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 代码生成配置选项
 /// </summary>
-public class CodeGenOptions : IConfigurableOptions
+public sealed class CodeGenOptions : IConfigurableOptions
 {
     /// <summary>
     /// 数据库实体程序集名称集合

+ 1 - 1
Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 数据库链接配置
 /// </summary>
-public class DbConnectionOptions : IConfigurableOptions
+public sealed class DbConnectionOptions : IConfigurableOptions
 {
     /// <summary>
     /// 启用初始化库表

+ 14 - 0
Admin.NET/Admin.NET.Core/Option/EmailOptions.cs

@@ -0,0 +1,14 @@
+using NETCore.MailKit.Infrastructure.Internal;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 邮件配置选项
+/// </summary>
+public sealed class EmailOptions : MailKitOptions, IConfigurableOptions
+{
+    /// <summary>
+    /// 接收人邮箱
+    /// </summary>
+    public string ToEmail { get; set; }
+}

+ 4 - 18
Admin.NET/Admin.NET.Core/Option/OSSProviderOptions.cs

@@ -1,28 +1,14 @@
-namespace Admin.NET.Core;
+using OnceMi.AspNetCore.OSS;
+
+namespace Admin.NET.Core;
 
 /// <summary>
 /// 对象存储配置选项
 /// </summary>
-public sealed class OSSProviderOptions : IConfigurableOptions
+public sealed class OSSProviderOptions : OSSOptions, IConfigurableOptions
 {
     /// <summary>
     /// 是否启用OSS存储
     /// </summary>
     public bool IsEnable { get; set; }
-
-    public int Provider { get; set; }
-
-    public string Endpoint { get; set; }
-
-    public string AccessKey { get; set; }
-
-    public string SecretKey { get; set; }
-
-    public string Region { get; set; }
-
-    public string SessionToken { get; set; }
-
-    public bool IsEnableHttps { get; set; }
-
-    public bool IsEnableCache { get; set; }
 }

+ 8 - 1
Admin.NET/Admin.NET.Core/Service/Message/ISendMessageService.cs → Admin.NET/Admin.NET.Core/Service/Message/IMessageService.cs

@@ -1,6 +1,6 @@
 namespace Admin.NET.Core.Service;
 
-public interface ISendMessageService
+public interface IMessageService
 {
     /// <summary>
     /// 发送消息给某个人
@@ -40,4 +40,11 @@ public interface ISendMessageService
     /// <param name="type">消息类型</param>
     /// <returns></returns>
     Task SendMessageToOtherUser(string title, string message, MessageTypeEnum type, long userId);
+
+    /// <summary>
+    /// 发送邮件
+    /// </summary>
+    /// <param name="message"></param>
+    /// <returns></returns>
+    Task SendEmail(string message);
 }

+ 27 - 3
Admin.NET/Admin.NET.Core/Service/Message/SendMessageService.cs → Admin.NET/Admin.NET.Core/Service/Message/MessageService.cs

@@ -1,4 +1,5 @@
 using Microsoft.AspNetCore.SignalR;
+using NETCore.MailKit.Core;
 
 namespace Admin.NET.Core.Service;
 
@@ -6,16 +7,23 @@ namespace Admin.NET.Core.Service;
 /// 消息发送服务
 /// </summary>
 [ApiDescriptionSettings(Name = "消息发送", Order = 101)]
-public class SendMessageService : ISendMessageService, IDynamicApiController, ITransient
+public class MessageService : IMessageService, IDynamicApiController, ITransient
 {
     private readonly ISysCacheService _sysCacheService;
     private readonly IHubContext<ChatHub, IChatClient> _chatHubContext;
 
-    public SendMessageService(ISysCacheService sysCacheService,
-        IHubContext<ChatHub, IChatClient> chatHubContext)
+    private readonly EmailOptions _emailOptions;
+    private readonly IEmailService _emailService;
+
+    public MessageService(ISysCacheService sysCacheService,
+        IHubContext<ChatHub, IChatClient> chatHubContext,
+        IOptions<EmailOptions> emailOptions,
+        IEmailService emailService)
     {
         _sysCacheService = sysCacheService;
         _chatHubContext = chatHubContext;
+        _emailOptions = emailOptions.Value;
+        _emailService = emailService;
     }
 
     /// <summary>
@@ -95,4 +103,20 @@ public class SendMessageService : ISendMessageService, IDynamicApiController, IT
         }
         await _chatHubContext.Clients.Clients(userlist).ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
     }
+
+    /// <summary>
+    /// 发送邮件
+    /// </summary>
+    /// <returns></returns>
+    [HttpPost("/email/send")]
+    public async Task SendEmail(string message)
+    {
+        //// 设置发送人邮件地址和名称
+        //var sendInfo = new SenderInfo
+        //{
+        //    SenderEmail = _emailOptions.SenderEmail,
+        //    SenderName = _emailOptions.SenderName,
+        //};
+        await _emailService.SendAsync(_emailOptions.ToEmail, _emailOptions.SenderName, message);
+    }
 }

+ 1 - 0
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -22,6 +22,7 @@ public static class ProjectOptions
         services.AddConfigurableOptions<WechatPayOptions>();
         services.AddConfigurableOptions<PayCallBackOptions>();
         services.AddConfigurableOptions<CodeGenOptions>();
+        services.AddConfigurableOptions<EmailOptions>();
 
         return services;
     }

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

@@ -1,10 +1,15 @@
 using Admin.NET.Core;
+using Admin.NET.Core.Service;
 using Furion;
+using Furion.FriendlyException;
+using Furion.Logging.Extensions;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
+using NETCore.MailKit.Extensions;
+using NETCore.MailKit.Infrastructure.Internal;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using OnceMi.AspNetCore.OSS;
@@ -16,18 +21,19 @@ public class Startup : AppStartup
 {
     public void ConfigureServices(IServiceCollection services)
     {
-        // 统一配置项目选项注册
+        // 注册配置选项
         services.AddProjectOptions();
-
+        // 注册ORM
         services.AddSqlSugarSetup(App.Configuration);
-
+        // 注册JWT
         services.AddJwt<JwtHandler>(enableGlobalAuthorize: true);
-
+        // 注册跨域
         services.AddCorsAccessor();
+        // 注册远程请求
         services.AddRemoteRequest();
-
+        // 注册任务调度
         services.AddTaskScheduler();
-
+        // 注册脱敏检测
         services.AddSensitiveDetection();
 
         services.AddControllersWithViews()
@@ -42,26 +48,23 @@ public class Startup : AppStartup
             })
             .AddInjectWithUnifyResult<AdminResultProvider>();
 
-        // 注册日志事件订阅者(支持自定义消息队列组件)
+        // 注册事件总线
         services.AddEventBus(builder =>
         {
             builder.AddSubscriber<LogEventSubscriber>();
         });
-
         // 注册OSS对象存储
-        services.AddOSSService(option =>
+        services.AddOSSService(options =>
+        {
+            options = App.GetOptions<OSSProviderOptions>();
+        });
+        // 注册邮件
+        services.AddMailKit(options =>
         {
-            var ossOptions = App.GetOptions<OSSProviderOptions>();
-            option.Provider = (OSSProvider)ossOptions.Provider;
-            option.Endpoint = ossOptions.Endpoint;
-            option.AccessKey = ossOptions.AccessKey;
-            option.SecretKey = ossOptions.SecretKey;
-            option.Region = ossOptions.Region;
-            option.IsEnableCache = ossOptions.IsEnableCache;
-            option.IsEnableHttps = ossOptions.IsEnableHttps;
+            options.UseMailKit(App.GetOptions<EmailOptions>());
         });
 
-        // 注册CSRedis缓存
+        // 注册Redis缓存
         services.AddCSRedisSetup();
 
         // 注册模板引擎
@@ -70,7 +73,7 @@ public class Startup : AppStartup
         // 注册即时通讯
         services.AddSignalR();
 
-        // 增加Logo输出显示
+        // 注册logo显示
         services.AddLogoDisplay();
 
         // 注册日志
@@ -99,9 +102,11 @@ public class Startup : AppStartup
         // 添加状态码拦截中间件
         app.UseUnifyResultStatusCodes();
 
+        // 启用HTTPS
         app.UseHttpsRedirection();
         app.UseStaticFiles();
 
+        // HTTP请求日志
         app.UseHttpLogging();
 
         app.UseRouting();