Parcourir la source

企业微信邮件接口

Lyyyi il y a 1 mois
Parent
commit
b7d2776a74

+ 34 - 1
OASystem/OASystem.Api/Controllers/AITestController.cs

@@ -1,5 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using OASystem.API.OAMethodLib.HunYuanAPI;
+using OASystem.API.OAMethodLib.QiYeWeChatAPI;
+using OASystem.Domain.ViewModels.QiYeWeChat;
 using TencentCloud.Hunyuan.V20230901.Models;
 
 namespace OASystem.API.Controllers
@@ -12,13 +14,44 @@ namespace OASystem.API.Controllers
     {
         private readonly IHunyuanService _hunyuanService;
         private readonly ILogger<AITestController> _logger;
+        private readonly IQiYeWeChatApiService _qiYeWeChatApiService;
 
-        public AITestController(IHunyuanService hunyuanService, ILogger<AITestController> logger)
+        public AITestController(IHunyuanService hunyuanService, ILogger<AITestController> logger, IQiYeWeChatApiService qiYeWeChatApiService)
         {
             _hunyuanService = hunyuanService;
             _logger = logger;
+            _qiYeWeChatApiService = qiYeWeChatApiService;
         }
 
+        #region 企业微信发送邮件测试
+
+        /// <summary>
+        /// 企业微信发送邮件测试
+        /// </summary>
+        [HttpPost("sendEmail")]
+        public async Task<ActionResult<string>> SendEmail([FromForm] IFormFile[] feils)
+        {
+            try
+            {
+                var req = new EmailRequestDto() {
+                    ToEmails = new List<string> { "johnny.yang@pan-american-intl.com" },
+                    CcEmails = new List<string> { "Roy.lei@pan-american-intl.com" },
+                    BccEmails = new List<string> { "Roy.lei@pan-american-intl.com" },
+                    Subject = "测试邮件 - 来自企业微信API",
+                    Body = "这是一封通过企业微信API发送的测试邮件,包含附件。",
+                    Files = feils
+                };
+                var response = await _qiYeWeChatApiService.EmailSendAsync(req);
+                return Ok(response);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "调用企业微信邮件API失败。");
+                return StatusCode(500, new { Message = "调用企业微信邮件API失败,请检查配置或网络。", Detail = ex.Message });
+            }
+        }
+        #endregion
+
         #region 混元 AI
         /// <summary>
         /// 基础对话示例

+ 2 - 3
OASystem/OASystem.Api/Controllers/AuthController.cs

@@ -29,7 +29,7 @@ namespace OASystem.API.Controllers
         private readonly MessageRepository _message;
         private readonly SystemMenuPermissionRepository _sysMenuPermRep;
         private readonly MessageRepository _messageRep;
-        private readonly IQiYeWeChatApiService _qiYeWeChatApiServic;
+        private readonly IQiYeWeChatApiService _qiYeWeChatApiService;
         private readonly IHubContext<ChatHub, IChatClient> _hubContext;
         private readonly DeviceTokenRepository _deviceTokenRep;
 
@@ -62,7 +62,7 @@ namespace OASystem.API.Controllers
             _mapper = mapper;
             _message = message;
             _sysMenuPermRep = sysMenuPermRep;
-            _qiYeWeChatApiServic = qiYeWeChatApiService;
+            _qiYeWeChatApiService = qiYeWeChatApiService;
             _messageRep = messageRep;
             _deviceTokenRep = deviceRep;
             _hubContext = hubContext;
@@ -289,7 +289,6 @@ namespace OASystem.API.Controllers
             return Ok(JsonView(view));
         }
 
-
         /// <summary>
         /// 申请注册 数据Data
         /// </summary>

+ 7 - 0
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/IQiYeWeChatApiService.cs

@@ -40,6 +40,13 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         /// <returns></returns>
         Task<QYWX_UserInfosView> GetUserInfosAsync();
 
+        /// <summary>
+        /// 发送邮件
+        /// </summary>
+        /// <param name="dto">发送邮件的请求对象</param>
+        /// <returns></returns>
+        Task<EmailResult> EmailSendAsync(EmailRequestDto dto);
+
         /// <summary>
         /// 获取企业所有打卡规则
         /// </summary>

+ 136 - 6
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/QiYeWeChatApiService.cs

@@ -2,6 +2,7 @@
 using OASystem.Domain.Dtos.QiYeWeChat;
 using OASystem.Domain.ViewModels.QiYeWeChat;
 using System.Diagnostics;
+using System.Net.Mail;
 using System.Text.Json;
 
 namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
