Using Outlook Contact Form - vb.net

I am using the Outlook Contact Form from my application to allow the user to create a new contact. When the user saves the contact or closes the form, the instance of outlook closes as well. How can I keep outlook from closing, I am not done with the object and it takes a few seconds to open another instance of outlook?
Dim outlookApp as new Outlook.Application
Dim newContact as New Outlook.ContactItem
newContact = outlookApp.CreateItem(Outlook.OlItemType.olContactItem)
newContact.Display(True)

Outlook exits when its last window (explorer or inspector) closes even if there are outstanding references to its objects.
Try to keep a reference to an Outlook explorer (it does not have to be visible) if there isn't one open. Off the top of my head:
dim explorer as Outlook.Explorer
...
explorer = outlookApp.ActiveExplorer
If (explorer Is Nothing) Then
session = outlookApp.GetNamespace("MAPI")
session.Logon
folder = session.GetDefaultFolder(olFolderInbox)
explorer = folder.GetExplorer
End If

Related

Open a Mailbox then Maximize the Newly-Opened Mailbox Window

The title is pretty self-explanatory.
I want the macro to open a specific mailbox and then maximize that newly created explorer window so that the mailbox that was just opened is full-screen.
Here is the code I have so far:
Public Sub openMasterfiles()
' Define Variables
Dim olNS As Outlook.NameSpace
Dim myFolder As Outlook.MAPIFolder
' Set objects
Set olNS = GetNamespace("MAPI")
Set myFolder = olNS.Folders("Masterfiles").Folders("Inbox")
' Display the second mailbox
myFolder.Display
' ###Atttempting to set the new mailbox to the active explorer here
Set Application.ActiveExplorer.CurrentFolder = myFolder
' Attempting to maximize the newly opened mailbox here. This code _
only maximizes the exisiting explorer. Not the new one.
Application.ActiveWindow.WindowState = olMaximized
End Sub
All this manages to accomplish is to open the new mailbox ("Masterfiles") and maximize the prior Outlook window, not the newly opened one.
Thanks in advance!
First of all, to get the Inbox folder you need to use the NameSpace.GetDefaultFolder method which returns a Folder object that represents the default folder of the requested type for the current profile.
If you need to get the Inbox folder from an additional store you can use the Store.GetDefaultFolder method which returns a Folder object that represents the default folder in the store and that is of the type specified by the FolderType argument.
But the key thing here is that you need to use the Activate method of the Explorer class which activates an explorer window by bringing it to the foreground and setting keyboard focus.
' Display the second mailbox
myFolder.Display
Set Application.Explorers.Item(2).CurrentFolder = myFolder
Application.Explorers.Item(2).Activate
' Attempting to maximize the newly opened mailbox here. This code _
only maximizes the exisiting explorer. Not the new one.
Application.ActiveWindow.WindowState = olMaximized
You may also check whether it is a second explorer window checking the Explorers.Count property which returns an integer indicating the count of objects in the specified collection.
You can use Explorers.Add, which takes MAPIFolder as an argument:
set expl = Application.Explorers.Add(myFolder, olFolderDisplayNormal)
expl.Display
expl.WindowState = olMaximized

How I can run macro automatically with new email arrives in outlook

Am very new to VBScript and macro . I have a vbscript which will create tickets for email's but I need to run this script manually every time .To make it automation I have mapped my macro to the "run a script" script rule in Outlook but when the rule runs it is not fetching the data in the mail which is arrived .It's creating tickets with previous email always .
I have gone through so many VBscripts but none worked to convert the mail that received in to ticket.
If any one faced similar type of issue please let me know the complete solution.
Dim olApp As outlook.Application
Dim objNS As outlook.NameSpace
Dim objSourceFolder As outlook.MAPIFolder
Dim objDestFolder As outlook.MAPIFolder
Dim Msg As outlook.MailItem
Set olApp = outlook.Application
Set objNS = olApp.GetNamespace("MAPI")
Set objSourceFolder = objNS.GetDefaultFolder(olFolderInbox)
Set objDestFolder = objSourceFolder.Folders("Termination")
Set Msg = objDestFolder.Items.GetLast
Set sh = CreateObject("Shell.Application")
Set ie = CreateObject("InternetExplorer.Application")
LocationURL = "Ticket URL” & Msg.EntryID"
ie.Navigate (LocationURL)
ie.Visible = True
With ie.Document
.getElementById("details").Value = Msg.Body
.getElementById("short_description").Value = Msg.Subject
.getElementById("requester_login").Value = "premchand"
End With
When you run a macro from a rule it typically has an argument to which the item triggering the rule gets passed: you do not have to navigate through the Inbox to find the item.
Public Sub DoSomething(Item As Outlook.MailItem)
'code which acts on "Item"
End Sub
There are several ways for handling incoming emails:
The NewMailEx event of the Application class which is fired when a new item is received in the Inbox. This event is not available in Microsoft Visual Basic Scripting Edition (VBScript).
The ItemAdd event of the Items class is fired when one or more items are added to the specified collection. So, you can subscribe to the Inbox folder to see new items. Be aware, this event does not run when a large number of items are added to the folder at once. This event is not available in Microsoft Visual Basic Scripting Edition (VBScript).
Assign a macro VBA sub to the rule in Outlook. In that case the incoming mail item is passed as a parameter to the sub as Tim showed.

