forked from Bremen/ESG
463 lines
21 KiB
C#
463 lines
21 KiB
C#
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using Newtonsoft.Json;
|
||
using Newtonsoft.Json.Linq;
|
||
using Microsoft.AspNetCore.Cors;
|
||
using Dapper;
|
||
using System.Data;
|
||
using System.Data.SqlClient;
|
||
using System.Web;
|
||
using System.Text;
|
||
using System.Net;
|
||
using System.Net.Http;
|
||
using System.Net.Http.Headers;
|
||
using Dapper.Contrib.Extensions;
|
||
|
||
using System.IO;
|
||
using System.Threading;
|
||
using System.Dynamic;
|
||
using NPOI;
|
||
using NPOI.HPSF;
|
||
using NPOI.HSSF;
|
||
using NPOI.HSSF.UserModel;
|
||
using NPOI.XSSF;
|
||
using NPOI.XSSF.UserModel;
|
||
using NPOI.POIFS;
|
||
using NPOI.Util;
|
||
using Microsoft.Extensions.Configuration;
|
||
using Org.BouncyCastle.Ocsp;
|
||
using System.Security.Policy;
|
||
using NPOI.SS.Formula.Functions;
|
||
using static DbTableClass;
|
||
using System.Runtime.InteropServices.ObjectiveC;
|
||
using static System.Net.WebRequestMethods;
|
||
using MimeKit;
|
||
using MailKit.Net.Smtp;
|
||
using MailKit.Security;
|
||
using System.Net.Mail;
|
||
using System.Net.Mime;
|
||
using NPOI.SS.UserModel;
|
||
using NPOI.XWPF.UserModel;
|
||
using System.Reflection;
|
||
|
||
|
||
namespace Bremen_ESG.Controllers
|
||
{
|
||
[Route("Api")]
|
||
|
||
public class ApiController : ControllerBase
|
||
{
|
||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||
private readonly IWebHostEnvironment _hostingEnvironment;
|
||
|
||
DbConn dbConn = new DbConn();
|
||
SqlConnection conn = new SqlConnection(GlobalClass.appsettings("ConnectionStrings:SQLConnectionString"));
|
||
|
||
public ApiController(IHttpContextAccessor httpContextAccessor, IWebHostEnvironment webHostEnvironment)
|
||
{
|
||
this._httpContextAccessor = httpContextAccessor;
|
||
this._hostingEnvironment = webHostEnvironment;
|
||
}
|
||
|
||
|
||
[Route("news_list")]
|
||
public async Task<ActionResult> News_List(IFormCollection obj) {
|
||
newResult ret = new newResult();
|
||
|
||
List<news> newsList = conn.Query<news>("select * from news order by news_sn desc").ToList();
|
||
|
||
ret.news_num = newsList.Count;
|
||
|
||
foreach (news objNew in newsList)
|
||
{
|
||
newsDetial objDetial = new newsDetial(objNew);
|
||
objDetial.news_content = objDetial.news_content.Replace("color: rgb(5, 5, 5);", "").Replace("font-family: 微軟正黑體;", "");
|
||
ret.news_list.Add(objDetial);
|
||
}
|
||
|
||
ret.ret = "yes";
|
||
return Content(JsonConvert.SerializeObject(ret), "application/json;charset=utf-8");
|
||
}
|
||
|
||
|
||
|
||
[Route("esg_message")]
|
||
public async Task<ActionResult> Esg_Message(IFormCollection obj) {
|
||
result ret = new result();
|
||
|
||
esgMessage objEsg = new esgMessage();
|
||
|
||
objEsg.esgMessage_company = obj["company"].ToString();
|
||
objEsg.esgMessage_id = obj["id"].ToString();
|
||
objEsg.esgMessage_name = obj["name"].ToString();
|
||
objEsg.esgMessage_email = obj["email"].ToString();
|
||
objEsg.esgMessage_tel = obj["tel"].ToString();
|
||
objEsg.esgMessage_department = obj["department"].ToString();
|
||
objEsg.esgMessage_esgNeed = obj["esgNeed"].ToString();
|
||
objEsg.esgMessage_mediaUrl = obj["mediaUrl"].ToString();
|
||
objEsg.esgMessage_testResult = obj["result"].ToString();
|
||
|
||
string err_msg = "";
|
||
|
||
if (objEsg.esgMessage_company == "") {
|
||
err_msg += "無企業名稱\n";
|
||
}
|
||
|
||
if (objEsg.esgMessage_name == "")
|
||
{
|
||
err_msg += "無聯絡人姓名\n";
|
||
}
|
||
|
||
if (objEsg.esgMessage_tel == "")
|
||
{
|
||
err_msg += "無聯絡人電話\n";
|
||
}
|
||
|
||
if (err_msg != "") {
|
||
ret.ret = "no";
|
||
ret.message = err_msg;
|
||
ret.err_code = "0001";
|
||
|
||
return Content(JsonConvert.SerializeObject(ret), "application/json;charset=utf-8");
|
||
}
|
||
|
||
string[] mediaUrl = objEsg.esgMessage_mediaUrl.Split(";");
|
||
|
||
string htmlBody = "";
|
||
|
||
htmlBody += "<H2>聯絡方式</H2>";
|
||
htmlBody += "<br/>企業名稱:" + objEsg.esgMessage_company;
|
||
htmlBody += "<br/>統一編號:" + objEsg.esgMessage_id;
|
||
htmlBody += "<br/>聯絡人姓名:" + objEsg.esgMessage_name;
|
||
htmlBody += "<br/>聯絡人 email:" + objEsg.esgMessage_email;
|
||
htmlBody += "<br/>聯絡人電話:" + objEsg.esgMessage_tel;
|
||
htmlBody += "<br/>聯絡人部門/職稱:" + objEsg.esgMessage_department;
|
||
htmlBody += "<br/>------------------------------------------------------------------------------";
|
||
htmlBody += "<br/>檢測結果:" + objEsg.esgMessage_testResult;
|
||
htmlBody += "<br/>已知EGS需求:" + objEsg.esgMessage_esgNeed;
|
||
htmlBody += "<br/>------------------------------------------------------------------------------";
|
||
htmlBody += "<br/>企業目前主要自媒體:";
|
||
|
||
foreach (string urlstr in mediaUrl) {
|
||
htmlBody += "<br/><a href='" + urlstr + "' target='_blank'>" + urlstr + "</a>";
|
||
}
|
||
|
||
|
||
MailRequest mailRequest = new MailRequest();
|
||
mailRequest.ToEmail = "calvin@bremen.com.tw,queenie@bremen.com.tw,sunny.lin@bremen.com.tw";
|
||
//mailRequest.attach = arrBites;
|
||
//mailRequest.attachName = "結果.xlsx";
|
||
mailRequest.Body = htmlBody;
|
||
|
||
mailRequest.Subject = "分眾結果通知信";
|
||
|
||
await SendEmailAsync(mailRequest);
|
||
|
||
DbConn dbConn = new DbConn();
|
||
SqlConnection conn = dbConn.sqlConnection();
|
||
|
||
conn.Insert<esgMessage>(objEsg);
|
||
|
||
conn.Close();
|
||
|
||
ret.ret = "yes";
|
||
|
||
return Content(JsonConvert.SerializeObject(ret), "application/json;charset=utf-8");
|
||
}
|
||
|
||
|
||
[Route("esg_mail")]
|
||
public async Task<ActionResult> Esg_Mail(IFormCollection obj) {
|
||
result ret = new result();
|
||
|
||
string target_email = obj["email"].ToString();
|
||
string target_link = obj["link"].ToString();
|
||
|
||
string err_msg = "";
|
||
|
||
if (GlobalClass.isURL(target_link) == false)
|
||
{
|
||
err_msg += "無有效結果連結\n";
|
||
}
|
||
|
||
if (GlobalClass.isEmail(target_email) == false)
|
||
{
|
||
err_msg += "無有效Email\n";
|
||
}
|
||
|
||
if (err_msg != "")
|
||
{
|
||
ret.ret = "no";
|
||
ret.message = err_msg;
|
||
ret.err_code = "0001";
|
||
|
||
return Content(JsonConvert.SerializeObject(ret), "application/json;charset=utf-8");
|
||
}
|
||
|
||
string html = $@"";
|
||
|
||
string fullPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/email_pic/email_footer.jpg");
|
||
var res = new LinkedResource(fullPath, MediaTypeNames.Image.Jpeg);
|
||
res.ContentId = Guid.NewGuid().ToString();
|
||
|
||
html += "<!doctype html>";
|
||
html += "<html xmlns='http://www.w3.org/1999/xhtml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:o='urn:schemas-microsoft-com:office:office'>";
|
||
html += "";
|
||
html += "<head>";
|
||
html += " <title> ESG </title>";
|
||
html += " <!--[if !mso]><!-->";
|
||
html += " <meta http-equiv='X-UA-Compatible' content='IE=edge'>";
|
||
html += " <!--<![endif]-->";
|
||
html += " <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>";
|
||
html += " <meta name='viewport' content='width=device-width, initial-scale=1'>";
|
||
html += " <style type='text/css'>";
|
||
html += " #outlook a {";
|
||
html += " padding: 0;";
|
||
html += " }";
|
||
html += "";
|
||
html += " body {";
|
||
html += " margin: 0;";
|
||
html += " padding: 0;";
|
||
html += " -webkit-text-size-adjust: 100%;";
|
||
html += " -ms-text-size-adjust: 100%;";
|
||
html += " }";
|
||
html += "";
|
||
html += " table,";
|
||
html += " td {";
|
||
html += " border-collapse: collapse;";
|
||
html += " mso-table-lspace: 0pt;";
|
||
html += " mso-table-rspace: 0pt;";
|
||
html += " }";
|
||
html += "";
|
||
html += " img {";
|
||
html += " border: 0;";
|
||
html += " height: auto;";
|
||
html += " line-height: 100%;";
|
||
html += " outline: none;";
|
||
html += " text-decoration: none;";
|
||
html += " -ms-interpolation-mode: bicubic;";
|
||
html += " }";
|
||
html += "";
|
||
html += " p {";
|
||
html += " display: block;";
|
||
html += " margin: 13px 0;";
|
||
html += " }";
|
||
html += " </style>";
|
||
html += " <!--[if mso]>";
|
||
html += " <noscript>";
|
||
html += " <xml>";
|
||
html += " <o:OfficeDocumentSettings>";
|
||
html += " <o:AllowPNG/>";
|
||
html += " <o:PixelsPerInch>96</o:PixelsPerInch>";
|
||
html += " </o:OfficeDocumentSettings>";
|
||
html += " </xml>";
|
||
html += " </noscript>";
|
||
html += " <![endif]-->";
|
||
html += " <!--[if lte mso 11]>";
|
||
html += " <style type='text/css'>";
|
||
html += " .mj-outlook-group-fix { width:100% !important; }";
|
||
html += " </style>";
|
||
html += " <![endif]-->";
|
||
html += " <style type='text/css'>";
|
||
html += " @media only screen and (min-width:480px) {";
|
||
html += " .mj-column-per-100 {";
|
||
html += " width: 100% !important;";
|
||
html += " max-width: 100%;";
|
||
html += " }";
|
||
html += " }";
|
||
html += " </style>";
|
||
html += " <style media='screen and (min-width:480px)'>";
|
||
html += " .moz-text-html .mj-column-per-100 {";
|
||
html += " width: 100% !important;";
|
||
html += " max-width: 100%;";
|
||
html += " }";
|
||
html += " </style>";
|
||
html += " <style type='text/css'>";
|
||
html += " @media only screen and (max-width:480px) {";
|
||
html += " table.mj-full-width-mobile {";
|
||
html += " width: 100% !important;";
|
||
html += " }";
|
||
html += "";
|
||
html += " td.mj-full-width-mobile {";
|
||
html += " width: auto !important;";
|
||
html += " }";
|
||
html += " }";
|
||
html += " </style>";
|
||
html += "</head>";
|
||
html += "";
|
||
html += "<body style='word-spacing:normal;'>";
|
||
html += " <div style=''>";
|
||
html += " <table align='center' border='0' cellpadding='0' cellspacing='0' role='presentation' style='width:100%;'>";
|
||
html += " <tbody>";
|
||
html += " <tr>";
|
||
html += " <td>";
|
||
html += " <!--[if mso | IE]><table align='center' border='0' cellpadding='0' cellspacing='0' class='' style='width:1000px;' width='1000' ><tr><td style='line-height:0px;font-size:0px;mso-line-height-rule:exactly;'><![endif]-->";
|
||
html += " <div style='margin:0px auto;max-width:1000px;'>";
|
||
html += " <table align='center' border='0' cellpadding='0' cellspacing='0' role='presentation' style='width:100%;'>";
|
||
html += " <tbody>";
|
||
html += " <tr>";
|
||
html += " <td style='direction:ltr;font-size:0px;padding:20px 0;text-align:center;'>";
|
||
html += " <!--[if mso | IE]><table role='presentation' border='0' cellpadding='0' cellspacing='0'><tr><td class='' style='vertical-align:top;width:1000px;' ><![endif]-->";
|
||
html += " <div class='mj-column-per-100 mj-outlook-group-fix' style='font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;'>";
|
||
html += " <table border='0' cellpadding='0' cellspacing='0' role='presentation' style='vertical-align:top;' width='100%'>";
|
||
html += " <tbody>";
|
||
html += " <tr>";
|
||
html += " <td align='center' style='font-size:0px;padding:10px 25px;padding-top:40px;padding-bottom:20px;word-break:break-word;'>";
|
||
html += " <div style='font-family:'Source Han Sans', 'Noto Sans CJK TC', '思源黑體', sans-serif;font-size:28px;font-weight:500;letter-spacing:1px;line-height:40px;text-align:center;text-transform:uppercase;color:#163713;'>您好,謝謝您填寫ESG快速檢測<br>詳細的測驗結果分析,請點擊以下連結查看:</div>";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " <tr>";
|
||
html += " <td align='center' vertical-align='middle' style='font-size:0px;padding:10px 25px;word-break:break-word;'>";
|
||
html += " <table border='0' cellpadding='0' cellspacing='0' role='presentation' style='border-collapse:separate;line-height:100%;'>";
|
||
html += " <tr>";
|
||
html += " <td align='center' bgcolor='#2c5228' role='presentation' style='border:none;border-radius:9999px;cursor:auto;mso-padding-alt:10px 25px;background:#2c5228;' valign='middle'>";
|
||
html += " <a href='" + target_link + "' style='display:inline-block;background:#2c5228;color:#ffffff;font-family:'Source Han Sans', 'Noto Sans CJK TC', '思源黑體', sans-serif;font-size:28px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 60px;mso-padding-alt:0px;border-radius:9999px;' target='_blank'> 查看結果 </a>";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " </table>";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " <tr>";
|
||
html += " <td align='center' style='font-size:0px;padding:0;padding-top:60px;word-break:break-word;'>";
|
||
html += " <table border='0' cellpadding='0' cellspacing='0' role='presentation' style='border-collapse:collapse;border-spacing:0px;'>";
|
||
html += " <tbody>";
|
||
html += " <tr>";
|
||
html += " <td style='width:900px;'>";
|
||
html += " <a href='https://google.com' target='_blank'>";
|
||
html += " <img alt='' height='auto' src='cid:" + res.ContentId + "' style='border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;' width='900' />";
|
||
html += " </a>";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " </tbody>";
|
||
html += " </table>";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " </tbody>";
|
||
html += " </table>";
|
||
html += " </div>";
|
||
html += " <!--[if mso | IE]></td></tr></table><![endif]-->";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " </tbody>";
|
||
html += " </table>";
|
||
html += " </div>";
|
||
html += " <!--[if mso | IE]></td></tr></table><![endif]-->";
|
||
html += " </td>";
|
||
html += " </tr>";
|
||
html += " </tbody>";
|
||
html += " </table>";
|
||
html += " </div>";
|
||
html += "</body>";
|
||
html += "";
|
||
html += "</html>";
|
||
|
||
//建立AlternativeView
|
||
var altView = AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html);
|
||
//將圖檔資源加入AlternativeView
|
||
altView.LinkedResources.Add(res);
|
||
|
||
await SendEsgResultMailAsync(altView, target_email);
|
||
|
||
ret.ret = "yes";
|
||
|
||
ret.message = "已寄送結果通知信至" + target_email;
|
||
|
||
return Content(JsonConvert.SerializeObject(ret), "application/json;charset=utf-8");
|
||
}
|
||
|
||
public class newResult
|
||
{
|
||
public string ret = "no";
|
||
public string err_code = "0000";
|
||
public string message = "";
|
||
public int news_num = 0;
|
||
public List<news> news_list = new List<news>();
|
||
}
|
||
|
||
public class result
|
||
{
|
||
public string ret = "no";
|
||
public string err_code = "0000";
|
||
public string message = "";
|
||
|
||
}
|
||
|
||
public async Task SendEsgResultMailAsync(AlternateView altView, string toEmail) {
|
||
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
|
||
client.Host = GlobalClass.appsettings("MailServer:smtp_host");
|
||
client.Port = int.Parse(GlobalClass.appsettings("MailServer:smtp_port"));
|
||
client.EnableSsl = true;
|
||
client.Credentials = new NetworkCredential(
|
||
GlobalClass.appsettings("MailServer:smtp_username"),
|
||
GlobalClass.appsettings("MailServer:smtp_password")
|
||
);
|
||
|
||
var mail = new MailMessage();
|
||
mail.IsBodyHtml = true;
|
||
|
||
mail.AlternateViews.Add(altView);
|
||
mail.To.Add(toEmail);
|
||
mail.Bcc.Add("dk96pccu@gmail.com");
|
||
mail.From = new MailAddress(GlobalClass.appsettings("MailServer:smtp_username"), "ESG快速檢測結果分析", System.Text.Encoding.UTF8);
|
||
mail.Subject = "ESG快速檢測結果分析";
|
||
await client.SendMailAsync(mail).ContinueWith(task =>
|
||
{
|
||
if (task.IsFaulted)
|
||
{
|
||
Console.WriteLine("Error sending email: " + task.Exception);
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine("Email sent successfully.");
|
||
}
|
||
});
|
||
|
||
client.Dispose();
|
||
}
|
||
|
||
/// <summary>
|
||
public async Task SendEmailAsync(MailRequest mailRequest)
|
||
{
|
||
var email = new MimeMessage();
|
||
email.Sender = MailboxAddress.Parse(GlobalClass.appsettings("MailServer:smtp_username"));
|
||
email.To.Add(MailboxAddress.Parse(GlobalClass.appsettings("MailServer:smtp_username")));
|
||
|
||
foreach (string item in mailRequest.ToEmail.Split(','))
|
||
{
|
||
email.Bcc.Add(MailboxAddress.Parse(item));
|
||
}
|
||
|
||
email.Subject = "ESG需求聯絡表通知信";
|
||
|
||
var builder = new BodyBuilder();
|
||
|
||
if (mailRequest.attach != null) {
|
||
builder.Attachments.Add(mailRequest.attachName, mailRequest.attach);
|
||
}
|
||
|
||
builder.HtmlBody = mailRequest.Body;
|
||
email.Body = builder.ToMessageBody();
|
||
|
||
using var smtp = new MailKit.Net.Smtp.SmtpClient();
|
||
smtp.Connect(GlobalClass.appsettings("MailServer:smtp_host"), int.Parse(GlobalClass.appsettings("MailServer:smtp_port")), SecureSocketOptions.StartTls);
|
||
smtp.Authenticate(GlobalClass.appsettings("MailServer:smtp_username"), GlobalClass.appsettings("MailServer:smtp_password"));
|
||
await smtp.SendAsync(email);
|
||
smtp.Dispose();
|
||
|
||
}
|
||
|
||
public class MailRequest
|
||
{
|
||
public string ToEmail { get; set; } = "";
|
||
public string Subject { get; set; } = "分眾結果通知信";
|
||
public string Body { get; set; } = "";
|
||
public byte[] attach { get; set; }
|
||
public string attachName { get; set; } = "file.xlsx";
|
||
}
|
||
}
|
||
}
|