파워쉘로 메일 전송이 가능하다면 몇가지 업무를 자동화할 수 있을 것 같아 한두달 전부터 시도해봤는데 실패했었다.
드디어 전송에 성공하여 올리는 포스트.
먼저 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: $_"
}
정상적으로 발신, 수신 되었다.
'At actual field' 카테고리의 다른 글
[Active Directory] 부서장 기준으로 소속인원 정보 변경 (0) | 2025.03.14 |
---|---|
Powershell을 통한 M365 그룹 생성 및 수정 (0) | 2024.05.18 |
Powershell로 Active Directory 퇴사자 계정 처리하기 (0) | 2024.05.18 |
Powershell로 실행 로그 저장하기 (0) | 2024.05.18 |
Powershell로 로컬 프로필 삭제하기 (0) | 2024.05.02 |