Files
thinkyu/教育訓練系統/Web/SendMail/發送郵件.cs
T
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

428 lines
21 KiB
C#

using Education.Report;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Web;
using System.Web.Services.Description;
using WebLib;
namespace Education
{
public class 發送郵件
{
public HttpContext Context;
private string CheckMark(bool value)
{
return value ? "&#9745" : "&#9744";
}
public void 發送報名成功郵件(string 收件人姓名, string 收件人Email, DateTime 訓練日期,
DateTime 訓練日期迄, string 訓練名稱)
{
if (string.IsNullOrEmpty(收件人Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/報名郵件.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統報名成功通知】{0} {1}",
訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{訓練日期}", 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄)) // .ToString("yyyy年MM月dd日(dddd)") + (訓練日期迄.Ticks > 0 ? "至" + 訓練日期迄.ToString("yyyy年MM月dd日(dddd)") : ""))
.Replace("{訓練名稱}", 訓練名稱);
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
MailService.Send(mm, String.Format("報名成功郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
收件人姓名, 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱));
}
public void 發送取消報名郵件(string 收件人姓名, string 收件人Email, DateTime 訓練日期,
DateTime 訓練日期迄, string 訓練名稱)
{
if (string.IsNullOrEmpty(收件人Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/取消報名郵件.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統取消報名通知】{0} {1}",
訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{取消日期}", DateTime.UtcNow.AddHours(8).Date.ToString("yyyy年MM月dd日"))
.Replace("{訓練日期}", 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄))
.Replace("{訓練名稱}", 訓練名稱);
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
MailService.Send(mm, String.Format("取消報名郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
收件人姓名, 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱));
}
public void 發送學員行前通知郵件(string 收件人姓名, string 收件人Email,
string 聯絡人姓名, string 聯絡人電話, string 聯絡人Email, string 公司名稱,
DateTime 訓練日期, DateTime 訓練日期迄, string 訓練名稱, string 訓練地點, int 訓練時數,
訓練課程內容List 課程內容List, string 附件檔名, Stream 附件內容)
{
if (string.IsNullOrEmpty(收件人Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/學員行前通知.html"));
string 課程內容 = "";
// 拿課程類別來存放講師姓名
foreach (訓練課程內容 item in 課程內容List)
{
課程內容 += String.Format("<tr><td class=\"center\">{0}</td><td>{1}</td><td class=\"center\">{2}</td><td class=\"center\">{3}</td></tr>",
item.節次, item.課程名稱, item.時數, item.課程類別);
}
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統學員行前通知】{0} {1}",
訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{公司名稱}", 公司名稱)
.Replace("{訓練日期}", 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄))
.Replace("{訓練名稱}", 訓練名稱)
.Replace("{訓練地點}", 訓練地點)
.Replace("{訓練時數}", 訓練時數.ToString())
.Replace("{課程內容}", 課程內容);
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
if (!string.IsNullOrEmpty(聯絡人Email))
mm.ReplyTo = new MailAddress(聯絡人Email, 聯絡人姓名);
if (附件內容 != null)
{
mm.Attachments.Add(new Attachment(附件內容, 附件檔名, "octet/application"));
}
MailService.Send(mm, String.Format("學員行前通知郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
收件人姓名, 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱));
}
public void 發送學員異動通知郵件(string 收件人姓名, string 收件人Email,
string 聯絡人姓名, string 聯絡人電話, string 聯絡人Email, string 公司名稱,
DateTime 訓練日期, DateTime 訓練日期迄, string 訓練名稱, string 訓練地點, int 訓練時數, string 異動內容)
{
if (string.IsNullOrEmpty(收件人Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/學員異動通知.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統課程異動通知】{0} {1}",
訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{公司名稱}", 公司名稱)
.Replace("{訓練日期}", 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄))
.Replace("{訓練名稱}", 訓練名稱)
.Replace("{訓練地點}", 訓練地點)
.Replace("{訓練時數}", 訓練時數.ToString())
.Replace("{異動內容}", 異動內容);
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
if (!string.IsNullOrEmpty(聯絡人Email))
mm.ReplyTo = new MailAddress(聯絡人Email, 聯絡人姓名);
MailService.Send(mm, String.Format("學員課程異動通知郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
收件人姓名, 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd"), 訓練名稱));
}
public void 發送講師行前通知郵件(講師行前郵件Data data)
{
if (string.IsNullOrEmpty(data.收件人Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/講師行前通知.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統講師行前通知】{0} {1}",
訓練課程企劃.Get訓練日期Str(data.訓練日期, data.訓練日期迄, "yyyy-MM-dd"), data.訓練名稱);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
content = content
.Replace("{公司名稱}", data.公司名稱)
.Replace("{講師姓名}", data.收件人姓名)
.Replace("{訓練名稱}", data.訓練名稱)
.Replace("{訓練地點}", data.訓練地點)
.Replace("{訓練地址}", data.訓練地址)
.Replace("{是否交通圖}", CheckMark(data.附件內容 != null))
.Replace("{訓練日期}", 訓練課程企劃.Get訓練日期Str(data.訓練日期, data.訓練日期迄))
.Replace("{訓練時間}", data.訓練時間)
.Replace("{訓練時間迄}", data.訓練時間迄)
.Replace("{備課時間}", data.備課時間)
.Replace("{聯絡人姓名}", data.聯絡人姓名)
.Replace("{聯絡人電話}", data.聯絡人電話)
.Replace("{聯絡人Email}", data.聯絡人Email)
.Replace("{受訓對象}", "")
.Replace("{是否攜帶筆電}", CheckMark(data.是否攜帶筆電))
.Replace("{是否攜帶簡報}", CheckMark(data.是否攜帶簡報))
.Replace("{是否攜帶其他}", CheckMark(data.是否攜帶其他))
.Replace("{攜帶其他}", data.攜帶其他)
.Replace("{是否場地投影機}", CheckMark(data.是否場地投影機))
.Replace("{是否場地麥克風}", CheckMark(data.是否場地麥克風))
.Replace("{是否場地雷射筆}", CheckMark(data.是否場地雷射筆))
.Replace("{是否場地筆電}", CheckMark(data.是否場地筆電))
.Replace("{是否場地座位安排}", CheckMark(data.是否場地座位安排))
.Replace("{是否場地白紙}", CheckMark(data.是否場地白紙))
.Replace("{是否場地其他}", CheckMark(data.是否場地其他))
.Replace("{場地其他}", data.場地其他)
.Replace("{是否講師費}", CheckMark(data.是否講師費))
.Replace("{講師費}", data.講師費)
.Replace("{是否交通費}", CheckMark(data.是否交通費))
.Replace("{交通費}", data.交通費)
.Replace("{合計}", data.合計)
.Replace("{是否現金}", CheckMark(data.是否現金))
.Replace("{是否匯款}", CheckMark(data.是否匯款))
.Replace("{給付日}", data.給付日.Ticks > 0 ? data.給付日.ToString("yyyy年MM月dd日") : "")
.Replace("{是否交通安排}", CheckMark(data.是否交通安排))
.Replace("{交通安排}", data.交通安排)
.Replace("{是否用餐}", CheckMark(data.是否用餐))
.Replace("{用餐}", data.用餐);
AlternateView htmlView = AlternateView.CreateAlternateViewFromString(content, Encoding.UTF8, "text/html");
mm.AlternateViews.Add(htmlView);
mm.To.Add(new MailAddress(data.收件人Email, data.收件人姓名));
if (!string.IsNullOrEmpty(data.聯絡人Email))
{
mm.CC.Add(new MailAddress(data.聯絡人Email, data.聯絡人姓名));
mm.ReplyTo = new MailAddress(data.聯絡人Email, data.聯絡人姓名);
}
if (data.附件內容 != null)
{
mm.Attachments.Add(new Attachment(data.附件內容, data.附件檔名, "octet/application"));
}
MailService.Send(mm, String.Format("講師行前通知郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
data.收件人姓名, 訓練課程企劃.Get訓練日期Str(data.訓練日期, data.訓練日期迄, "yyyy-MM-dd"), data.訓練名稱));
}
private void 發送簽核相關郵件(int 簽核ID, bool 撤簽, string 收件人姓名, string 收件人Email)
{
if (string.IsNullOrEmpty(收件人Email))
return;
DAC_表單簽核主檔 Dao表單簽核主檔 = new DAC_表單簽核主檔();
表單簽核主檔List d = Dao表單簽核主檔.SelectOne(簽核ID);
string content;
if (!撤簽)
content = File.ReadAllText(Context.Server.MapPath("~/Template/簽核通知.html"));
else
content = File.ReadAllText(Context.Server.MapPath("~/Template/撤簽通知.html"));
if (d.Count > 0)
{
string 表單ID = d[0].表單ID格式.Replace("<br>", " ");
MailMessage mm = new MailMessage();
if (!撤簽)
mm.Subject = String.Format("【辦訓系統簽核通知】表單類別:{0} 表單:{1}", d[0].表單類別ID, 表單ID);
else
mm.Subject = String.Format("【辦訓系統撤簽通知】表單類別:{0} 表單:{1}", d[0].表單類別ID, 表單ID);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content.Replace("{表單類別}", d[0].表單類別ID)
.Replace("{表單}", d[0].表單ID格式);
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
MailService.Send(mm, String.Format("辦訓系統簽核通知,對象={0} 表單類別={1} 單號={2}",
收件人姓名, d[0].表單類別ID, 表單ID));
}
}
public void 發送簽核郵件(int 簽核ID, string 收件人姓名, string 收件人Email)
{
發送簽核相關郵件(簽核ID, false, 收件人姓名, 收件人Email);
}
public void 發送撤簽郵件(int 簽核ID, string 收件人姓名, string 收件人Email)
{
發送簽核相關郵件(簽核ID, true, 收件人姓名, 收件人Email);
}
public void 發送滿意度催填郵件(string 收件人姓名, string 收件人Email,
string 訓練名稱, DateTime 訓練日期, DateTime 訓練日期迄, string 手機版網址)
{
if (string.IsNullOrEmpty(收件人Email))
return;
string 日期Str = 訓練課程企劃.Get訓練日期Str(訓練日期, 訓練日期迄, "yyyy-MM-dd");
MailMessage mm = new MailMessage();
mm.Subject = "【辦訓系統】滿意度調查填寫通知";
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = false;
mm.Body = String.Format(
@"{0} 您好,
您參加的「{1}」({2})課程已結束,請於期限內填寫滿意度調查表。
請透過手機點選以下連結填寫:
{3}
感謝您的配合!
辦訓系統 敬上",
收件人姓名, 訓練名稱, 日期Str, 手機版網址);
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
MailService.Send(mm, String.Format("滿意度催填郵件,對象={0} 課程={1}",
收件人姓名, 訓練名稱));
}
public void 發送簽核跟催郵件(int 簽核ID, string 收件人姓名, string 收件人Email, int 天數, string templatePath)
{
if (string.IsNullOrEmpty(收件人Email))
return;
DAC_表單簽核主檔 Dao表單簽核主檔 = new DAC_表單簽核主檔();
表單簽核主檔List d = Dao表單簽核主檔.SelectOne(簽核ID);
string content = File.ReadAllText(templatePath + @"\簽核跟催通知.html");
if (d.Count > 0)
{
string 表單ID = d[0].表單ID格式.Replace("<br>", " ");
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統簽核通知】表單類別:{0} 表單:{1}", d[0].表單類別ID, 表單ID);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content.Replace("{表單類別}", d[0].表單類別ID)
.Replace("{表單}", d[0].表單ID格式)
.Replace("{天數}", 天數.ToString());
mm.To.Add(new MailAddress(收件人Email, 收件人姓名));
MailService.Send(mm, String.Format("辦訓系統簽核跟催通知,對象={0} 表單類別={1} 單號={2} 天數={3}",
收件人姓名, d[0].表單類別ID, 表單ID, 天數));
}
}
public bool 發送扣繳明細表郵件(string 寄件人, DateTime? 起日, DateTime? 迄日, 扣繳匯總郵件Item mailData, out string message)
{
try
{
message = String.Empty;
if (string.IsNullOrEmpty(寄件人))
{
message = "未提供寄件人郵箱";
return false;
}
if (mailData == null)
{
message = string.Format("寄給 {0} 的未提供扣繳明細表資料", mailData.收件人姓名);
return false;
}
if (string.IsNullOrEmpty(mailData.收件人郵箱))
{
message = string.Format("寄給 {0} 的未提供未提供收件人郵箱", mailData.收件人姓名);
return false;
}
string content = File.ReadAllText(Context.Server.MapPath("~/Template/扣繳明細郵件.html"))
.Replace("{主旨}", mailData.主旨)
.Replace("{內文}", mailData.內文.Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>"));
var report = new 扣繳領據明細郵件附件();
report.data = mailData.明細;
report.起日 = 起日;
report.迄日 = 迄日;
var attachment = report.DoReport();
var attachStream = new MemoryStream(attachment);
MailMessage mm = new MailMessage();
mm.Subject = mailData.主旨.Replace("\r", "").Replace("\n", "");
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content;
var 收件人郵箱 = mailData.收件人郵箱.Replace("\r", "").Replace("\n", "").Trim();
var 收件人姓名 = mailData.收件人姓名.Replace("\r", "").Replace("\n", "").Trim();
mm.To.Add(new MailAddress(收件人郵箱, 收件人姓名));
mm.Attachments.Add(new Attachment(attachStream, string.Format("{0}_扣繳領據明細.xlsx", mailData.收件人姓名)));
MailService.Send(mm
, comment: String.Format("扣繳明細,對象={0}", mailData.收件人姓名)
, UpdateTable: "領據"
, KeyField: "編號"
, KeyValue: string.Join("|", mailData.明細.Select(x => x.編號.ToString()).ToArray())
, UpdateField: "郵件已發送"
, UpdateValue: "1"
);
return true;
}
catch (Exception ex)
{
message = ex.Message;
return false;
}
}
}
public class 講師行前郵件Data
{
public string 收件人姓名;
public string 收件人Email;
public string 聯絡人姓名;
public string 聯絡人電話;
public string 聯絡人Email;
public string 公司名稱;
public DateTime 訓練日期;
public DateTime 訓練日期迄;
public string 訓練時間;
public string 訓練時間迄;
public string 備課時間;
public string 訓練名稱;
public string 訓練地點;
public string 訓練地址;
public bool 是否攜帶筆電;
public bool 是否攜帶簡報;
public bool 是否攜帶其他;
public string 攜帶其他;
public bool 是否場地投影機;
public bool 是否場地麥克風;
public bool 是否場地雷射筆;
public bool 是否場地筆電;
public bool 是否場地座位安排;
public bool 是否場地白紙;
public bool 是否場地其他;
public string 場地其他;
public bool 是否講師費;
public string 講師費;
public bool 是否交通費;
public string 交通費;
public string 合計;
public bool 是否現金;
public bool 是否匯款;
public DateTime 給付日;
public bool 是否交通安排;
public string 交通安排;
public bool 是否用餐;
public string 用餐;
public string 附件檔名;
public Stream 附件內容;
}
}