Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell Send-MailMessage cmdlet으로 이메일 보내기 완벽 가이드

SMTP 서버를 통해 이메일을 전송하려면 Send-MailMessage PowerShell cmdlet을 사용할 수 있습니다. 이 내장 cmdlet은 PowerShell 2.0 이상 버전에서 사용할 수 있으며(이전 버전에서는 .NET의 System.Net.Mail 클래스를 사용해야 했습니다), PowerShell 스크립트에서 간편하게 이메일을 발송할 수 있습니다.

Send-MailMessage 기본 구문

cmdlet의 구문을 확인하려면 다음 명령어를 실행합니다:

get-help Send-MailMessage
Send-MailMessage [-To] <String[]> [-Subject] <String> [[-Body] <String>] [[-SmtpServer] <String>] [-Attachments <String[]>] [-Bcc <String[]>] [-BodyAsHtml] [-Cc <String[]>] [-Credential <PSCredential>] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding <Encoding>] -From <String> [-Port <Int32>] [-Priority {Normal | Low | High}] [-UseSsl] [<CommonParameters>]

주요 매개변수

  • -From: 발신자 이메일 주소입니다. SMTP 서버가 발신자 주소를 검증하지 않고 익명 발송을 허용하는 경우, 실제 SMTP 주소를 입력하지 않아도 되며 어떤 이메일 주소로도 발송할 수 있습니다.
  • -To: 수신자 이메일 주소입니다.
  • -SmtpServer: 이메일을 발송할 때 사용할 SMTP 서버의 주소입니다.

참고로 $PSEmailServer 환경 변수에 메일 서버 주소를 설정해두면, Send-MailMessage cmdlet을 실행할 때마다 SMTP 서버 주소를 지정하지 않아도 됩니다.

기본 이메일 발송 예제

다음 간단한 PowerShell 명령어는 지정된 제목과 본문으로 여러 수신자에게 이메일을 전송합니다:

Send-MailMessage -From 'ps-script@woshub.com' -To 'serveradmin@woshub.com','helpdesk@woshub.com' -Subject "Test Email Alert" -Body "This is email body text" -SmtpServer 'smtp.woshub.com'

cmdlet의 속성을 더 쉽게 편집할 수 있도록 명령어를 여러 줄로 나누어 표현할 수도 있습니다:

Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To 'serveradmin@woshub.com','helpdesk@woshub.com' `
-From 'ps-script@woshub.com' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'

마지막 명령어에서는 UTF8 인코딩을 추가로 설정했습니다. 이 옵션이 없으면 이메일 제목이나 본문에 ANSI가 아닌 문자(예: 한글)가 포함될 경우 글자가 깨져서 표시됩니다.

Windows PowerShell은 기본적으로 ANSI와 ASCII 인코딩을 사용합니다. 반면 PowerShell Core(7.x)로 업그레이드한 경우에는 기본적으로 UTF-8 인코딩을 사용한다는 점을 기억하세요.

SSL/TLS 암호화 연결 사용하기

기본적으로 Send-MailMessage cmdlet은 표준 SMTP 포트인 TCP 25번을 통해 이메일을 전송하려고 시도합니다. 만약 SMTP 서버가 암호화된 프로토콜을 통해서만 이메일 발송을 허용한다면, 포트 번호(일반적으로 465 또는 587)와 -UseSsl 옵션을 함께 지정해야 합니다:

-SmtpServer 'smtp.woshub.com' -Port 465 -UseSsl

아래 표는 PowerShell에서 이메일을 발송할 때 활용할 수 있는 주요 공용 이메일 제공업체의 SMTP 서버 설정입니다(계정 설정에서 SMTP 발송을 허용해야 하는 경우가 많으니 참고하세요):

제공업체SMTP 서버 주소포트암호화 방식
Gmailsmtp.gmail.com587 / 25 / 465TLS / TLS / SSL
Office 365smtp.office365.com587TLS
Outlook.comsmtp-mail.outlook.com587TLS
Yahoosmtp.mail.yahoo.com587TLS
iCloud Mailsmtp.mail.me.com587TLS
AOLsmtp.aol.com465SSL

SMTP 인증 처리하기

SMTP 서버가 익명 발송을 금지하고 있다면(relay 거부) 다음과 같은 오류가 발생합니다:

5.7.1 Client was not authenticated.

이 경우 -Credential 옵션을 사용하여 SMTP 서버에 인증할 수 있습니다.

대화형 방식으로 사용자 자격 증명을 요청하려면 다음과 같이 작성합니다:

Send-MailMessage ... -Credential (Get-Credential)

또는 인증에 사용할 계정 정보를 변수에 저장해두었다가 사용할 수도 있습니다:

$cred = Get-Credential
Send-MailMessage ... -Credential $cred

스크립트에 비밀번호를 직접 저장하여 SMTP 서버에 연결하려면 다음 구문을 사용합니다:

$mypasswd = ConvertTo-SecureString "smP@ssdw0rrd2" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("user1@woshub.com", $mypasswd)
Send-MailMessage ... -Credential $mycreds

보안을 위해 PowerShell 스크립트에서 저장된 자격 증명을 안전하게 사용하는 방법을 참고하는 것이 좋습니다.

첨부 파일 추가 및 HTML 형식 이메일 발송

이메일에 첨부 파일을 추가하려면 -Attachments 옵션을 사용합니다. 아래 예제에서는 HTML 형식의 이메일을 발송하고 로컬 디스크의 file1.txt와 install.log 파일을 첨부합니다. Gmail SMTP 서버를 사용하며(Gmail 계정 설정에서 먼저 앱 비밀번호를 생성한 후, 일반 비밀번호 대신 SMTP 인증에 사용해야 합니다):

$MailMessage = @{
To = "admin@woshub.com"
Bcc = "manager@woshub.com", "manager2@woshub.com"
From = "smtpsender1@gmail.com"
Subject = "DC Server Report"
Body = "<h1>Welcome!</h1> <p><strong>Generated:</strong> $(Get-Date -Format g)</p>"
Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding = "UTF8"
Attachment = "C:\Logs\file1.txt", "C:\Logs\install.log"
}
Send-MailMessage @MailMessage -Credential $cred

위와 같이 해시 테이블(splatting) 형태로 매개변수를 정리하면 코드의 가독성이 크게 향상되며, 유지보수도 쉬워집니다.

전달 알림(Delivery Notification) 설정

-DeliveryNotificationOption 옵션을 사용하면 이메일에 대한 전달 알림(읽음 확인)을 설정할 수 있습니다. 이 기능을 통해 수신자가 이메일을 정상적으로 받았는지 확인할 수 있습니다.

사용 가능한 알림 유형은 다음과 같습니다:

  • OnSuccess: 전달이 성공했을 때 알림을 받습니다.
  • OnFailure: 전달이 실패했을 때 알림을 받습니다.
  • Delay: 전달이 지연되었을 때 알림을 받습니다.

이처럼 Send-MailMessage cmdlet을 활용하면 시스템 관리 자동화 스크립트에서 서버 상태 보고, 모니터링 경고 등 다양한 목적의 이메일 알림을 손쉽게 구현할 수 있습니다.