@@ -18,12 +19,30 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         //private readonly string Email_AgentId = "1000004";   //E-Mail Id
         //private readonly string Approve_AgentId = "3010040";     //审批 Id
         //private readonly string GroupStatus_AgentId = "1000008"; //OA通知 Id
-        private readonly string PersonnelAssistant_Corpsecret = "ig--IJd6TxWDMJ1wT4e-RDRcRX12v5GjB359DNATwJ4"; //人事助手凭证密钥
-        private readonly string PunchCard_Corpsecret = "Xhrl37GOqlAjsu0VzUSJECaJdjzkDXQLbvrzRsZQb8M";          //打卡凭证密钥
-        private readonly string Email_Corpsecret = "NA1zbJM15GmgjPYwDOqz59dIo1Wnug-MbU107MeUemc"; //E-Mail 凭证密钥
-        private readonly string AddressBook_Corpsecret = "Y1tnjh7j-BvbqAytAoXZPUbmDR6dqLTL6mXtc6PZ7fo";  //通讯录同步 凭证密钥
-        private readonly string Approve_Corpsecret = "k_Jo69Jw9Hqg_in-Rypbs30PNbxOYa1t4e-dxYuT-kw";  //审批 凭证密钥
-        private readonly string GroupStatus_Corpsecret = "7J_ST3jTPzbZpFwl7ttToTVufjEx6O2wuApvKHxt2Ak"; //OA通知Secret
+        /// <summary>
+        /// 人事助手凭证密钥
+        /// </summary>
+        private readonly string PersonnelAssistant_Corpsecret = "ig--IJd6TxWDMJ1wT4e-RDRcRX12v5GjB359DNATwJ4"; // 人事助手凭证密钥
+        /// <summary>
+        /// 打卡凭证密钥
+        /// </summary>
+        private readonly string PunchCard_Corpsecret = "Xhrl37GOqlAjsu0VzUSJECaJdjzkDXQLbvrzRsZQb8M";          // 打卡凭证密钥
+        /// <summary>
+        /// E-Mail 凭证密钥
+        /// </summary>
+        private readonly string Email_Corpsecret = "NA1zbJM15GmgjPYwDOqz59dIo1Wnug-MbU107MeUemc";              // E-Mail 凭证密钥
+        /// <summary>
+        /// 通讯录同步 凭证密钥
+        /// </summary>
+        private readonly string AddressBook_Corpsecret = "Y1tnjh7j-BvbqAytAoXZPUbmDR6dqLTL6mXtc6PZ7fo";        // 通讯录同步 凭证密钥
+        /// <summary>
+        /// 审批 凭证密钥
+        /// </summary>
+        private readonly string Approve_Corpsecret = "k_Jo69Jw9Hqg_in-Rypbs30PNbxOYa1t4e-dxYuT-kw";            // 审批 凭证密钥
+        /// <summary>
+        /// OA通知Secret
+        /// </summary>
+        private readonly string GroupStatus_Corpsecret = "7J_ST3jTPzbZpFwl7ttToTVufjEx6O2wuApvKHxt2Ak";        // OA通知Secret
 
         private readonly DateTime _1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0);
         private readonly JobPostRepository _jobPostRep;
@@ -359,6 +378,117 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
         }
         #endregion
 
