mirror of
https://github.com/admindroid-community/powershell-scripts.git
synced 2025-12-17 16:35:19 +00:00
103 lines
5.0 KiB
PowerShell
103 lines
5.0 KiB
PowerShell
<#
|
||
=============================================================================================
|
||
Name: Set up Recurring OOF Replies in Outlook
|
||
Description: This script helps to automate recurring out-of-office replies for Microsoft 365 users
|
||
Version: 1.0
|
||
Website: m365scripts.com
|
||
|
||
Script Highlights:
|
||
~~~~~~~~~~~~~~~~~
|
||
1. The script can be executed using either username/password or certificate-based authentication (CBA).
|
||
2. It automatically calculates and sets the out-of-office start and end times for the upcoming occurrences based on the provided day and time parameters.
|
||
3. This script is primarily designed for setting up recurring out-of-office replies with the help of scheduling tools like Windows Task Scheduler or Azure Automation.
|
||
4. This script allows admins to set up recurring out-of-office replies for themselves or their users, and it also enables users to configure their own recurring OOF replies.
|
||
5. The external out-of-office message defaults to the internal message if not provided.
|
||
6. The external audience defaults to "All" if not specified.
|
||
|
||
For detailed Script execution: https://m365scripts.com/exchange-online/how-to-set-recurring-automatic-replies-in-outlook/
|
||
============================================================================================
|
||
#>
|
||
param (
|
||
[Parameter(Mandatory=$true)][string]$Identity,
|
||
[Parameter(Mandatory=$true)][string]$StartDay,
|
||
[Parameter(Mandatory=$true)][string]$StartTime,
|
||
[Parameter(Mandatory=$true)][string]$EndDay,
|
||
[Parameter(Mandatory=$true)][string]$EndTime,
|
||
[Parameter(Mandatory=$true)][string]$InternalMessage,
|
||
[string]$ExternalMessage,
|
||
[string]$ExternalAudience,
|
||
[string]$UserName,
|
||
[string]$Password,
|
||
[string]$ClientId,
|
||
[string]$Organization,
|
||
[string]$CertificateThumbprint
|
||
)
|
||
|
||
# Default ExternalMessage and ExternalAudience if not provided
|
||
if (-not $ExternalMessage) { $ExternalMessage = $InternalMessage }
|
||
if (-not $ExternalAudience) { $ExternalAudience = "All" }
|
||
|
||
# Function to validate day of the week
|
||
function Validate-DayOfWeek {
|
||
param (
|
||
[string]$dayOfWeek
|
||
)
|
||
return [Enum]::GetNames([System.DayOfWeek]) -contains $dayOfWeek
|
||
}
|
||
|
||
# Function to validate time format
|
||
function Validate-TimeFormat {
|
||
param (
|
||
[string]$time
|
||
)
|
||
return $time -match '^(0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$' # 24-hour format
|
||
}
|
||
|
||
# Validate all parameters at the start
|
||
if (-not (Validate-DayOfWeek $StartDay) -or -not (Validate-DayOfWeek $EndDay) -or -not (Validate-TimeFormat $StartTime) -or -not (Validate-TimeFormat $EndTime)) {
|
||
Write-Host "There was an error while calculating the startDateTime or endDateTime. Please check the spelling and format of all the day/time parameters." -ForegroundColor Red
|
||
exit
|
||
}
|
||
|
||
function Get-DateForDayOfWeek ($dayOfWeek) {
|
||
$daysToAdd = ([Enum]::Parse([System.DayOfWeek], $dayOfWeek)) - (Get-Date).DayOfWeek
|
||
if ($daysToAdd -lt 0) { $daysToAdd += 7 }
|
||
(Get-Date).AddDays($daysToAdd).Date
|
||
}
|
||
|
||
# Calculate start and end DateTimes
|
||
$startDateTime = (Get-DateForDayOfWeek $StartDay).AddHours([int]$StartTime.Split(':')[0]).AddMinutes([int]$StartTime.Split(':')[1])
|
||
$endDateTime = (Get-DateForDayOfWeek $EndDay).AddHours([int]$EndTime.Split(':')[0]).AddMinutes([int]$EndTime.Split(':')[1])
|
||
if ($endDateTime -lt $startDateTime) { $endDateTime = $endDateTime.AddDays(7) }
|
||
|
||
Write-Host Connecting to Exchange Online...
|
||
#Storing credential in script for scheduling purpose/ Passing credential as parameter - Authentication using non-MFA account
|
||
if(($UserName -ne "") -and ($Password -ne ""))
|
||
{
|
||
$SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force
|
||
$Credential = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword
|
||
Connect-ExchangeOnline -Credential $Credential
|
||
}
|
||
elseif($Organization -ne "" -and $ClientId -ne "" -and $CertificateThumbprint -ne "")
|
||
{
|
||
Connect-ExchangeOnline -AppId $ClientId -CertificateThumbprint $CertificateThumbprint -Organization $Organization
|
||
}
|
||
|
||
# Set AutoReply configuration
|
||
try {
|
||
# Attempt to set the mailbox auto-reply configuration
|
||
Set-MailboxAutoReplyConfiguration –Identity $Identity -AutoReplyState Scheduled –StartTime $startDateTime -EndTime $endDateTime –InternalMessage $InternalMessage -ExternalMessage $ExternalMessage -ExternalAudience $ExternalAudience -ErrorAction Stop
|
||
# If no error occurs, print the success message
|
||
Write-Host "Out-of-office automatic replies configured for the user: $Identity"
|
||
}
|
||
catch {
|
||
# If an error occurs, print the error message and stop the success message
|
||
Write-Host "Failed to configure out-of-office automatic replies for the user: $Identity" -ForegroundColor Red
|
||
Write-Host $_.Exception.Message
|
||
}
|
||
|
||
# Disconnect from Exchange Online
|
||
Disconnect-ExchangeOnline -Confirm:$false | Out-Null
|
||
Write-Host `n~~ Script prepared by AdminDroid Community ~~`n -ForegroundColor Green
|
||
Write-Host "~~ Check out " -NoNewline -ForegroundColor Green; Write-Host "admindroid.com" -ForegroundColor Yellow -NoNewline; Write-Host " to get access to 1800+ Microsoft 365 reports ~~" -ForegroundColor Green `n`n
|