TJC.Cyclops.EMailKit
2024.9.14.1
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package TJC.Cyclops.EMailKit --version 2024.9.14.1
NuGet\Install-Package TJC.Cyclops.EMailKit -Version 2024.9.14.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="TJC.Cyclops.EMailKit" Version="2024.9.14.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add TJC.Cyclops.EMailKit --version 2024.9.14.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: TJC.Cyclops.EMailKit, 2024.9.14.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install TJC.Cyclops.EMailKit as a Cake Addin #addin nuget:?package=TJC.Cyclops.EMailKit&version=2024.9.14.1 // Install TJC.Cyclops.EMailKit as a Cake Tool #tool nuget:?package=TJC.Cyclops.EMailKit&version=2024.9.14.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Cyclops.FrameWork
Cyclops.FrameWork 基于aspnetcore封装的api框架,集成了一线开发的常用设置和基础功能;可以用较少的时间代价,让开发人员将精力更多地集中在业务上。
- [√] 全局api调用和框架级异常日志,支持Knife4j接口文档的查看、调试和代码生成
- [√] 接口入参校验,Cyclops.FrameWork中的接口参数校验完全基于System.ComponentModel.DataAnnotations,且在此基础上提供了验证数据是否存在ExistAttribute等扩展功能
- [√] 统一返回值,无论是使用Cyclops.FrameWork中的Result及其子类,或者CSharp中的裸类型都自动返回全局统一值,从框架上避免对接混乱
- [√] 标准化快捷文件上传、下载和excel的导入、导出,支持MS Azure和阿里OSS
- [√] 在安全方面集成jwt认证和SafeComparisonFilter防重放攻击,并且支持多租户权限
- [√] 标准化配置,支持Nacos
一、配置示例
{
"HostingOptions": {
"ServiceName": "Cyclops.WebApplication1",
"AppOptions": {
"Urls": [ "https://127.0.0.1:7000" ],
"DisableSwagger": false,
"HideConsoleLog": false,
//jwt TokenManagement
"JWTAuthConfig": {
"Secret": "base64:HU8MlQQDHfGaQ+k+0q3z4HKJvNQUTjK5uRGodDATyKc=",
"Issuer": "yswenli.cnblogs.com",
"Audience": "Cyclops.FrameWork.WebApi",
"AccessExpiration": 30
},
"MaxRequestSize": 5242880, //5242880,
"UserStaticPath": true,
"StaticPaths": [ "upload" ],
"DisableSafeComparisonFilter": false,
"SafeComparisonExpired": 5,
"GloabVerifyCode": "9365"
},
"Domain": "https://dev.cyclops.com",
"NacosConfig": {
"Listeners": [
{
"Optional": false,
"DataId": "Common",
"Group": "DEFAULT_GROUP"
},
{
"Optional": false,
"DataId": "OperationService",
"Group": "DEFAULT_GROUP"
}
],
"Namespace": "dev",
"ServerAddresses": [ "http://127.0.0.1:8848" ],
"UserName": "",
"Password": "",
"ConfigUseRpc": false,
"NamingUseRpc": false
}
}
}
AppConfig节点以下的可以与nacos集成
二、初始化代码示例
public class Program
{
public static void Main(string[] args)
{
WebApp.OnStarted += WebApp_OnStarted;
WebApp.OnStopped += WebApp_OnStopped;
WebApp.RunWebHost<Startup>(args);
}
static void WebApp_OnStarted()
{
Logger.Info($"{WebApp.ServiceName}应用已启动");
}
static void WebApp_OnStopped()
{
Logger.Info($"{WebApp.ServiceName}应用已停止");
}
}
/// <summary>
/// Startup
/// </summary>
public class Startup : BaseStartup
{
/// <summary>
/// Startup
/// </summary>
/// <param name="configuration"></param>
public Startup(IConfiguration configuration) : base(configuration)
{
}
}
三、控制器示例
继承基类即可
public class AuthController : BaseApiController
方法示例
/// <summary>
/// Login
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[AllowAnonymous, HttpPost, DisplayName("Login")]
public async Task<Result> Login([Required(ErrorMessage = "请输入用户名或密码"), FromBody] UserLoginInput input)
{
var user = new SysUser();
return SuccessResult(await CreateToken(user));
}
/// <summary>
/// 获取验证码
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[SuppressMonitor]
[DisplayName("获取验证码"), HttpGet]
public Result GetCaptcha()
{
ICaptcha captcha = ServiceProviderUtil.GetRequiredService<ICaptcha>();
var codeId = YitIdHelper.NextId().ToString();
var captchas = captcha.Generate(codeId, 180);
return SuccessResult(new { Id = codeId, Img = captchas.Base64 });
}
四、集成数据校验
/// <summary>
/// 登录信息
/// </summary>
public class UserLoginInput
{
/// <summary>
/// 请输入用户名
/// </summary>
[Required(ErrorMessage = "请输入用户名"), Exists("用户名不存在", TableName = "bus_user", ColumnName = "user_name")]
public string UserName { get; set; }
/// <summary>
/// 请输入密码
/// </summary>
[Required(ErrorMessage = "请输入密码"), Custom<UserLoginInput>("密码不正确", "Valide")]
public string Password { get; set; }
/// <summary>
/// 验证密码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public bool Valide(object? input)
{
if (input == null) return false;
if (input is string password && password == "123456")
{
return true;
}
return false;
}
}
五、防重放攻击示例
/// <summary>
/// 接口安全参数校验测试
/// </summary>
[SafeComparisonFilter]
public class SafeController : BaseApiController
{
/// <summary>
/// Test
/// </summary>
/// <param name="testInfo"></param>
/// <returns></returns>
[HttpPost]
public Result Test([FromBody] TestInfo testInfo)
{
return SuccessResult(testInfo);
}
/// <summary>
/// test2
/// </summary>
/// <returns></returns>
[HttpGet, AllowAnonymous, NoSafeComparisonFilter]
public Result Test2()
{
return SuccessResult();
}
}
六、文件上传下载Excel导入导出示例
public class FileAdminController : BaseApiController
{
/// <summary>
/// 导入
/// </summary>
/// <returns></returns>
[HttpPost]
[NoLoginAuth, AllowAnonymous]
public Result Import(IFormCollection collection)
{
var data = collection.SaveAsDataTable();
return SuccessResult(data);
}
/// <summary>
/// 导出
/// </summary>
/// <returns></returns>
[HttpPost]
[NoLoginAuth, AllowAnonymous]
public IActionResult Export()
{
return _env.Download("export.png");
}
/// <summary>
/// 导出数据文件
/// </summary>
/// <returns></returns>
[HttpGet]
[NoLoginAuth, AllowAnonymous]
public IActionResult ExportFile([FromQuery] bool isExcel = false)
{
var fileName = "export.xlsx";
if (!isExcel)
{
fileName = "export.csv";
}
var dt = new DataTable();
//return _env.ExportFile(dt, fileName);
return Export(dt, fileName);
}
/// <summary>
/// 导出数据文件
/// </summary>
/// <returns></returns>
[HttpGet]
[NoLoginAuth, AllowAnonymous]
public IActionResult ExportDataFile([FromQuery] bool isExcel = false)
{
var fileName = "export.xlsx";
if (!isExcel)
{
fileName = "export.csv";
}
var list = new List<BusUser>
{
new BusUser()
{
Id = 1,
UserName = "张三"
}
};
//return _env.ExportFile(list, fileName);
return Export(list, fileName);
}
/// <summary>
/// 测试上传文件大小
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> UploadFile(IFormCollection form)
{
var fileStream = await form.SaveAsStreamsAsync();
return fileStream.First().Value.Download("test.jpg");
}
/// <summary>
/// 测试限制上传文件大小
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[HttpPost, RequestSizeLimit(2 * 1024 * 1024)]
public async Task<IActionResult> UploadFileByLimit(IFormCollection form)
{
var fileStream = await form.SaveAsStreamsAsync();
return fileStream.First().Value.Download("test.jpg");
}
/// <summary>
/// 测试不限制上传文件大小
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[HttpPost, DisableRequestSizeLimit]
public async Task<IActionResult> UploadFileByNonLimit(IFormCollection form)
{
var fileStream = await form.SaveAsStreamsAsync();
return fileStream.First().Value.Download("test.jpg");
}
/// <summary>
/// 示例获取流
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<Stream> GetStream()
{
var ms = new MemoryStream(RandomUtil.GetBytes(1024));
return await Task.FromResult(ms);
}
/// <summary>
/// 示例获取字节数组
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<byte[]> GetBytes()
{
return await Task.FromResult(RandomUtil.GetBytes(1024));
}
}
七、支持非api接口内容
/// <summary>
/// 返回指定内容结果
/// </summary>
/// <param name="controller"></param>
/// <param name="text"></param>
/// <param name="contentType"></param>
/// <param name="statusCode"></param>
/// <returns></returns>
public async Task<IActionResult> ContentAsync(string text, string contentType = "text/plain", int statusCode = 200)
{
var contentResult = new ContentResult()
{
Content = text,
ContentType = contentType,
StatusCode = statusCode
};
return await Task.FromResult(contentResult);
}
/// <summary>
/// 返回空结果
/// </summary>
/// <param name="controller"></param>
/// <returns></returns>
public async Task<IActionResult> EmptyAsync()
{
return await Task.FromResult(new EmptyResult());
}
/// <summary>
/// 返回下载结果
/// </summary>
/// <param name="controller"></param>
/// <param name="fileContent">下载时的文件名称</param>
/// <param name="fileContent">内容字节数组</param>
/// <param name="contentType">内容mime类型</param>
/// <returns></returns>
public async Task<IActionResult> DownloadAsync(string fileDownloadName,
byte[] fileContent,
string contentType)
{
return await Task.FromResult(new FileContentResult(fileContent, contentType) { FileDownloadName = fileDownloadName });
}
/// <summary>
/// 返回下载结果
/// </summary>
/// <param name="controller"></param>
/// <param name="fileName">内容文件地址</param>
/// <param name="contentType">内容mime类型</param>
/// <returns></returns>
public async Task<IActionResult> DownloadAsync(string fileName,
string contentType)
{
return await Task.FromResult(new VirtualFileResult(fileName, contentType)
{
EnableRangeProcessing = true,
FileDownloadName = PathUtil.GetFileName(fileName)
});
}
/// <summary>
/// 返回流结果
/// </summary>
/// <param name="controller"></param>
/// <param name="fileDownloadName"></param>
/// <param name="fileStream"></param>
/// <param name="contentType"></param>
/// <returns></returns>
public async Task<IActionResult> DownloadAsync(string fileDownloadName,
Stream fileStream,
string contentType
)
{
return await Task.FromResult(new FileStreamResult(fileStream, contentType)
{
EnableRangeProcessing = true,
FileDownloadName = fileDownloadName
});
}
/// <summary>
/// 返回跳转结果
/// </summary>
/// <param name="controller"></param>
/// <param name="url"></param>
/// <returns></returns>
public async Task<IActionResult> RedirectAsync(string url)
{
return await Task.FromResult(new RedirectResult(url));
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net8.0
- MailKit (>= 4.7.1.1)
- TJC.Cyclops.Common (>= 2024.9.14.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2024.12.19.2 | 0 | 12/19/2024 |
2024.12.19.1 | 0 | 12/19/2024 |
2024.12.18.1 | 2 | 12/18/2024 |
2024.12.17.2 | 67 | 12/17/2024 |
2024.12.17.1 | 63 | 12/17/2024 |
2024.12.16.1 | 79 | 12/16/2024 |
2024.12.12.1 | 73 | 12/13/2024 |
2024.12.11.2 | 75 | 12/11/2024 |
2024.12.10.3 | 87 | 12/10/2024 |
2024.12.10.2 | 70 | 12/10/2024 |
2024.12.10.1 | 62 | 12/10/2024 |
2024.12.9.1 | 65 | 12/9/2024 |
2024.12.6.1 | 88 | 12/6/2024 |
2024.12.5.1 | 89 | 12/5/2024 |
2024.12.4.1 | 95 | 12/4/2024 |
2024.12.3.2 | 109 | 12/3/2024 |
2024.12.3.1 | 78 | 12/3/2024 |
2024.12.2.2 | 80 | 12/2/2024 |
2024.12.2.1 | 78 | 12/2/2024 |
2024.11.29.2 | 102 | 11/29/2024 |
2024.11.29.1 | 79 | 11/29/2024 |
2024.11.28.1 | 91 | 11/28/2024 |
2024.11.27.4 | 96 | 11/27/2024 |
2024.11.27.3 | 77 | 11/27/2024 |
2024.11.27.2 | 80 | 11/27/2024 |
2024.11.27.1 | 75 | 11/27/2024 |
2024.11.26.3 | 85 | 11/26/2024 |
2024.11.26.2 | 75 | 11/26/2024 |
2024.11.26.1 | 73 | 11/26/2024 |
2024.11.25.5 | 67 | 11/25/2024 |
2024.11.25.4 | 60 | 11/25/2024 |
2024.11.25.3 | 69 | 11/25/2024 |
2024.11.25.2 | 76 | 11/25/2024 |
2024.11.25.1 | 72 | 11/25/2024 |
2024.11.23.2 | 103 | 11/23/2024 |
2024.11.23.1 | 108 | 11/23/2024 |
2024.11.22.1 | 86 | 11/22/2024 |
2024.11.21.1 | 107 | 11/21/2024 |
2024.11.20.3 | 88 | 11/20/2024 |
2024.11.20.2 | 80 | 11/20/2024 |
2024.11.20.1 | 95 | 11/20/2024 |
2024.11.19.1 | 80 | 11/19/2024 |
2024.11.18.4 | 76 | 11/18/2024 |
2024.11.18.3 | 84 | 11/18/2024 |
2024.11.18.2 | 81 | 11/18/2024 |
2024.11.18.1 | 78 | 11/18/2024 |
2024.11.14.2 | 86 | 11/14/2024 |
2024.11.14.1 | 79 | 11/14/2024 |
2024.11.13.2 | 92 | 11/13/2024 |
2024.11.13.1 | 86 | 11/13/2024 |
2024.11.12.2 | 88 | 11/12/2024 |
2024.11.12.1 | 78 | 11/12/2024 |
2024.11.11.1 | 90 | 11/11/2024 |
2024.11.8.1 | 85 | 11/8/2024 |
2024.11.6.1 | 84 | 11/6/2024 |
2024.10.29.2 | 80 | 10/29/2024 |
2024.10.29.1 | 87 | 10/29/2024 |
2024.10.28.1 | 88 | 10/28/2024 |
2024.10.25.1 | 81 | 10/25/2024 |
2024.10.24.1 | 77 | 10/24/2024 |
2024.10.21.1 | 100 | 10/21/2024 |
2024.10.18.2 | 118 | 10/18/2024 |
2024.10.18.1 | 115 | 10/18/2024 |
2024.10.16.1 | 98 | 10/16/2024 |
2024.10.12.1 | 89 | 10/12/2024 |
2024.10.11.1 | 93 | 10/11/2024 |
2024.10.10.1 | 103 | 10/10/2024 |
2024.10.9.1 | 92 | 10/9/2024 |
2024.10.8.1 | 86 | 10/8/2024 |
2024.9.26.1 | 173 | 9/26/2024 |
2024.9.25.1 | 86 | 9/25/2024 |
2024.9.23.4 | 103 | 9/23/2024 |
2024.9.23.3 | 95 | 9/23/2024 |
2024.9.23.2 | 93 | 9/23/2024 |
2024.9.23.1 | 96 | 9/23/2024 |
2024.9.19.1 | 89 | 9/19/2024 |
2024.9.14.1 | 120 | 9/14/2024 |
2024.9.10.3 | 112 | 9/10/2024 |
2024.9.10.2 | 158 | 9/10/2024 |
2024.9.10.1 | 101 | 9/10/2024 |
2024.9.5.1 | 106 | 9/5/2024 |
2024.8.22.1 | 163 | 8/22/2024 |
2024.8.21.1 | 134 | 8/21/2024 |
2024.8.19.1 | 121 | 8/19/2024 |
2024.8.15.1 | 118 | 8/15/2024 |
企服版框架中邮件收发套件