feat(service): Console_SendMail을 Windows 서비스로 변환
- MailService.cs 추가: ServiceBase 상속받는 Windows 서비스 클래스 - Program.cs 수정: 서비스/콘솔 모드 지원, 설치/제거 기능 추가 - 프로젝트 설정: System.ServiceProcess 참조 추가 - 배치 파일 추가: 서비스 설치/제거/콘솔실행 스크립트 주요 기능: - Windows 서비스로 백그라운드 실행 - 명령행 인수로 모드 선택 (-install, -uninstall, -console) - EventLog를 통한 서비스 로깅 - 안전한 서비스 시작/중지 처리 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
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
|
||||
{
|
||||
@@ -62,116 +66,288 @@ namespace Console_SendMail
|
||||
return list_to;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
|
||||
Console.WriteLine($"mail start ver 2508051140");
|
||||
while (true)
|
||||
// 명령행 인수 처리
|
||||
if (args.Length > 0)
|
||||
{
|
||||
|
||||
//메일대기내역전송
|
||||
var tsSendMail = DateTime.Now - ChkSendMailTime;
|
||||
if (tsSendMail.TotalMilliseconds > 1000)
|
||||
string command = args[0].ToLower();
|
||||
switch (command)
|
||||
{
|
||||
try { SendMail(); }
|
||||
catch { }
|
||||
finally { ChkSendMailTime = DateTime.Now; }
|
||||
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;
|
||||
}
|
||||
|
||||
//자동생성 메일 작성
|
||||
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; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Console.WriteLine("mail end");
|
||||
// 서비스로 실행
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 메일 관련 작업들을 실행하는 메서드 (서비스와 콘솔에서 공통 사용)
|
||||
/// </summary>
|
||||
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; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 중복실행 방지 체크
|
||||
/// </summary>
|
||||
/// <returns>단일 인스턴스인 경우 true, 중복실행인 경우 false</returns>
|
||||
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; // 단일 인스턴스
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user