ソースを参照

优化邮箱bounces

懒得勤快 4 年 前
コミット
23815c18f5

+ 2 - 1
src/Masuit.MyBlogs.Core/Common/Mails/IMailSender.cs

@@ -6,6 +6,7 @@ namespace Masuit.MyBlogs.Core.Common.Mails
     {
         void Send(string title, string content, string tos);
         List<string> GetBounces();
-        string AddBounces(string email);
+        string AddRecipient(string email);
+        public bool HasBounced(string address);
     }
 }

+ 11 - 3
src/Masuit.MyBlogs.Core/Common/Mails/MailgunSender.cs

@@ -16,11 +16,13 @@ namespace Masuit.MyBlogs.Core.Common.Mails
         private readonly HttpClient _httpClient;
         private readonly IConfiguration _configuration;
         private readonly ICacheManager<List<string>> _cacheManager;
+        private readonly ICacheManager<bool> _bouncedCacheManager;
 
-        public MailgunSender(HttpClient httpClient, IConfiguration configuration, ICacheManager<List<string>> cacheManager)
+        public MailgunSender(HttpClient httpClient, IConfiguration configuration, ICacheManager<List<string>> cacheManager, ICacheManager<bool> bouncedCacheManager)
         {
             _configuration = configuration;
             _cacheManager = cacheManager;
+            _bouncedCacheManager = bouncedCacheManager;
             _httpClient = httpClient;
             _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"api:{_configuration["MailgunConfig:apikey"]}")));
         }
@@ -41,13 +43,19 @@ namespace Masuit.MyBlogs.Core.Common.Mails
         public List<string> GetBounces()
         {
             EmailAddress email = _configuration["MailgunConfig:from"];
-            return _cacheManager.GetOrAdd("emailbounces", _ => _httpClient.GetStringAsync($"https://api.mailgun.net/v3/{email.Domain}/bounces").ContinueWith(t =>
+            return _cacheManager.GetOrAdd("email-bounces", _ => _httpClient.GetStringAsync($"https://api.mailgun.net/v3/{email.Domain}/bounces").ContinueWith(t =>
              {
                  return t.IsCompletedSuccessfully ? ((JArray)JObject.Parse(t.Result)["items"])?.Select(x => (string)x["address"]).ToList() : new List<string>();
              }).Result);
         }
 
-        public string AddBounces(string email)
+        public bool HasBounced(string address)
+        {
+            EmailAddress email = _configuration["MailgunConfig:from"];
+            return _bouncedCacheManager.GetOrAdd("email-bounced", _ => _httpClient.GetStringAsync($"https://api.mailgun.net/v3/{email.Domain}/bounces/{address}").ContinueWith(t => t.IsCompletedSuccessfully && JObject.Parse(t.Result).ContainsKey("error")).Result);
+        }
+
+        public string AddRecipient(string email)
         {
             EmailAddress mail = _configuration["MailgunConfig:from"];
             return _httpClient.PostAsync($"https://api.mailgun.net/v3/{mail.Domain}/bounces", new MultipartFormDataContent

+ 6 - 3
src/Masuit.MyBlogs.Core/Common/Mails/SmtpSender.cs

@@ -12,7 +12,6 @@ namespace Masuit.MyBlogs.Core.Common.Mails
     {
         public void Send(string title, string content, string tos)
         {
-#if !DEBUG
             new Email()
             {
                 EnableSsl = bool.Parse(CommonHelper.SystemSettings.GetOrAdd("EnableSsl", "true")),
@@ -24,7 +23,6 @@ namespace Masuit.MyBlogs.Core.Common.Mails
                 Subject = title,
                 Tos = tos
             }.Send();
-#endif
         }
 
         public List<string> GetBounces()
@@ -32,12 +30,17 @@ namespace Masuit.MyBlogs.Core.Common.Mails
             return File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "email-bounces.txt"), Encoding.UTF8).Split(',').ToList();
         }
 
-        public string AddBounces(string email)
+        public string AddRecipient(string email)
         {
             var bounces = GetBounces();
             bounces.Add(email);
             File.WriteAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "email-bounces.txt"), bounces.Join(","));
             return "添加成功";
         }
+
+        public bool HasBounced(string address)
+        {
+            return GetBounces().Contains(address);
+        }
     }
 }

+ 1 - 1
src/Masuit.MyBlogs.Core/Controllers/CommentController.cs

@@ -55,7 +55,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, "您提交的内容包含敏感词,被禁止发表,请检查您的内容后尝试重新提交!");
             }
 
-            if (MailSender.GetBounces().Any(s => s == dto.Email))
+            if (MailSender.HasBounced(dto.Email))
             {
                 return ResultData(null, false, "邮箱地址错误,请使用有效的邮箱地址!");
             }

+ 1 - 1
src/Masuit.MyBlogs.Core/Controllers/MsgController.cs

@@ -131,7 +131,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, "您提交的内容包含敏感词,被禁止发表,请检查您的内容后尝试重新提交!");
             }
 
-            if (MailSender.GetBounces().Any(s => s == dto.Email))
+            if (MailSender.HasBounced(dto.Email))
             {
                 return ResultData(null, false, "邮箱地址错误,请使用有效的邮箱地址!");
             }

+ 1 - 1
src/Masuit.MyBlogs.Core/Controllers/SystemController.cs

@@ -264,7 +264,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
         public ActionResult BounceEmail(string email)
         {
-            var msg = MailSender.AddBounces(email);
+            var msg = MailSender.AddRecipient(email);
             return Ok(new { msg });
         }
 

+ 2 - 2
src/Masuit.MyBlogs.Core/Models/DTO/AdvertisementDto.cs

@@ -8,7 +8,7 @@ namespace Masuit.MyBlogs.Core.Models.DTO
         /// <summary>
         /// 标题
         /// </summary>
-        [Required(ErrorMessage = "标题不能为空"), MinLength(10, ErrorMessage = "标题建议设置为10-128字"), MaxLength(128, ErrorMessage = "标题建议设置为10-128字")]
+        [Required(ErrorMessage = "标题不能为空"), MinLength(10, ErrorMessage = "标题建议至少设置为10字"), MaxLength(128, ErrorMessage = "标题不能超过128字")]
         public string Title { get; set; }
 
         /// <summary>
@@ -24,7 +24,7 @@ namespace Masuit.MyBlogs.Core.Models.DTO
         /// <summary>
         /// 描述
         /// </summary>
-        [Required(ErrorMessage = "描述文字不能为空"), MinLength(50, ErrorMessage = "标题建议设置为50-1000字"), MaxLength(1000, ErrorMessage = "标题建议设置为50-1000字")]
+        [Required(ErrorMessage = "描述文字不能为空"), MinLength(40, ErrorMessage = "描述文字建议至少设置为40字"), MaxLength(300, ErrorMessage = "描述文字不能超过300字")]
         public string Description { get; set; }
 
         /// <summary>

+ 2 - 0
src/Masuit.MyBlogs.Core/Startup.cs

@@ -24,6 +24,7 @@ using Masuit.Tools.Core.AspNetCore;
 using Masuit.Tools.Core.Config;
 using Masuit.Tools.Core.Net;
 using Masuit.Tools.Systems;
+using Masuit.Tools.Win32;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
@@ -257,6 +258,7 @@ namespace Masuit.MyBlogs.Core
                     }
                 });
                 Console.WriteLine($"导入自定义词库完成,耗时{time}s");
+                Windows.ClearMemorySilent();
             });
 
             string lucenePath = Path.Combine(env.ContentRootPath, luceneIndexerOptions.Path);