Send Confirmation (for external emails)

  • Thread starter Thread starter Mike
  • Start date Start date
M

Mike

Hi,

My boss asked me to come up with a way that users would see a prompt when
they send an email (to absolutely confirm they want to send it, to ensure it
has the correct content and is addressed correctly).

After some searching around, I found some code which will do this (which is
shown below).

The code makes the prompt appear for all messages, but thinking about this
some more (and do not annoy everyone), would it be possible to only have the
prompt appear when email someone from outside our organisation?

Doing a clever lookup in VB to check against users in the GAL might be a bit
tricky, so I was thinking a simply list of internal staff in the code(we only
have 60 so it's not a headache to keep this list updated). The code would
check if only internal people were in either the to, cc or bcc fields then it
wouldn't show the prompt. If one person who wasn't on the list appeared (i.e.
it was being sent to someone outside) then the prompt would show.

Is this possible? and if so, how? My VB skills are poor to say the least.
The code is below if anyone care to offer advice on how I can add the list
and have it check upon sending?!?

Many thanks

[CODE STARTS BELOW]

Option Explicit
Dim WithEvents objInspectors As Inspectors
Dim WithEvents objMyNewMail As MailItem

Private Sub Application_Startup()
Set objInspectors = Application.Inspectors
End Sub

Private Sub Application_Quit()
Set objInspectors = Nothing
Set objMyNewMail = Nothing
End Sub

Private Sub objInspectors_NewInspector(ByVal Inspector As Inspector)
If Inspector.CurrentItem.Class <> olMail Then Exit Sub
Set objMyNewMail = Inspector.CurrentItem
End Sub

Private Sub objMyNewMail_Send(Cancel As Boolean)
If MsgBox("Are you sure you want to send this message?", vbYesNo +
vbQuestion _
, "Send Confirmation") = vbNo Then
Cancel = True
End If
End Sub

[CODE FINISHES HERE]
 
If you use Exchange, iterate the Recipients collection for the message you want to send. For any recipient, if Recipient.AddressEntry.Type is "SMTP" and not "EX" then you know it's going outside the Exchange server.

Instead of using MailItem.Send, why not simplify matters considerably and use the Application.ItemSend event?
 
Sue,

Thanks for your quick reply. We are using Exchange 2003 and Outlook 2003.
Unfortunately I have no idea how to iterate the recipients collection, or
even what that means.

Also, using the Application.ItemSend instead of MailItme.Send sounds
plausable but again I'm not sure why I would do this. What are the advantages?

The code in my original post works, everytime. I got it from searching for a
solution and found a forum with this code posted previously by someone. I
tried it and it works fine. I'm not a programmer, nor do I know anything
about VBA. Nothing in the slightest actually.

I appreciate you are a programmer and have offered your advice for free, for
which I'm very grateful. However, I need to find someone willing to amend the
code as I don't have the knowledge to be able to do it myself.

Is there anyone out there willing to program for free?!

Many thanks

Michael


Sue Mosher said:
If you use Exchange, iterate the Recipients collection for the message you want to send. For any recipient, if Recipient.AddressEntry.Type is "SMTP" and not "EX" then you know it's going outside the Exchange server.

Instead of using MailItem.Send, why not simplify matters considerably and use the Application.ItemSend event?
--
Sue Mosher, Outlook MVP
Author of Microsoft Outlook 2007 Programming:
Jumpstart for Power Users and Administrators
http://www.outlookcode.com/article.aspx?id=54


Mike said:
Hi,

My boss asked me to come up with a way that users would see a prompt when
they send an email (to absolutely confirm they want to send it, to ensure it
has the correct content and is addressed correctly).

After some searching around, I found some code which will do this (which is
shown below).

The code makes the prompt appear for all messages, but thinking about this
some more (and do not annoy everyone), would it be possible to only have the
prompt appear when email someone from outside our organisation?

Doing a clever lookup in VB to check against users in the GAL might be a bit
tricky, so I was thinking a simply list of internal staff in the code(we only
have 60 so it's not a headache to keep this list updated). The code would
check if only internal people were in either the to, cc or bcc fields then it
wouldn't show the prompt. If one person who wasn't on the list appeared (i.e.
it was being sent to someone outside) then the prompt would show.

Is this possible? and if so, how? My VB skills are poor to say the least.
The code is below if anyone care to offer advice on how I can add the list
and have it check upon sending?!?

Many thanks

[CODE STARTS BELOW]

Option Explicit
Dim WithEvents objInspectors As Inspectors
Dim WithEvents objMyNewMail As MailItem

Private Sub Application_Startup()
Set objInspectors = Application.Inspectors
End Sub

Private Sub Application_Quit()
Set objInspectors = Nothing
Set objMyNewMail = Nothing
End Sub

Private Sub objInspectors_NewInspector(ByVal Inspector As Inspector)
If Inspector.CurrentItem.Class <> olMail Then Exit Sub
Set objMyNewMail = Inspector.CurrentItem
End Sub

Private Sub objMyNewMail_Send(Cancel As Boolean)
If MsgBox("Are you sure you want to send this message?", vbYesNo +
vbQuestion _
, "Send Confirmation") = vbNo Then
Cancel = True
End If
End Sub

[CODE FINISHES HERE]
 
The advantage of using Application.ItemSend is that it fires for every outgoing item. The technique that your original code uses cannot handle the scenario where the user has more than one new message open at the same time.

To iterate means to loop through, as in this example:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim objMyNewMail As Outlook.mailItem
Dim objRecip As Outlook.Recipient
Dim blnIsExternal As Boolean
If Item.Class = olMail Then
Set objMyNewMail = Item
For Each objRecip In objMyNewMail.Recipients
If UCase(objRecip.AddressEntry.Type) = "SMTP" Then
blnIsExternal = True
Exit For
End If
Next
If blnIsExternal Then
' this is where your code to prompt the user goes
If MsgBox("Are you sure you want to send this message?", _
vbYesNo + vbQuestion, _
, "Send Confirmation") = vbNo Then
Cancel = True
End If
End If
End If
Set objMyNewMail = Nothing
Set objRecip = Nothing
End Sub

--
Sue Mosher, Outlook MVP
Author of Microsoft Outlook 2007 Programming:
Jumpstart for Power Users and Administrators
http://www.outlookcode.com/article.aspx?id=54


Mike said:
Sue,

Thanks for your quick reply. We are using Exchange 2003 and Outlook 2003.
Unfortunately I have no idea how to iterate the recipients collection, or
even what that means.

Also, using the Application.ItemSend instead of MailItme.Send sounds
plausable but again I'm not sure why I would do this. What are the advantages?

The code in my original post works, everytime. I got it from searching for a
solution and found a forum with this code posted previously by someone. I
tried it and it works fine. I'm not a programmer, nor do I know anything
about VBA. Nothing in the slightest actually.

I appreciate you are a programmer and have offered your advice for free, for
which I'm very grateful. However, I need to find someone willing to amend the
code as I don't have the knowledge to be able to do it myself.

Is there anyone out there willing to program for free?!

Many thanks

Michael


Sue Mosher said:
If you use Exchange, iterate the Recipients collection for the message you want to send. For any recipient, if Recipient.AddressEntry.Type is "SMTP" and not "EX" then you know it's going outside the Exchange server.

Instead of using MailItem.Send, why not simplify matters considerably and use the Application.ItemSend event?
--
Sue Mosher, Outlook MVP
Author of Microsoft Outlook 2007 Programming:
Jumpstart for Power Users and Administrators
http://www.outlookcode.com/article.aspx?id=54


Mike said:
Hi,

My boss asked me to come up with a way that users would see a prompt when
they send an email (to absolutely confirm they want to send it, to ensure it
has the correct content and is addressed correctly).

After some searching around, I found some code which will do this (which is
shown below).

The code makes the prompt appear for all messages, but thinking about this
some more (and do not annoy everyone), would it be possible to only have the
prompt appear when email someone from outside our organisation?

Doing a clever lookup in VB to check against users in the GAL might be a bit
tricky, so I was thinking a simply list of internal staff in the code(we only
have 60 so it's not a headache to keep this list updated). The code would
check if only internal people were in either the to, cc or bcc fields then it
wouldn't show the prompt. If one person who wasn't on the list appeared (i.e.
it was being sent to someone outside) then the prompt would show.

Is this possible? and if so, how? My VB skills are poor to say the least.
The code is below if anyone care to offer advice on how I can add the list
and have it check upon sending?!?

Many thanks

[CODE STARTS BELOW]

Option Explicit
Dim WithEvents objInspectors As Inspectors
Dim WithEvents objMyNewMail As MailItem

Private Sub Application_Startup()
Set objInspectors = Application.Inspectors
End Sub

Private Sub Application_Quit()
Set objInspectors = Nothing
Set objMyNewMail = Nothing
End Sub

Private Sub objInspectors_NewInspector(ByVal Inspector As Inspector)
If Inspector.CurrentItem.Class <> olMail Then Exit Sub
Set objMyNewMail = Inspector.CurrentItem
End Sub

Private Sub objMyNewMail_Send(Cancel As Boolean)
If MsgBox("Are you sure you want to send this message?", vbYesNo +
vbQuestion _
, "Send Confirmation") = vbNo Then
Cancel = True
End If
End Sub

[CODE FINISHES HERE]
 
Back
Top