274 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace JobReportMailService
 | |
| {
 | |
|     public partial class fSendMail : fChildBase
 | |
|     {
 | |
| 
 | |
|         public fSendMail()
 | |
|         {
 | |
|             InitializeComponent();
 | |
|         }
 | |
| 
 | |
|         private void fJobReportDay_Load(object sender, EventArgs e)
 | |
|         {
 | |
|             this.Delaytime = 3000;
 | |
|             task = Task.Run(() =>
 | |
|             {
 | |
|                 while (taskrun)
 | |
|                 {
 | |
|                     if (taskwait)
 | |
|                     {
 | |
|                         task.Wait(1000);
 | |
|                         continue;
 | |
|                     }
 | |
| 
 | |
|                     var ts = DateTime.Now - LastUpdateTime;
 | |
|                     if (ts.TotalMilliseconds <= 1000)
 | |
|                     {
 | |
|                         continue;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         LastUpdateTime = DateTime.Now;
 | |
|                         try
 | |
|                         {
 | |
|                             RunData();
 | |
|                         }
 | |
|                         catch (Exception ex)
 | |
|                         {
 | |
|                             addmsg(ex.Message);
 | |
|                             task.Wait(5000);
 | |
|                         }
 | |
|                     }
 | |
|                     Task.Delay(Delaytime).Wait();
 | |
|                 }
 | |
| 
 | |
|             });
 | |
|             timer1.Start();
 | |
|         }
 | |
| 
 | |
|         void RunData()
 | |
|         {
 | |
|             SendMail();
 | |
|             System.Threading.Thread.Sleep(1000);
 | |
|             MakeAutoMail();
 | |
|         }
 | |
| 
 | |
|         void SendMail()
 | |
|         {
 | |
|             
 | |
|             var ta = new DataSet1TableAdapters.MailDataTableAdapter();
 | |
|             var sendList = ta.GetData(); //발송되지않은 메일목록
 | |
| 
 | |
|             if (sendList.Rows.Count > 0) addmsg("Found : " + sendList.Rows.Count.ToString());
 | |
|             else addmsg("전송할 메일이 없습니다");
 | |
| 
 | |
|             foreach (DataSet1.MailDataRow dr in sendList)
 | |
|             {
 | |
|                 //전자메일 검증을 한다.
 | |
|                 var list_from = getMaillist(dr.fromlist);
 | |
|                 var list_to = getMaillist(dr.tolist);
 | |
|                 var list_bcc = getMaillist(dr.bcc);
 | |
|                 var list_cc = getMaillist(dr.cc);
 | |
| 
 | |
|                 string sendMsg = "";
 | |
|                 if (list_from == "")
 | |
|                 {
 | |
|                     sendMsg = ("보내는 주소가 없습니다");
 | |
|                 }
 | |
|                 else if (dr.subject.Trim() == "")
 | |
|                 {
 | |
|                     sendMsg = ("메일 제목이 없습니다");
 | |
|                 }
 | |
|                 else if (dr.body.Trim() == "")
 | |
|                 {
 | |
|                     sendMsg = ("본문이 없습니다");
 | |
|                 }
 | |
|                 else if (list_to == "")
 | |
|                 {
 | |
|                     sendMsg = ("받는 주소가 없습니다");
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
| 
 | |
|                     var body = dr.body;
 | |
|                     body +=
 | |
|                         "<p>" +
 | |
|                         "<br />이 메일은 EET 프로그램에서 자동 발신 되었습니다." +
 | |
|                         "<br />메일이 잘못 전송 되었다면 [<a href='chikyun.kim@amkor.co.kr'>chikyun.kim@amkor.co.kr</a>] 로 문의 주시기 바랍니다" +
 | |
|                         "</p>";
 | |
| 
 | |
| 
 | |
|                     //전송을 해야 함
 | |
|                     var mc = new System.Net.Mail.SmtpClient("10.101.10.6");
 | |
|                     var msg = new System.Net.Mail.MailMessage
 | |
|                         (list_from,
 | |
|                         list_to,
 | |
|                         dr.subject,
 | |
|                         body);
 | |
| 
 | |
| 
 | |
|                     if (list_bcc != "") msg.Bcc.Add(list_bcc);
 | |
|                     if (list_cc != "") msg.CC.Add(list_cc);
 | |
|                     msg.IsBodyHtml = true;
 | |
| 
 | |
|                     try
 | |
|                     {
 | |
|                         mc.Send(msg);
 | |
|                         Console.WriteLine("send mail to" + list_to + ",subject=" + dr.subject);
 | |
|                         sendMsg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
 | |
|                     }
 | |
|                     catch (Exception eX)
 | |
|                     {
 | |
|                         sendMsg = eX.Message;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 Console.WriteLine(string.Format("Send Complete index={0},Msg={1}", dr.idx, sendMsg));
 | |
|                 ta.UpdateSendOK(sendMsg, dr.idx);
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|         }
 | |
|         static DateTime ChkAutoDate = DateTime.Now.AddDays(-1);
 | |
|         void MakeAutoMail()
 | |
|         {
 | |
|             var ts = DateTime.Now - ChkAutoDate;
 | |
|             if (ts.TotalMinutes < 1) return;   //10분마다 자동 생성 데이터를 처리한다
 | |
|             Console.WriteLine("Check Auto Make Mail");
 | |
| 
 | |
|             var taData = new DataSet1TableAdapters.MailDataTableAdapter();
 | |
|             var taList = new DataSet1TableAdapters.MailAutoTableAdapter();
 | |
|             var dtList = taList.GetByAutoSend();
 | |
|             var dtInsert = new DataSet1.MailDataDataTable();
 | |
| 
 | |
|             //대상
 | |
|             Console.WriteLine("Make Auto Send Mail Data (" + dtList.Rows.Count.ToString() + ")");
 | |
| 
 | |
|             foreach (DataSet1.MailAutoRow dr in dtList)
 | |
|             {
 | |
|                 //시간정보가 없는 애들은 처리 하지 않음
 | |
|                 if (dr.stime.IndexOf(":") == -1) continue;
 | |
|                 if (dr.sday == null || dr.sday.Length < 2) continue;
 | |
| 
 | |
|                 //발신시간을 넘어야 한다
 | |
|                 var curTime = DateTime.Now.ToString("HH:mm");
 | |
|                 if (string.Compare(curTime, dr.stime) < 0) continue;   //지정된 시간 이전이면 생성 안한다
 | |
| 
 | |
|                 //자동생성 구분용 카테고리
 | |
|                 var cate = string.Format("{0},{1}", dr.sday[0], dr.sday[1]);
 | |
| 
 | |
|                 //동륵일
 | |
|                 var pdate = DateTime.Now.ToString("yyyy-MM-dd");
 | |
| 
 | |
|                 //같은날, 같은 atime aidx pdate 의 같이 있으면 이미 생성된것이므로 추가하지 않는다
 | |
|                 var existData = taData.FindAutoData(dr.idx, dr.stime, pdate, cate);
 | |
|                 var PreMakeCount = (int)(existData);
 | |
|                 if (PreMakeCount > 0) continue;
 | |
| 
 | |
|                 //전송간격과 대상
 | |
|                 if (dr.sday[0] == 1)
 | |
|                 {
 | |
|                     //week
 | |
|                     var bitString = Convert.ToString(dr.sday[1], 2).PadLeft(8, '0').ToArray();
 | |
|                     var weeknum = (int)(DateTime.Now.DayOfWeek);
 | |
|                     if (bitString[weeknum + 1] == '0') continue;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //month
 | |
|                     if (dr.sday[1] != DateTime.Now.Day) continue;
 | |
|                 }
 | |
| 
 | |
| 
 | |
| 
 | |
|                 //같은날, 같은 atime aidx pdate 의 같이 있으면 이미 생성된것이므로 추가하지 않는다
 | |
|                 //생성해야할 자료라면 만들어 준다
 | |
|                 var newdr = dtInsert.NewMailDataRow();
 | |
|                 newdr.pdate = pdate;// DateTime.Now.ToString("yyyy-MM-dd");
 | |
|                 newdr.gcode = dr.gcode;
 | |
|                 newdr.fromlist = dr.fromlist;
 | |
|                 newdr.tolist = dr.tolist;
 | |
|                 newdr.bcc = dr.bcc;
 | |
|                 newdr.cate = cate;// string.Format("{0},{1}", dr.sday[0], dr.sday[1]);    //cate에 해당 자료를 기록한다.
 | |
|                 newdr.cc = dr.cc;
 | |
|                 newdr.subject = dr.subject;
 | |
|                 newdr.body = dr.body;
 | |
|                 newdr.aidx = dr.idx;
 | |
|                 newdr.atime = dr.stime;
 | |
|                 newdr.wuid = "MANAGER";
 | |
|                 newdr.wdate = DateTime.Now;
 | |
|                 dtInsert.AddMailDataRow(newdr);
 | |
|                 try
 | |
|                 {
 | |
|                     taData.Update(newdr);
 | |
|                     Console.WriteLine("auto make : " + newdr.tolist + ",subject=" + newdr.subject);
 | |
|                 }
 | |
|                 catch (Exception eX)
 | |
|                 {
 | |
|                     Console.WriteLine("auto make error : " + eX.Message);
 | |
|                 }
 | |
|             }
 | |
|             ChkAutoDate = DateTime.Now;
 | |
|         }
 | |
| 
 | |
|         string getMaillist(string org)
 | |
|         {
 | |
|             org = org.Replace(";", ",").Replace(":", ",");
 | |
|             string list_to = "";
 | |
|             foreach (var item in org.Split(','))
 | |
|             {
 | |
|                 if (item.Trim() != "")
 | |
|                 {
 | |
|                     var atindex = item.IndexOf("@");
 | |
|                     if (atindex != -1)
 | |
|                     {
 | |
|                         var dotindex = item.IndexOf(".", atindex + 1);
 | |
|                         if (dotindex != -1)
 | |
|                         {
 | |
|                             //정상이므로 추가한다.
 | |
|                             if (list_to != "") list_to += ",";
 | |
|                             list_to += item.Trim();
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             return list_to;
 | |
|         }
 | |
| 
 | |
|         private void toolStripButton1_Click(object sender, EventArgs e)
 | |
|         {
 | |
|             taskwait = !taskwait;
 | |
|             if (taskwait == false)
 | |
|                 LastUpdateTime = DateTime.Now.AddHours(-1);
 | |
|         }
 | |
| 
 | |
|         private void timer1_Tick(object sender, EventArgs e)
 | |
|         {
 | |
|             if (task != null)
 | |
|             {
 | |
|                 if (task.IsCompleted) this.toolStripButton1.Text = "완료";
 | |
|                 else if (task.IsCanceled) this.toolStripButton1.Text = "취소";
 | |
|                 else if (taskwait) this.toolStripButton1.Text = "대기상태";
 | |
|                 else this.toolStripButton1.Text = "가동중";
 | |
|                 this.toolStripButton1.Enabled = true;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 this.toolStripButton1.Text = "사용불가";
 | |
|                 this.toolStripButton1.Enabled = false;
 | |
|             }
 | |
| 
 | |
|         }
 | |
|     }
 | |
| }
 | 
