SMTP 서버를 통해 이메일을 전송하려면 Send-MailMessage PowerShell cmdlet을 사용할 수 있습니다. 이 내장 cmdlet은 PowerShell 2.0 이상 버전에서 사용할 수 있으며(이전 버전에서는 .NET의 System.Net.Mail 클래스를 사용해야 했습니다), PowerShell 스크립트에서 간편하게 이메일을 발송할 수 있습니다.
Send-MailMessage 기본 구문
cmdlet의 구문을 확인하려면 다음 명령어를 실행합니다:
get-help Send-MailMessageSend-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 서버 주소 | 포트 | 암호화 방식 |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587 / 25 / 465 | TLS / TLS / SSL |
| Office 365 | smtp.office365.com | 587 | TLS |
| Outlook.com | smtp-mail.outlook.com | 587 | TLS |
| Yahoo | smtp.mail.yahoo.com | 587 | TLS |
| iCloud Mail | smtp.mail.me.com | 587 | TLS |
| AOL | smtp.aol.com | 465 | SSL |
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을 활용하면 시스템 관리 자동화 스크립트에서 서버 상태 보고, 모니터링 경고 등 다양한 목적의 이메일 알림을 손쉽게 구현할 수 있습니다.