In Outlook 2013, can a macro open a new custom form?

In Outlook 2013 using Developer tab -> Design a Form, I created a custom form (with no mods yet) from the delivered Message form and placed it in my Personal Forms Library. Outlook tells me that the Message class is: IPM.Note.MyForm
I've created a macro and set up a new ribbon button to run the macro. I would like the macro to open a new instance of my custom form, but I can't get it working.
With the following code I can get the macro to open a new instance of the delivered Message Form:
Set newItem = Application.CreateItem(olMailItem)
newItem.Display
Set newItem = Nothing
I can't get it to open my custom form. I've tried the following as arguments to CreateItem: olMailItem.MyForm and IPM.Note.MyForm.
The macro editor intellisense has about 9 options for arguments to CreateItem, all of them appear to be delivered objects/forms, and it errors if one of these options aren't used.
I've done very little vba and office macros, is there some way to get this macro to open my custom form? Thanks.
See Items.Add http://msdn.microsoft.com/en-us/library/office/ff861028(v=office.15).aspx
Sub AddForm()
Dim myNamespace As outlook.NameSpace
Dim myItems As outlook.Items
Dim myFolder As outlook.Folder
Dim myItem As outlook.MailItem
Set myNamespace = Application.GetNamespace("MAPI")
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
Set myItems = myFolder.Items
Set myItem = myItems.Add("IPM.Note.MyForm")
End Sub

In outlook 2010, How do I trigger a macro when a new mail is recieved in a secondary mailbox?

I have two mailboxes on my Outlook Profile and I need to perform a script whenever a new mail is recieved on my secondary mailbox.
you could do this with a piece of VB that runs in the background of your outlook to monitor your folder. Then from in the VB-code you could probably do whatever you want to happen.
First rightclick your ribbon, 'custimize the ribbon'.
There choose commands from 'All Tabs' and make sure you add the Developer one from the 'Main Tabs' to your ribbon.
Afterwards in your ribbon Developer-tab you can click on 'Visual Basic'
There in the overview you can see a Microsoft Outlook Object called 'ThisOutlookSession'.
Here we can put some code that will load when you start your outlook.
We'll create something basic to monitor a folder for incomming messages & how to handle them
Option Explicit
Private WithEvents SecondaryInbox As Items
Private Sub Application_Startup()
Dim Ns As Outlook.NameSpace
Set Ns = Application.GetNamespace("MAPI")
Set SecondaryInbox = Ns.Folders("Name of Secondary Inbox").Folders("Inbox").Items
Set Ns = Nothing
End Sub
Public Sub SecondaryInbox_ItemAdd(ByVal Item As Object)
On Error Resume Next
' Do something on item add event..
If TypeName(Item) = "MailItem" Then
' ...
End If
End Sub

Call Outlook procedure using VBScript

