Przeglądaj źródła

1. 图片水印支持自定义编码器
2. 发邮件支持抄送和秘密抄送

懒得勤快 2 lat temu
rodzic
commit
c981f9ded0

+ 4 - 9
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -3,7 +3,7 @@
         <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5;net6;net7</TargetFrameworks>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>2.5.9.3</Version>
+        <Version>2.5.9.4</Version>
         <Authors>懒得勤快</Authors>
         <Description>Masuit.Tools基础公共库,包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。</Description>
         <Copyright>懒得勤快,长空X</Copyright>
@@ -47,43 +47,39 @@
         <PackageReference Include="HtmlSanitizer" Version="8.0.645" />
         <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
         <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
-        <PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
+        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+        <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
         <PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta15" />
         <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
         <PackageReference Include="System.Configuration.ConfigurationManager" Version="7.0.0" />
         <PackageReference Include="System.Management" Version="7.0.0" />
         <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
-        <PackageReference Include="SharpCompress" Version="0.32.2" />
+        <PackageReference Include="SharpCompress" Version="0.33.0" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
         <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
         <PackageReference Include="System.Diagnostics.PerformanceCounter" Version="7.0.0" />
-        <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1'">
         <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
         <PackageReference Include="System.Diagnostics.PerformanceCounter" Version="7.0.0" />
-        <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'net5'">
         <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
         <PackageReference Include="System.Diagnostics.PerformanceCounter" Version="7.0.0" />
-        <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
         <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
         <PackageReference Include="System.Diagnostics.PerformanceCounter" Version="7.0.0" />
-        <PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
         <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
         <PackageReference Include="System.Diagnostics.PerformanceCounter" Version="7.0.0" />
-        <PackageReference Include="SixLabors.ImageSharp" Version="3.0.0" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
@@ -93,7 +89,6 @@
         <PackageReference Include="System.Net.Http" Version="4.3.4" />
         <PackageReference Include="System.Runtime.Numerics" version="4.3.0" targetFramework="net461" />
         <PackageReference Include="System.ValueTuple" version="4.5.0" targetFramework="net461" />
-        <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
     </ItemGroup>
 
     <ItemGroup>

+ 41 - 2
Masuit.Tools.Abstractions/Media/ImageWatermarker.cs

@@ -6,6 +6,8 @@ using SixLabors.ImageSharp.Processing;
 using SixLabors.ImageSharp.Processing.Processors.Transforms;
 using System;
 using System.IO;
