using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace Console_SendMail { partial class Program { //DateTime redisTryTime = DateTime.Parse("1982-11-23"); static Boolean bBW = true; static DateTime ChkMakeAutoTime = DateTime.Now.AddDays(-1); static DateTime ChkSendMailTime = DateTime.Now.AddDays(-1); static DateTime ChkMakeSchDayWeekTime = DateTime.Now.AddDays(-1); static DateTime ChkMakePrjUpdateWeekTime = DateTime.Now.AddDays(-1); static DateTime ChkMakeSchDay = DateTime.Now.AddDays(-1); static DateTime ChkNoSchedule = DateTime.Now.AddDays(-1); static DateTime ChkJobreportDay = DateTime.Now.AddDays(-1); static DateTime ChkJObreportWeek = DateTime.Now.AddDays(-1); static DateTime ChkTakeARest = DateTime.Now.AddDays(-1); public static string MailSort(string addr, string except) { if (string.IsNullOrEmpty(except)) return addr; var alist = addr.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList(); var elist = except.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (var item in elist) alist.Remove(item); if (alist.Count < 1) return string.Empty; return string.Join(";", alist); } static string getdbdata(object tdata) { if (tdata == null) return string.Empty; return tdata.ToString(); } static string getMaillist(object orgo) { var org = string.Empty; if (orgo != null) org = orgo.ToString(); 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; } static void Main(string[] args) { // 명령행 인수 처리 if (args.Length > 0) { string command = args[0].ToLower(); switch (command) { case "-install": case "/install": InstallService(); return; case "-uninstall": case "/uninstall": UninstallService(); return; case "-console": case "/console": RunAsConsole(); return; case "-help": case "/help": case "/?": ShowHelp(); return; } } // 서비스로 실행 if (Environment.UserInteractive) { // 대화형 모드에서는 콘솔로 실행 RunAsConsole(); } else { // 서비스로 실행 ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MailService() }; ServiceBase.Run(ServicesToRun); } } private static void ShowHelp() { Console.WriteLine("EETGW Mail Service"); Console.WriteLine("사용법:"); Console.WriteLine(" Console_SendMail.exe - 서비스로 실행"); Console.WriteLine(" Console_SendMail.exe -console - 콘솔 모드로 실행"); Console.WriteLine(" Console_SendMail.exe -install - 서비스 설치"); Console.WriteLine(" Console_SendMail.exe -uninstall - 서비스 제거"); Console.WriteLine(" Console_SendMail.exe -help - 도움말 표시"); } private static void InstallService() { try { string servicePath = $"\"{System.Reflection.Assembly.GetExecutingAssembly().Location}\""; ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "sc.exe", Arguments = $"create EETGWMailService binPath= \"{servicePath}\" DisplayName= \"EETGW Mail Service\" start= auto", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; using (Process process = Process.Start(startInfo)) { process.WaitForExit(); if (process.ExitCode == 0) { Console.WriteLine("서비스가 성공적으로 설치되었습니다."); Console.WriteLine("서비스를 시작하려면 다음 명령을 실행하세요:"); Console.WriteLine("net start EETGWMailService"); } else { string error = process.StandardError.ReadToEnd(); Console.WriteLine($"서비스 설치 실패: {error}"); } } } catch (Exception ex) { Console.WriteLine($"서비스 설치 중 오류 발생: {ex.Message}"); } } private static void UninstallService() { try { ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "sc.exe", Arguments = "delete EETGWMailService", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; using (Process process = Process.Start(startInfo)) { process.WaitForExit(); if (process.ExitCode == 0) { Console.WriteLine("서비스가 성공적으로 제거되었습니다."); } else { string error = process.StandardError.ReadToEnd(); Console.WriteLine($"서비스 제거 실패: {error}"); } } } catch (Exception ex) { Console.WriteLine($"서비스 제거 중 오류 발생: {ex.Message}"); } } private static void RunAsConsole() { // 중복실행 방지 체크 if (!CheckSingleInstance()) { return; // 프로그램 종료 } Console.WriteLine($"mail start ver 2508051140 (콘솔 모드)"); Console.WriteLine("종료하려면 Ctrl+C를 누르세요."); // Ctrl+C 핸들러 설정 Console.CancelKeyPress += (sender, e) => { Console.WriteLine("\n메일 서비스를 종료합니다..."); e.Cancel = false; }; try { while (true) { ExecuteMailOperations(); Thread.Sleep(1000); // 1초 대기 } } catch (Exception ex) { Console.WriteLine($"오류 발생: {ex.Message}"); } finally { Console.WriteLine("mail end"); } } /// /// 메일 관련 작업들을 실행하는 메서드 (서비스와 콘솔에서 공통 사용) /// public static void ExecuteMailOperations() { //메일대기내역전송 var tsSendMail = DateTime.Now - ChkSendMailTime; if (tsSendMail.TotalMilliseconds > 1000) { try { SendMail(); } catch { } finally { ChkSendMailTime = DateTime.Now; } } //자동생성 메일 작성 var tsAutoMake = DateTime.Now - ChkMakeAutoTime; if (tsAutoMake.TotalMinutes >= 10) { try { MakeAutoMail(); } catch { } finally { ChkMakeAutoTime = DateTime.Now; } } //프로젝트업데이트알림 var tsPrjUpdateweek = DateTime.Now - ChkMakePrjUpdateWeekTime; if (tsPrjUpdateweek.TotalMinutes > 30 && DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour >= 10 && DateTime.Now.Hour <= 18) { try { Mail_MakeUpdateRequireProject(); } catch { } finally { ChkMakePrjUpdateWeekTime = DateTime.Now; } } ///스케쥴 기한 알림(주) var tsScheDayweek = DateTime.Now - ChkMakeSchDayWeekTime; if (tsScheDayweek.TotalMinutes > 30 && DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour >= 10 && DateTime.Now.Hour <= 18) { try { Mail_MakeScheduleDayWeek(); } catch { } finally { ChkMakeSchDayWeekTime = DateTime.Now; } } ///스케쥴 기한 알림(일) var tsScheDay = DateTime.Now - ChkMakeSchDay; if (tsScheDay.TotalMinutes > 30 && DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday && DateTime.Now.Hour >= 10 && DateTime.Now.Hour <= 18) { try { Mail_MakeScheduleDay(); } catch { } finally { ChkMakeSchDay = DateTime.Now; } } ///스케쥴없음 var tsNoSchedule = DateTime.Now - ChkNoSchedule; if (tsNoSchedule.TotalMinutes > 30 && DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour >= 10 && DateTime.Now.Hour <= 18) { try { Mail_NoSchedule(); } catch { } finally { ChkNoSchedule = DateTime.Now; } } ///업무일지(주간) var tsjobweek = DateTime.Now - ChkJObreportWeek; if (tsjobweek.TotalMinutes > 30 && DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 18) { try { Mail_JobReportWeek(); } catch { } finally { ChkJObreportWeek = DateTime.Now; } } ///업무일지(일) var tsjobday = DateTime.Now - ChkJobreportDay; if (tsjobday.TotalMinutes > 15 && DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday && DateTime.Now.DayOfWeek != DayOfWeek.Monday && DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 18) { try { Mail_JobReportDay(); } catch { } finally { ChkJobreportDay = DateTime.Now; } } ///휴가신청(Remind) - 230611 var tsTakeaRest = DateTime.Now - ChkTakeARest; if (tsTakeaRest.TotalMinutes > 15 && DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday && DateTime.Now.Hour >= 17) { try { Mail_Take_a_rest_remind(); } catch { } finally { ChkTakeARest = DateTime.Now; } } } /// /// 중복실행 방지 체크 /// /// 단일 인스턴스인 경우 true, 중복실행인 경우 false static bool CheckSingleInstance() { string processName = Process.GetCurrentProcess().ProcessName; Process[] processes = Process.GetProcessesByName(processName); if (processes.Length > 1) { // 중복실행 감지 string message = $"⚠️ 프로그램이 이미 실행 중입니다!\n\n" + "동시에 여러 개의 프로그램을 실행할 수 없습니다.\n\n" + "해결방법을 선택하세요:"; Console.WriteLine(message); // 현재 실행을 취소 return false; } return true; // 단일 인스턴스 } } }