I have a procedure in Outlook that sends all the saved messages in Drafts folder.
Below is the code:
Public Sub SendMail()
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olFolder As Outlook.MAPIFolder
Dim olDraft As Outlook.MAPIFolder
Dim strfoldername As String
Dim i As Integer
Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set olFolder = olNS.GetDefaultFolder(olFolderInbox)
strfoldername = olFolder.Parent
Set olDraft = olNS.Folders(strfoldername).Folders("Drafts")
If olDraft.Items.Count <> 0 Then
For i = olDraft.Items.Count To 1 Step -1
olDraft.Items.Item(i).Send
Next
End If
End Sub
Above code works fine.
Question:
I want to use Task Scheduler to fire this procedure as a specified time.
1. Where will I put the procedure in Outlook, Module or ThisOutlookSession?
2. I am not good in vbscript so I also don't know how to code it to call the Outlook Procedure. I've done calling Excel Procedure but Outlook doesn't support .Run property.
So this doesn't work:
Dim olApp
Set olApp = CreateObject("Outlook.Application")
olApp.Run "ProcedureName"
Set olApp = Nothing
I've also read about the Session.Logon like this:
Dim olApp
Set olApp = CreateObject("Outlook.Application")
olApp.Session.Logon
olApp.ProcedureName
Set olApp = Nothing
But it throws up error saying object ProcedureName is not supported.
Hope somebody can shed some light.
SOLUTION:
Ok, I've figured out 2 work around to Avoid or get pass this pop-up.
1st one: is as KazJaw Pointed out.
Assuming you have another program (eg. Excel, VBScript) which includes sending of mail via Outlook in the procedure.
Instead of using .Send, just .Save the mail.
It will be saved in the Outlook's Draft folder.
Then using below code, send the draft which fires using Outlook Task Reminder.
Option Explicit
Private WithEvents my_reminder As Outlook.Reminders
Private Sub Application_Reminder(ByVal Item As Object)
Dim myitem As TaskItem
If Item.Class = olTask Then 'This works the same as the next line but i prefer it since it automatically provides you the different item classes.
'If TypeName(Item) = "TaskItem" Then
Set my_reminder = Outlook.Reminders
Set myitem = Item
If myitem.Subject = "Send Draft" Then
Call SendMail
End If
End If
End Sub
Private Sub my_reminder_BeforeReminderShow(Cancel As Boolean)
Cancel = True
Set my_reminder = Nothing
End Sub
Above code fires when Task Reminder shows with a subject "Send Draft".
But, we don't want it showing since the whole point is just to call the SendMail procedure.
So we added a procedure that Cancels the display of reminder which is of olTask class or TaskItem Type.
This requires that Outlook is running of course.
You can keep it running 24 hours as i did or, create a VBscript that opens it to be scheduled via Task Scheduler.
2nd one: is to use API to programatically click on Allow button when the security pop-up appears.
Credits to SiddarthRout for the help.
Here is the LINK which will help you programmatically click on the Allow button.
Of course you have to tweak it a bit.
Tried & Tested!
Assuming that you have Outlook Application always running (according to comment below your question) you can do what you need in the following steps:
add a new task in Outlook, set subject to: "run macro YourMacroName" and set time (plus cycles) when your macro should start.
go to VBA Editor, open ThisOutlookSession module and add the following code inside (plus see the comments inside the code):
Private Sub Application_Reminder(ByVal Item As Object)
If TypeName(Item) = "TaskItem" Then
Dim myItem As TaskItem
Set myItem = Item
If myItem.Subject = "run macro YourMacroName" Then
Call YourMacroName '...your macro name here
End If
End If
End Sub
Where will I put the procedure in Outlook, Module or ThisOutlookSession?
Neither. Paste the below code in a Text File and save it as a .VBS file. Then call this VBS file from the Task Scheduler as shown HERE
Dim olApp, olNS, olFolder, olDraft, strfoldername, i
Set olApp = GetObject(, "Outlook.Application")
Set olNS = olApp.GetNamespace("MAPI")
Set olFolder = olNS.GetDefaultFolder(6)
strfoldername = olFolder.Parent
Set olDraft = olNS.Folders(strfoldername).Folders("Drafts")
If olDraft.Items.Count <> 0 Then
For i = olDraft.Items.Count To 1 Step -1
olDraft.Items.Item(i).Send
Next
End If
If you are using Outlook 2007 or newer I have found you can easily eliminate the security pop up you mentioned above when running your script by doing the following:
In Outlook 2007 Trust Center, go to Macro Security - Select "No security Check for macros"
In Outlook 2007 Trust Center, go to Programatic Access - Select "Never warn me abous suspicious activity.
Of course that technically leaves you open to the remote possibility for someone to email you some malicious email script or something of that nature I assume. I trust my company has that managed though and this works for me. I can use VBS scripts in Outlook, Access, Excel to send emails with no security pop up.
Another Option:
If you don't want to do that, another option that has worked well for me prior to this is here:
http://www.dimastr.com/redemption/objects.htm
Basically a dll redirect that does not include the popup. It leaves your other default security in place and you write \ call your VBA for it and send mail without the secutity pop-ups.