views:

721

answers:

5

I'm creating a PowerShell script to automate a process at work. This process requires an email to be filled in and sent to someone else. The email will always roughly follow the same sort of template however it will probably never be the same every time so I want to create an email draft in Outlook and open the email window so the extra details can be filled in before sending.

I've done a bit of searching online but all I can find is some code to send email silently. The code is as follows:

$ol = New-Object -comObject Outlook.Application  
$mail = $ol.CreateItem(0)  
$Mail.Recipients.Add("[email protected]")  
$Mail.Subject = "PS1 Script TestMail"  
$Mail.Body = "  
Test Mail  
"  
$Mail.Send()

In short, does anyone have any idea how to create and save a new Outlook email draft and immediately open that draft for editing?

+5  A: 
$olFolderDrafts = 16
$ol = New-Object -comObject Outlook.Application 
$ns = $ol.GetNameSpace("MAPI")

# call the save method yo dave the email in the drafts folder
$mail = $ol.CreateItem(0)
$null = $Mail.Recipients.Add("[email protected]")  
$Mail.Subject = "PS1 Script TestMail"  
$Mail.Body = "  Test Mail  "
$Mail.save()

# get it back from drafts and update the body
$drafts = $ns.GetDefaultFolder($olFolderDrafts)
$draft = $drafts.Items | where {$_.subject -eq 'PS1 Script TestMail'}
$draft.body += "`n foo bar"
$draft.save()

# send the message
#$draft.Send()
Shay Levy
Great! Thanks. That's mostly done it! Is it possible to make the script open the draft window automatically so the last manual bits can be filled in before sending?
Jason
Dan Blanchard
np :) call the display method: $draft.Display()
Shay Levy
+1  A: 

I think Shay Levy's answer is almost there: the only bit missing is the display of the item. To do this, all you need is to get the relevant inspector object and tell it to display itself, thus:

$inspector = $draft.GetInspector  
$inspector.Display()

See the MSDN help on GetInspector for fancier behaviour.

Dan Blanchard
Great!!! The final part! Thanks for your help!
Jason
+1  A: 

Based on the other answers, I have trimmed down the code a bit and use

$ol = New-Object -comObject Outlook.Application

$mail = $ol.CreateItem(0)
$mail.Subject = "<subject>"
$mail.Body = "<body>"
$mail.save()

$inspector = $mail.GetInspector
$inspector.Display()

This removes the unnecessary step of retrieving the mail from the drafts folder. Incidentally, it also removes an error that occurred in Shay Levy's code when two draft emails had the same subject.

Jason
A: 

Unfortunately, this does not work if Outlook is running.

Joe Bruns
A: 

I was running Powershell elevated as an administrator. If you run PS normally, this does work.

Joe Bruns