using AMESCoreStudio.CommonTools.Result; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using System; using System.Linq; using System.Net; using System.Net.Mail; using System.Threading.Tasks; using OfficeOpenXml; using OfficeOpenXml.Style; using System.Collections.Generic; using System.Web; using System.IO; using Microsoft.AspNetCore.StaticFiles; namespace AMESCoreStudio.WebApi.Controllers.BLL { /// <summary> /// Mail 寄信 /// </summary> [Route("api/[controller]")] [ApiController] public class MailController : Controller { private readonly AMESContext _context; private readonly IConfiguration _config; /// <summary> /// 建構式 /// </summary> /// <param name="context"></param> public MailController(AMESContext context, IConfiguration config) { _config = config; _context = context; } /// <summary> /// Mail 寄信 /// </summary> /// <param name="Subject">Mail主旨</param> /// <param name="Body">Mail內容</param> /// <param name="ToMailGroup">群組(,區分多組)</param> /// <param name="ToMail">EMail(,區分多組)</param> /// <param name="ToCC">是否為密件</param> /// <param name="Attachment">附件</param> /// <returns></returns> [HttpPost("ToMail")] public async Task<ResultModel<dynamic>> PostMail(string Subject, string Body, string ToMailGroup, string ToMail, bool ToCC = false, string Attachment = null) { ResultModel<dynamic> result = new ResultModel<dynamic>(); // Mail 基本設定資料 string mailFrom = _config.GetSection("MailFrom").Value; string mailSmtpServer = _config.GetSection("MailSmtpServer").Value; int mailSmtpPort = int.Parse(_config.GetSection("MailSmtpPort").Value); string mailUser = _config.GetSection("MailUser").Value; string mailPassword = _config.GetSection("MailUserPassword").Value; MailMessage mesMail = new MailMessage(); mesMail.From = new MailAddress(mailFrom); mesMail.Subject = Subject; mesMail.SubjectEncoding = System.Text.Encoding.UTF8; mesMail.Body = Body; mesMail.IsBodyHtml = true; mesMail.BodyEncoding = System.Text.Encoding.UTF8; // 判斷是否加密 if (ToCC) { #region 判斷群組 if (!string.IsNullOrWhiteSpace(ToMailGroup)) { var mailGroups = ToMailGroup.Split(','); foreach (var mailG in mailGroups) { var q = from a in _context.MailGroups where a.GroupNo.ToUpper() == mailG.ToUpper() join b in _context.MailGroupDetails on a.GroupID equals b.GroupID join c in _context.UserInfoes on b.UserID equals c.UserID select new { b.UserID, c.UserName, c.UserEMail }; foreach (var userMail in await q.ToListAsync()) { if (!string.IsNullOrWhiteSpace(userMail.UserEMail)) { mesMail.CC.Add(new MailAddress(userMail.UserEMail)); } } } } #endregion #region 個人 if (!string.IsNullOrWhiteSpace(ToMail)) { var mails = ToMail.Split(','); foreach (var mail in mails) { mesMail.CC.Add(new MailAddress(mail)); } } #endregion } else { #region 判斷群組 if (!string.IsNullOrWhiteSpace(ToMailGroup)) { var mailGroups = ToMailGroup.Split(','); foreach (var mailG in mailGroups) { var q = from a in _context.MailGroups where a.GroupNo.ToUpper() == mailG.ToUpper() join b in _context.MailGroupDetails on a.GroupID equals b.GroupID join c in _context.UserInfoes on b.UserID equals c.UserID select new { b.UserID, c.UserName, c.UserEMail }; foreach (var userMail in await q.ToListAsync()) { if (!string.IsNullOrWhiteSpace(userMail.UserEMail)) { mesMail.To.Add(new MailAddress(userMail.UserEMail)); } } } } #endregion #region 個人 if (!string.IsNullOrWhiteSpace(ToMail)) { var mails = ToMail.Split(','); foreach (var mail in mails) { mesMail.To.Add(new MailAddress(mail)); } } #endregion } // 是否有附件檔案 if (!string.IsNullOrWhiteSpace(Attachment)) { mesMail.Attachments.Add(new Attachment(Attachment)); } SmtpClient mailClient = new SmtpClient(mailSmtpServer, mailSmtpPort); //mailClient.EnableSsl = true; NetworkCredential nc = new NetworkCredential(); nc.UserName = mailUser; nc.Password = mailPassword; try { mailClient.Credentials = nc; mailClient.Send(mesMail); result.Success = true; result.Msg = "寄信成功"; } catch (Exception ex) { result.Success = false; result.Msg = "寄信失敗,錯誤:" + ex.InnerException.Message; } return result; } /// <summary> /// Mail 寄信 /// </summary> /// <param name="Subject">Mail主旨</param> /// <param name="Body">Mail內容</param> /// <param name="ToMailGroup">群組(,區分多組)</param> /// <param name="ToMail">EMail(,區分多組)</param> /// <param name="ToCC">是否為密件</param> /// <param name="fileContents">附件 類型用Byte[]</param> /// <param name="fileName">fileContents 檔案名稱</param> /// <returns></returns> [HttpPost("ToMailByteFile")] [ApiExplorerSettings(IgnoreApi = true)] // 隱藏此 API 方法 public async Task<ResultModel<dynamic>> PostMailByByteFile(string Subject, string Body, string ToMailGroup, string ToMail, bool ToCC = false , byte[] fileContents = null, string fileName = null) { ResultModel<dynamic> result = new ResultModel<dynamic>(); // Mail 基本設定資料 string mailFrom = _config.GetSection("MailFrom").Value; string mailSmtpServer = _config.GetSection("MailSmtpServer").Value; int mailSmtpPort = int.Parse(_config.GetSection("MailSmtpPort").Value); string mailUser = _config.GetSection("MailUser").Value; string mailPassword = _config.GetSection("MailUserPassword").Value; MailMessage mesMail = new MailMessage(); mesMail.From = new MailAddress(mailFrom); mesMail.Subject = Subject; mesMail.SubjectEncoding = System.Text.Encoding.UTF8; mesMail.Body = Body; mesMail.IsBodyHtml = true; mesMail.BodyEncoding = System.Text.Encoding.UTF8; // 判斷是否加密 if (ToCC) { #region 判斷群組 if (!string.IsNullOrWhiteSpace(ToMailGroup)) { var mailGroups = ToMailGroup.Split(','); foreach (var mailG in mailGroups) { var q = from a in _context.MailGroups where a.GroupNo.ToUpper() == mailG.ToUpper() join b in _context.MailGroupDetails on a.GroupID equals b.GroupID join c in _context.UserInfoes on b.UserID equals c.UserID select new { b.UserID, c.UserName, c.UserEMail }; foreach (var userMail in await q.ToListAsync()) { if (!string.IsNullOrWhiteSpace(userMail.UserEMail)) { mesMail.CC.Add(new MailAddress(userMail.UserEMail)); } } } } #endregion #region 個人 if (!string.IsNullOrWhiteSpace(ToMail)) { var mails = ToMail.Split(','); foreach (var mail in mails) { mesMail.CC.Add(new MailAddress(mail)); } } #endregion } else { #region 判斷群組 if (!string.IsNullOrWhiteSpace(ToMailGroup)) { var mailGroups = ToMailGroup.Split(','); foreach (var mailG in mailGroups) { var q = from a in _context.MailGroups where a.GroupNo.ToUpper() == mailG.ToUpper() join b in _context.MailGroupDetails on a.GroupID equals b.GroupID join c in _context.UserInfoes on b.UserID equals c.UserID select new { b.UserID, c.UserName, c.UserEMail }; foreach (var userMail in await q.ToListAsync()) { if (!string.IsNullOrWhiteSpace(userMail.UserEMail)) { mesMail.To.Add(new MailAddress(userMail.UserEMail)); } } } } #endregion #region 個人 if (!string.IsNullOrWhiteSpace(ToMail)) { var mails = ToMail.Split(','); foreach (var mail in mails) { mesMail.To.Add(new MailAddress(mail)); } } #endregion } // 如果 fileContents 不為 null,則添加附件 if (fileContents != null) { var memoryStream = new MemoryStream(fileContents); var attachment = new Attachment(memoryStream, fileName, contentType(fileName)); mesMail.Attachments.Add(attachment); } SmtpClient mailClient = new SmtpClient(mailSmtpServer, mailSmtpPort); //mailClient.EnableSsl = true; NetworkCredential nc = new NetworkCredential(); nc.UserName = mailUser; nc.Password = mailPassword; try { mailClient.Credentials = nc; mailClient.Send(mesMail); result.Success = true; result.Msg = "寄信成功"; } catch (Exception ex) { result.Success = false; result.Msg = "寄信失敗,錯誤:" + ex.InnerException.Message; } return result; } /// <summary> /// Mail 基本設定資料 /// </summary> /// <returns></returns> [HttpGet("MailSetupShow")] public string GetMailSetup() { // Mail 基本設定資料 string mailFrom = _config.GetSection("MailFrom").Value; string mailSmtpServer = _config.GetSection("MailSmtpServer").Value; int mailSmtpPort = int.Parse(_config.GetSection("MailSmtpPort").Value); string mailUser = _config.GetSection("MailUser").Value; string mailPassword = _config.GetSection("MailUserPassword").Value; var aa = $"{mailFrom} {mailSmtpServer} {mailSmtpPort} {mailUser} {mailPassword}"; return aa; } private string contentType(string fileName) { var fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider(); string contentType = fileExtensionContentTypeProvider.TryGetContentType(fileName, out contentType) ? contentType : "application/octet-stream"; return contentType; } } }