2011. 1. 14. 16:48

* PowerShell 를 이용한 메일 DB 체크후 메일 발송 & 이벤트 등록


* PowerShell 를 이용해서 DB 테이블의 사용자 Mail 을 체크후 메일 발송 부터
  발송후 실패 또는 성공에 대한 로그 파일 남기는것과, 이벤트 로그 등록 방법 까지 확인하겠습니다.

스크립트
PowerShell_Mailing.ps1

# 쿼리문 작성
# query1 은 User_Table 에 mail 값만 받아오는 것입니다.
# query2 는 Table_2 에 Group by 절을 이용해서 100개의 userid 값의 100개의 행 이상일때 값을 ID 와 카운트 값을 반환합니다.

$query1 = "Select Email from User_Table"
$query2 = "Select count(userid) as cnt ,userid from Table_2 group by userid having count(userid)>100"

#DB 커넥션
$ConnStr = "Server=XXX.XXX.XXX.XXXDatabase=DBName;User ID=UserID;password=Password"
$Conn = New-Object System.Data.SqlClient.SqlConnection($ConnStr)
$Conn.Open()

#Query2 문에 대한 커넥션.
$Cmd = New-Object System.Data.SqlClient.SqlCommand($query2,$Conn)
$DR2 = $cmd.ExecuteReader()

#로그 저장 메일 query2 에 대한 화면을 저장합니다.
Start-Transcript -path C:\file\LOG_mail_Cnt.log

#반복문으로 Raad()
While($DR2.Read())
    {
       Write-output "카운트값:"$DR2["cnt"] "" "UserID:"$DR2["UserID"]
    }
$DR2.Close()

#로그 중지
Stop-Transcript

#Command (Query1문) User_Table 의 메일 값을 가져옵니다.
$Cmd = New-Object System.Data.SqlClient.SqlCommand($query1,$Conn)

#DataReader 저장
$DR = $cmd.ExecuteReader()

#로그 기록 시작
Start-Transcript -path C:\file\LOG_mail.log

#반목문 으로 Read()
while($DR.Read())
{
    # write-output "메일주소 :"  $DR[0]
    # write-output "클라이언트의 메일주소는 " $DR[0] "입니다." " " 
   
        $SmtpServer = "127.0.0.1"
        $From = "test
@test.com"   #보내는사람

        #DataReader 로 받아온 메일값을 To 에 입력합니다.
        $To =  $DR[0] #받는 사람
        $subject = "SMTP_Mail_Test"

        #메일의 첨부파일로 query2에 대한 값을 보냅니다.
        $filename = "C:\file\LOG_mail_Cnt.log"

        $smtp = new-object system.net.mail.smtpClient($SmtpServer)
        $mail = new-object System.Net.Mail.MailMessage
        $att = new-object System.Net.Mail.Attachment($filename)
        $mail.From = $From
        $mail.To.Add($To)
        $mail.Subject = $subject
        $mail.Body = "첨부파일 확인하시기 바랍니다"
        $mail.Attachments.Add($att)
        $mail.IsBodyHtml = $false
        $smtp.Send($mail)

}

#DataReader 닫기
$DR.Close()

#로그 중지
Stop-Transcript

# 이벤트 로그 생성(1회만 생성)
# new-eventlog -source Event_Test -logname Event_test

# 이벤트 로그에 쓰기(이벤트 로그에 메일보낸 값에 대해서 기록합니다.)
$Mail_Send_Event = Get-Content C:\File\Log_mail.log

write-eventlog -logname Event_Test -source Event_Test -eventID 3001 -entrytype Information -message "$Mail_Send_Event" -category 1 -rawdata 10,20

#닫기

$Conn.Close()



 
* 마지막으로 스케줄상에 등록합니다.
등록시에는 파워쉘이 동작할수 있도록 Powershell 의 경로를 정확히 기재해줍니다.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe  C:\work\Power_Mailing.ps1


* 이벤트 로그에 기록된 모습입니다.
  로그의 내용을 그대로 가져오기 때문에 메일 발송 오류시에는 오류의 내용을 이벤트 로그에 기록하게 됩니다.




* 메일 확인시 아래 이미지와 같이 첨부 파일과 함께 오게 됩니다.
  물론 User_Table 의 Email 값에 있는 유져별로 모두 가게 되는것이지요.