+using SixLabors.ImageSharp.Formats;
+using SixLabors.ImageSharp.PixelFormats;
 
 namespace Masuit.Tools.Media
 {
@@ -21,13 +23,42 @@ namespace Masuit.Tools.Media
         /// </summary>
         public int SmallImagePixelsThreshold { get; set; }
 
+        public IImageEncoder ImageEncoder { get; set; }
+
         private readonly Stream _stream;
 
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="originStream">图片流</param>
         public ImageWatermarker(Stream originStream)
         {
             _stream = originStream;
         }
 
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="originStream">图片流</param>
+        /// <param name="encoder">指定编码器</param>
+        public ImageWatermarker(Stream originStream, IImageEncoder encoder) : this(originStream)
+        {
+            ImageEncoder = encoder;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="originStream">图片流</param>
+        /// <param name="encoder">指定编码器</param>
+        /// <param name="skipWatermarkForSmallImages">是否跳过小缩略图</param>
+        /// <param name="smallImagePixelsThreshold">小图像素大小</param>
+        public ImageWatermarker(Stream originStream, IImageEncoder encoder, bool skipWatermarkForSmallImages, int smallImagePixelsThreshold) : this(originStream, encoder)
+        {
+            SkipWatermarkForSmallImages = skipWatermarkForSmallImages;
+            SmallImagePixelsThreshold = smallImagePixelsThreshold;
+        }
+
         public PooledMemoryStream AddWatermark(string watermarkText, string ttfFontPath, int fontSize, Color color, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int textPadding = 10)
         {
             var fonts = new FontCollection();
@@ -44,9 +75,10 @@ namespace Masuit.Tools.Media
         /// <param name="watermarkPosition">水印位置</param>
         /// <param name="textPadding">边距</param>
         /// <param name="font">字体</param>
-        /// <returns></returns>
         public PooledMemoryStream AddWatermark(string watermarkText, Font font, Color color, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int textPadding = 10)
         {
+            var imageFormat = Image.DetectFormat(_stream);
+            _stream.Seek(0, SeekOrigin.Begin);
             using var img = Image.Load(_stream);
             var textMeasure = TextMeasurer.Measure(watermarkText, new TextOptions(font));
             if (SkipWatermarkForSmallImages && (img.Height < Math.Sqrt(SmallImagePixelsThreshold) || img.Width < Math.Sqrt(SmallImagePixelsThreshold) || img.Width <= textMeasure.Width))
@@ -91,7 +123,14 @@ namespace Masuit.Tools.Media
 
             img.Mutate(c => c.DrawText(watermarkText, font, color, new PointF(x, y)));
             var ms = new PooledMemoryStream();
-            img.SaveAsWebp(ms);
+            if (ImageEncoder == null)
+            {
+                img.Save(ms, imageFormat);
+            }
+            else
+            {
+                img.Save(ms, ImageEncoder);
+            }
             ms.Position = 0;
             return ms;
         }

+ 170 - 156
Masuit.Tools.Abstractions/Models/Email.cs

@@ -7,162 +7,176 @@ namespace Masuit.Tools.Models
 {
 #pragma warning disable 1591
 
-	public class Email : Disposable
-	{
-		/// <summary>
-		/// 发件人用户名
-		/// </summary>
-		public EmailAddress Username { get; set; }
-
-		/// <summary>
-		/// 发件人邮箱密码
-		/// </summary>
-		public string Password { get; set; }
-
-		/// <summary>
-		/// 发送服务器端口号,默认25
-		/// </summary>
-		public int SmtpPort { get; set; } = 25;
-
-		/// <summary>
-		/// 发送服务器地址
-		/// </summary>
-		public string SmtpServer { get; set; }
-
-		/// <summary>
-		/// 邮件标题
-		/// </summary>
-		public string Subject { get; set; }
-
-		/// <summary>
-		/// 邮件正文
-		/// </summary>
-		public string Body { get; set; }
-
-		/// <summary>
-		/// 收件人,多个收件人用英文逗号隔开
-		/// </summary>
-		public string Tos { get; set; }
-
-		/// <summary>
-		/// 是否启用SSL,默认已启用
-		/// </summary>
-		public bool EnableSsl { get; set; } = true;
-
-		/// <summary>
-		/// 附件
-		/// </summary>
-		public List<Attachment> Attachments { get; set; } = new List<Attachment>();
-
-		private MailMessage MailMessage => GetClient();
-
-		/// <summary>
-		/// 邮件消息对象
-		/// </summary>
-		private MailMessage GetClient()
-		{
-			if (string.IsNullOrEmpty(Tos)) return null;
-			var mailMessage = new MailMessage();
-
-			//多个接收者
-			foreach (var str in Tos.Split(','))
-			{
-				mailMessage.To.Add(str);
-			}
-
-			mailMessage.From = new MailAddress(Username, Username);
-			mailMessage.Subject = Subject;
-			mailMessage.Body = Body;
-			mailMessage.IsBodyHtml = true;
-			mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
-			mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
-			mailMessage.Priority = MailPriority.High;
-			foreach (var item in Attachments.AsNotNull())
-			{
-				mailMessage.Attachments.Add(item);
-			}
-
-			return mailMessage;
-		}
-
-		private SmtpClient SmtpClient => new SmtpClient
-		{
-			UseDefaultCredentials = false,
-			EnableSsl = EnableSsl,
-			Host = SmtpServer,
-			Port = SmtpPort,
-			Credentials = new System.Net.NetworkCredential(Username, Password),
-			DeliveryMethod = SmtpDeliveryMethod.Network,
-		};
-
-		//回调方法
-		private Action<string> _actionSendCompletedCallback;
-
-		/// <summary>
-		/// 使用异步发送邮件
-		/// </summary>
-		/// <param name="completedCallback">邮件发送后的回调方法</param>
-		/// <returns></returns>
-		public void SendAsync(Action<string> completedCallback)
-		{
-			if (MailMessage == null) return;
-
-			//发送邮件回调方法
-			_actionSendCompletedCallback = completedCallback;
-			SmtpClient.SendCompleted += SendCompletedCallback;
-			SmtpClient.SendAsync(MailMessage, "true"); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
-		}
-
-		/// <summary>
-		/// 使用同步发送邮件
-		/// </summary>
-		public void Send()
-		{
-			if (MailMessage == null) return;
-			SmtpClient.Send(MailMessage); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
-			Dispose(true);
-		}
-
-		/// <summary>
-		/// 异步操作完成后执行回调方法
-		/// </summary>
-		/// <param name="sender"></param>
-		/// <param name="e"></param>
-		private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
-		{
-			//同一组件下不需要回调方法,直接在此写入日志即可
-			//写入日志
-			if (_actionSendCompletedCallback == null) return;
-			string message;
-			if (e.Cancelled)
-			{
-				message = "异步操作取消";
-			}
-			else if (e.Error != null)
-			{
-				message = $"UserState:{(string)e.UserState},Message:{e.Error}";
-			}
-			else
-			{
-				message = (string)e.UserState;
-			}
-
-			//执行回调方法
-			_actionSendCompletedCallback(message);
-			Dispose(true);
-		}
-
-		/// <summary>
-		/// 释放
-		/// </summary>
-		/// <param name="disposing"></param>
-		public override void Dispose(bool disposing)
-		{
-			MailMessage?.Dispose();
-			SmtpClient?.Dispose();
-			Attachments.ForEach(a => a.Dispose());
-		}
-	}
+    public class Email : Disposable
+    {
+        /// <summary>
+        /// 发件人用户名
+        /// </summary>
+        public EmailAddress Username { get; set; }
+
+        /// <summary>
+        /// 发件人邮箱密码
+        /// </summary>
+        public string Password { get; set; }
+
+        /// <summary>
+        /// 发送服务器端口号,默认25
+        /// </summary>
+        public int SmtpPort { get; set; } = 25;
+
+        /// <summary>
+        /// 发送服务器地址
+        /// </summary>
+        public string SmtpServer { get; set; }
+
+        /// <summary>
+        /// 邮件标题
+        /// </summary>
+        public string Subject { get; set; }
+
+        /// <summary>
+        /// 邮件正文
+        /// </summary>
+        public string Body { get; set; }
+
+        /// <summary>
+        /// 收件人,多个收件人用英文逗号隔开
+        /// </summary>
+        public string Tos { get; set; }
+
+        public List<string> CC { get; set; } = new List<string>();
+
+        public List<string> BCC { get; set; } = new List<string>();
+
+        /// <summary>
+        /// 是否启用SSL,默认已启用
+        /// </summary>
+        public bool EnableSsl { get; set; } = true;
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        public List<Attachment> Attachments { get; set; } = new List<Attachment>();
+
+        private MailMessage MailMessage => GetClient();
+
+        /// <summary>
+        /// 邮件消息对象
+        /// </summary>
+        private MailMessage GetClient()
+        {
+            if (string.IsNullOrEmpty(Tos)) return null;
+            var mailMessage = new MailMessage();
+
+            //多个接收者
+            foreach (var str in Tos.Split(','))
+            {
+                mailMessage.To.Add(str);
+            }
+
+            foreach (var s in CC)
+            {
+                mailMessage.CC.Add(s);
+            }
+
+            foreach (var s in BCC)
+            {
+                mailMessage.Bcc.Add(s);
+            }
+
+            mailMessage.From = new MailAddress(Username, Username);
+            mailMessage.Subject = Subject;
+            mailMessage.Body = Body;
+            mailMessage.IsBodyHtml = true;
+            mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
+            mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
+            mailMessage.Priority = MailPriority.High;
+            foreach (var item in Attachments.AsNotNull())
+            {
+                mailMessage.Attachments.Add(item);
+            }
+
+            return mailMessage;
+        }
+
+        private SmtpClient SmtpClient => new SmtpClient
+        {
+            UseDefaultCredentials = false,
+            EnableSsl = EnableSsl,
+            Host = SmtpServer,
+            Port = SmtpPort,
+            Credentials = new System.Net.NetworkCredential(Username, Password),
+            DeliveryMethod = SmtpDeliveryMethod.Network,
+        };
+
+        //回调方法
+        private Action<string> _actionSendCompletedCallback;
+
+        /// <summary>
+        /// 使用异步发送邮件
+        /// </summary>
+        /// <param name="completedCallback">邮件发送后的回调方法</param>
+        /// <returns></returns>
+        public void SendAsync(Action<string> completedCallback)
+        {
+            if (MailMessage == null) return;
+
+            //发送邮件回调方法
+            _actionSendCompletedCallback = completedCallback;
+            SmtpClient.SendCompleted += SendCompletedCallback;
+            SmtpClient.SendAsync(MailMessage, "true"); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
+        }
+
+        /// <summary>
+        /// 使用同步发送邮件
+        /// </summary>
+        public void Send()
+        {
+            if (MailMessage == null) return;
+            SmtpClient.Send(MailMessage); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
+            Dispose(true);
+        }
+
+        /// <summary>
+        /// 异步操作完成后执行回调方法
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
+        {
+            //同一组件下不需要回调方法,直接在此写入日志即可
+            //写入日志
+            if (_actionSendCompletedCallback == null) return;
+            string message;
+            if (e.Cancelled)
+            {
+                message = "异步操作取消";
+            }
+            else if (e.Error != null)
+            {
+                message = $"UserState:{(string)e.UserState},Message:{e.Error}";
+            }
+            else
+            {
+                message = (string)e.UserState;
+            }
+
+            //执行回调方法
+            _actionSendCompletedCallback(message);
+            Dispose(true);
+        }
+
+        /// <summary>
+        /// 释放
+        /// </summary>
+        /// <param name="disposing"></param>
+        public override void Dispose(bool disposing)
+        {
+            MailMessage?.Dispose();
+            SmtpClient?.Dispose();
+            Attachments.ForEach(a => a.Dispose());
+        }
+    }
 
 #pragma warning restore 1591
 }

+ 1 - 1
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -17,7 +17,7 @@
         <Product>Masuit.Tools.AspNetCore</Product>
         <PackageId>Masuit.Tools.AspNetCore</PackageId>
         <LangVersion>latest</LangVersion>
-        <Version>1.1.9.3</Version>
+        <Version>1.1.9.4</Version>
         <RepositoryType></RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
         <FileVersion>1.1.9</FileVersion>

+ 2 - 2
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -6,7 +6,7 @@
 官网教程:https://ldqk.org/55
 github:https://github.com/ldqk/Masuit.Tools
         </Description>
-        <Version>2.5.9.3</Version>
+        <Version>2.5.9.4</Version>
         <Copyright>Copyright © 懒得勤快</Copyright>
         <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
         <PackageTags>Masuit.Tools,工具库,Utility,Crypt,Extensions</PackageTags>
@@ -54,7 +54,7 @@ github:https://github.com/ldqk/Masuit.Tools
         <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.10" />
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.3" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4" />
     </ItemGroup>
     <ItemGroup>
       <Compile Remove="..\Masuit.Tools.Abstractions\Mapping\**" />

+ 1 - 1
Masuit.Tools.Excel/Masuit.Tools.Excel.csproj

@@ -3,7 +3,7 @@
         <TargetFramework>netstandard2.0</TargetFramework>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>1.2.5.2</Version>
+        <Version>1.2.5.3</Version>
         <Authors>懒得勤快</Authors>
         <Description>Masuit.Tools.Excel导出库,支持一些简单数据的导出,支持图片列</Description>
         <Copyright>懒得勤快</Copyright>

+ 1 - 1
Masuit.Tools.Net45/Masuit.Tools.Net45.csproj

@@ -310,7 +310,7 @@
       <Version>5.2.9</Version>
     </PackageReference>
     <PackageReference Include="Newtonsoft.Json">
-      <Version>13.0.2</Version>
+      <Version>13.0.3</Version>
     </PackageReference>
     <PackageReference Include="System.ValueTuple">
       <Version>4.5.0</Version>

+ 1 - 1
Masuit.Tools.Net45/package.nuspec

@@ -2,7 +2,7 @@
 <package>
   <metadata>
     <id>Masuit.Tools.Net45</id>
-    <version>2.5.9.3</version>
+    <version>2.5.9.4</version>
     <title>Masuit.Tools</title>
     <authors>懒得勤快</authors>
     <owners>masuit.com</owners>

+ 2 - 2
Masuit.Tools/Masuit.Tools.csproj

@@ -183,10 +183,10 @@
       <Version>5.2.9</Version>
     </PackageReference>
     <PackageReference Include="Newtonsoft.Json">
-      <Version>13.0.2</Version>
+      <Version>13.0.3</Version>
     </PackageReference>
     <PackageReference Include="SharpCompress">
-      <Version>0.32.2</Version>
+      <Version>0.33.0</Version>
     </PackageReference>
     <PackageReference Include="SixLabors.ImageSharp">
       <Version>2.1.3</Version>

+ 1 - 1
Masuit.Tools/package.nuspec

@@ -2,7 +2,7 @@
 <package>
   <metadata>
     <id>Masuit.Tools.Net</id>
-    <version>2.5.9.3</version>
+    <version>2.5.9.4</version>
     <title>Masuit.Tools</title>
     <authors>懒得勤快</authors>
     <owners>masuit.com</owners>

+ 1 - 1
Test/Masuit.Tools.Core.Test/Masuit.Tools.Core.Test.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.3" />
+    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.4" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
     <PackageReference Include="xunit" Version="2.4.2" />