+        #region 邮件
+
+        /// <summary>
+        /// 发送邮件
+        /// </summary>
+        /// <param name="dto">发送邮件的请求对象</param>
+        /// <returns></returns>
+        public async Task<EmailResult> EmailSendAsync(EmailRequestDto dto)
+        {
+            EmailResult emailResult = new();
+
+            // 参数验证
+            if (dto.ToEmails == null) return new EmailResult() { errcode = -1, errmsg = "收件人邮箱列表不能为空" };
+            if (string.IsNullOrEmpty(dto.Subject)) return new EmailResult() { errcode = -1, errmsg = "邮件主题不能为空" };
+            if (string.IsNullOrEmpty(dto.Body)) return new EmailResult() { errcode = -1, errmsg = "邮件内容不能为空" };
+           
+            // 当前内容大小
+            long currentSize = GetUtf8ByteSize(dto.Body);
+            // 文件处理
+            var attachments = new List<Domain.ViewModels.QiYeWeChat.Attachment>();
+            var files = dto.Files;
+            if (files != null && files.Length > 0) 
+            {
+                if (files.Length > 200) return new EmailResult() { errcode = -1, errmsg = "附件个数不能超过200个" };
+
+                foreach (var file in files)
+                {
+                    if (file == null || file.Length == 0)
+                    {
+                        return new EmailResult() { errcode = -1, errmsg = "文件不能为空" };
+                    }
+
+                    string base64String = string.Empty;
+                    using (var memoryStream = new MemoryStream())
+                    {
+                        await file.CopyToAsync(memoryStream);
+                        var bytes = memoryStream.ToArray();
+                        base64String = Convert.ToBase64String(bytes);
+                    }
+
+                    var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file.FileName);
+                    var extension = Path.GetExtension(file.FileName);
+                    var feilName = $"{fileNameWithoutExtension}{extension}";
+
+                    currentSize += GetUtf8ByteSize(base64String);
+                    attachments.Add(new Domain.ViewModels.QiYeWeChat.Attachment() { 
+                        file_name = feilName,
+                        content = base64String
+                    });
+                }
+            }
+
+            // 限制大小
+            long maxSizeBytes = 50 * 1024 * 1024; // 50MB
+
+            if (currentSize > maxSizeBytes)
+            {
+                return new EmailResult() { errcode = -1, errmsg = "邮件内容和附件总大小不能超过50MB" };
+            }
+
+            Access_TokenView access_Token = await GetTokenAsync(3);
+            if (access_Token.errcode != 0)
+            {
+                emailResult.errcode = access_Token.errcode;
+                emailResult.errmsg = string.Format("【企业微信】【获取邮件列表】【Token】【Msg】{0}", access_Token.errmsg);
+            }
+            string url = string.Format("/cgi-bin/exmail/app/compose_send?access_token={0}", access_Token.access_token);
+
+            var reqData = new
+            {
+                to = new
+                {
+                    emails = dto.ToEmails
+                },
+                cc = new
+                {
+                    emails = dto.CcEmails
+                },
+                bcc = new
+                {
+                    emails = dto.BccEmails
+                },
+                subject = dto.Subject,
+                content = dto.Body,
+                attachment_list = attachments
+            };
+
+            var reqContent = new StringContent(System.Text.Json.JsonSerializer.Serialize(reqData), Encoding.UTF8, "application/json");
+            var create_Req = await _httpClient.PostAsync(url, reqContent);
+            var stringResponse = await create_Req.Content.ReadAsStringAsync();
+            emailResult = System.Text.Json.JsonSerializer.Deserialize<EmailResult>(stringResponse,
+                new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
+            return emailResult;
+        }
+
+        /// <summary>
+        /// 计算字符串的字节大小(UTF-8编码)
+        /// </summary>
+        private static long GetUtf8ByteSize(string text)
+        {
+            if (string.IsNullOrEmpty(text))
+            {
+                return 0;
+            }
+
+            return Encoding.UTF8.GetByteCount(text);
+        }
+
+
+        #endregion
+
         #region 打卡
 
         /// <summary>

+ 56 - 1
OASystem/OASystem.Domain/ViewModels/QiYeWeChat/CheckInView.cs

@@ -1,4 +1,5 @@
-using System;
+using Microsoft.AspNetCore.Http;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -92,6 +93,54 @@ namespace OASystem.Domain.ViewModels.QiYeWeChat
 
     #endregion
 
+    #region 邮件相关
+
+    public class EmailRequestDto
+    {
+        /// <summary>
+        /// 收件人邮箱地址列表
+        /// </summary>
+        public List<string> ToEmails { get; set; }
+
+        /// <summary>
+        /// 抄送人邮箱地址列表
+        /// </summary>
+        public List<string> CcEmails { get; set; }
+
+        /// <summary>
+        /// 密送人邮箱地址列表
+        /// </summary>
+        public List<string> BccEmails { get; set; }
+
+        /// <summary>
+        /// 邮件主题
+        /// </summary>
+        public string Subject { get; set; }
+
+        /// <summary>
+        /// 邮件正文内容
+        /// </summary>
+        public string Body { get; set; }
+
+        /// <summary>
+        /// 附件列表
+        /// </summary>
+        public IFormFile[] Files { get; set; }
+    }
+
+    public class Attachment
+    {
+        /// <summary>
+        /// 文件名
+        /// </summary>
+        public string file_name { get; set; }
+        /// <summary>
+        /// 文件内容(base64编码),所有附件加正文的大小不允许超过50M, 且附件个数不能超过200个
+        /// </summary>
+        public string content { get; set; }
+    }
+    #endregion
+
     /// <summary>
     /// 企业微信 API
     /// 打卡月数据
@@ -336,4 +385,10 @@ namespace OASystem.Domain.ViewModels.QiYeWeChat
         地点异常 = 5, // 地点异常
         设备异常 = 6 // 设备异常
     }
+
+    public class EmailResult
+    {
+        public int errcode { get; set; }
+        public string errmsg { get; set; }
+    }
 }