At actual field

Powershell을 통해 메일 전송

Sergemeow 2024. 6. 9. 10:24

파워쉘로 메일 전송이 가능하다면 몇가지 업무를 자동화할 수 있을 것 같아 한두달 전부터 시도해봤는데 실패했었다.

 

드디어 전송에 성공하여 올리는 포스트.

 

먼저 Office 365 모듈을 설치해준다. 이 스크립트는 처음 한번만 런하면 된다. 

Install -Module -Name ExchangeOnlineManagement -Force -AllowClobber

 

내 M365 계정을 통해 메일을 전송해야하기에 인증 정보를 받아와야한다. 

 

계속 실패했던 것이 이 부분이었는데, M365 계정 관리 페이지에서 보안 - 앱 암호 설정을 통해 앱 암호를 설정해주면 된다.

 

My Sign-Ins | Security Info | Microsoft.com

 

My Sign-Ins

 

mysignins.microsoft.com

 

위의 웹페이지에서 

앱 암호를 설정해주었다.

 

다시 파워쉘 스크립트로 돌아가..

$password = "설정된 앱 암호" | ConverTo-SecureString -AsPlainText -Force
$Password | Export-Clixml -Path "C:\지정된 경로\파일이름.xml"

 

위와 같이 암호를 암호화하여 지정된 경로에 저장했다.

 

위의 스크립트도 한번 실행하여 암호가 파일로 저장되도록하고 이후에는 run하지 않아도 된다. 주석처리해도 되지만 암호가 직접적으로 기재되어있으니 지워버리는 것이 나은 듯.

 

$user = "내 M365 이메일 주소"
$password = Import-Clixml -Path "C:\지정된경로\파일이름"
$userCredential = New-Object System.Management.Automation.PSCredential($user, $password)

 

위의 스크립트로 Credential은 준비되었다. 

 

그냥 메일만 보내면 재미없으니 AD에서 특정 유저의 암호 만료일을 알려주는 내용을 테스트 삼아 써보자.

$testUser = Get-ADUSer -Filter {SamAccountName -eq "계정의 samaccountname"} -Properties PasswordLastSet, DisplayName
$expirationDateTime = $testUser.PassswordLastSet.AddDays(암호의 유효기간)
$daysLeft = $expirationDateTime - (Get-Date)
$daysLeftInt = [math]::Floor($daysLeft.TotalDays)
$expirationDate = $expirationDateTime.ToString("MM/dd/yyyy")
$emailBody = "This is an automated test email sent from PowerShell. Your password expirate date is $expirationDate and you have $daysLeftInt days left.
	이 이메일은 파워쉘을 통해 자동발송된 메일입니다. 귀하의 암호 만료일은 $($expirationDate)이며, $($daysLeftInt)일 남았습니다."
$actualEmailBody = $emailBody.Clone()

 

$actualEmailBody 변수를 굳이 따로 만들어준건 그냥 전송하면 한글이 깨지기 때문이다. 

 

그 다음은 이메일 전송 파라미터를 설정해주자.

$emailParams = @{
From = "내 M365 메일 주소"
    To = "수신자 메일 주소"
    Subject = "Test Mail"
    Body = $actualEmailBody
    Encoding = [System.Text.Encoding]::UTF8
    SmptServer = "smtp.office365.com"
    Credential = $UserCredential
    UseSsl = $true
    Port = 587
}

 

파라미터 내에서도 메일 내용을 UTF8로 인코딩해서 한글이 깨지는걸 막아줬다.

다 준비되었으니 발송

try{
Send-MailMessage @emailParams
    Write-Host "Email sent successfully"
}catch{
Write-Host "Famil to send email. Error: $_"
}

 

정상적으로 발신, 수신 되었다.