I have VBA code samples to load templates (and change the Sender address) without going into Outlook's convoluted Template dialog but wanted a PowerShell version.
Note: If the templates are simple text, no controls, the template does not need to be in Outlook default template path (C:\Users\%username%\AppData\Roaming\Microsoft\Templates\). They can be stored anywhere on your hard drive (or in a folder in the classic Outlook data file) . These templates can be opened from the file system with a double click. You do not need to open them using the New Item menu > More Items > Choose form dialog. Most email templates do not use controls.
The top lines in this PowerShell hides the PowerShell window, although it will still flash on the screen, but won't stay open long. If you don't mind having the PowerShell window pop up, you can remove the hide console section.
How to use the PowerShell on this page:
- Open Notepad.
- Copy and paste the PowerShell code into Notepad file.
- Change the template path and the From address.
- Save it using the .ps1 extension.
- Right click on the PowerShell file you saved and choose Run with PowerShell.
You can also run it using a batch (*.BAT) file (instructions below).
You'll need to allow local scripts by running this command in PowerShell opened using Run as Administrator:
Set-ExecutionPolicy RemoteSigned
Open a Template and Change the Sending Account
This version opens a File Explorer window, where you select the template you want to open. When the template opens, the From address is changed from the address belonging to the default data file to the address in the script. The address you want to use in the From field must be added to classic Outlook as an account.
# .Net methods for hiding/showing the console in the background Add-Type -Name Window -Namespace Console -MemberDefinition ' [DllImport("Kernel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); ' function Hide-Console { $consolePtr = [Console.Window]::GetConsoleWindow() #0 hide [Console.Window]::ShowWindow($consolePtr, 0) } Hide-Console # End hiding the console # update the correct paths here $templatepath = 'C:\path\to\templates\' #From address needs to be an account in Outlook $sendFrom ='from@domain.com' Add-Type -AssemblyName System.Windows.Forms $olApp = new-object -comobject outlook.application $ns = $olApp.GetNamespace("MAPI") $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ InitialDirectory = ($templatepath) } $null = $FileBrowser.ShowDialog() $SelectedFile = $FileBrowser.FileName function Invoke-SetProperty { # Function to set the SendUsingAccount property param( [__ComObject] $Object, [String] $Property, $Value ) [Void] $Object.GetType().InvokeMember($Property,"SetProperty",$NULL,$Object,$Value) } $account = $olapp.Session.Accounts.Item($sendFrom) $oMail = $olApp.CreateItemFromTemplate($SelectedFile) #Change Sender mailbox Invoke-SetProperty -Object $oMail -Property "SendUsingAccount" -Value $account $oMail.Display()
Send From a ProxyAddress
If you want to use a proxy address on your account, you need remove or comment out the $account line in the PowerShell script and change the Invoke-SetProperty line as shown below, using "SentOnBehalfOfName" -Value $sendFrom .
#$account = $olapp.Session.Accounts.Item($sendFrom) $oMail = $olApp.CreateItemFromTemplate($SelectedFile) #Change Sender mailbox Invoke-SetProperty -Object $oMail -Property "SentOnBehalfOfName" -Value $sendFrom
Proxy addresses are the secondary address on your mailbox, visible when you click on the From button.
Open Template but Don't Change Sender Address
This version of the PowerShell works with the default app for template files (*.OFT), either classic Outlook or new Outlook. This uses the address belonging to the default data file in classic Outlook or the primary account in new Outlook. You can select a different From address before sending the message.
As written, the PowerShell opens the template folder for you to select a template, but you could hardcode a template path if you want it to open a specific template. That requires just two lines (plus the code to hide the PowerShell window):
# update the correct paths here
$templatepath = 'C:\path\to\templates\mytemplate.oft'
Invoke-Item $templatepath
# .Net methods for hiding/showing the console in the background Add-Type -Name Window -Namespace Console -MemberDefinition ' [DllImport("Kernel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); ' function Hide-Console { $consolePtr = [Console.Window]::GetConsoleWindow() #0 hide [Console.Window]::ShowWindow($consolePtr, 0) } Hide-Console # End hiding the console # update the correct paths here $templatepath = 'C:\path\to\templates\' Add-Type -AssemblyName System.Windows.Forms $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ InitialDirectory = ($templatepath) } $null = $FileBrowser.ShowDialog() $SelectedFile = $FileBrowser.FileName Invoke-Item $SelectedFile
Run PowerShell using a batch file
There are several ways to run a PowerShell:
1. Right click on the PowerShell and choose Run with PowerShell.
2. Open PowerShell and enter the path to the ps1
3. Use a batch file so you can double click to run.
To use a batch file, open notepad and paste the following line in, changing the path to the PowerShell script.
cmd /c start /min "" powershell.exe -WindowStyle hidden -f "C:\path\to\powershell\open-template-send.ps1"
Save the notepad file with the .bat extension then double click to run. A window will flash on the screen when you run the batch file. The batch file can be saved to your desktop or any convenient folder.
Using PowerShell Scripts
To use PowerShell scripts with Outlook, start typing PowerShell on the start menu and open Windows PowerShell when it comes up. Windows PowerShell ISE has a script pane at the top, which is useful if you want to edit the script.
Paste the entire script in the PowerShell window and press Enter or the Run button if using PowerShell ISE.
Note: PowerShell scripts will not work with new Outlook or Outlook on the web. However, the script to open a template will work with new Outlook because it is opening a file in the file system. It cannot change the From address (which requires interaction with Outlook.)
Saving PowerShell Scripts
If you want to save the script as a .ps1 file, paste it into Notepad and save it with the extension .ps1. To open it in the PowerShell IDE, type PowerShell on the start menu and click on Windows PowerShell IDE when the PowerShell app is found. Paste the script in the editing window.
To use it, you need to allow local scripts by running this command:
Set-ExecutionPolicy RemoteSigned
To run your saved .ps1 file, right-click on the script and choose Run with PowerShell.
More Information
The function to set the SendUsingAccount property is from Change Outlook sender mailbox with PowerShell – A workaround
The function to hide the console window is from Opening PowerShell Script and hide Command Prompt, but not the GUI