From 19f4640f4f7190f8749068aefd6dd8af07861a41 Mon Sep 17 00:00:00 2001 From: AdminDroid <49208841+admindroid-community@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:26:55 +0530 Subject: [PATCH] Setup Recurring Auto Reply Configuration --- .../SetUpRecurringOOFReplies.ps1 | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Setup recurring OOF/SetUpRecurringOOFReplies.ps1 diff --git a/Setup recurring OOF/SetUpRecurringOOFReplies.ps1 b/Setup recurring OOF/SetUpRecurringOOFReplies.ps1 new file mode 100644 index 0000000..b88a3f7 --- /dev/null +++ b/Setup recurring OOF/SetUpRecurringOOFReplies.ps1 @@ -0,0 +1,102 @@ +<# +============================================================================================= +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