Never Again Forget to Add that Attachment to your Outlook Email

AID: 2964
  • Status: Published

18100 points

  • ByBlueDevilFan
  • TypeTips/Tricks
  • Posted on2010-04-25 at 10:42:42
Awards
  • Community Pick
  • Experts Exchange Approved
  • Editor's Choice
Issue.  Have you ever sent an email and forgotten to add the attachment?  How embarrassing!!!!  Here's a short Outlook macro to make sure this never happens again.

As I’ve gotten older I’ve noticed that my memory and attention to detail have both gotten worse.  One sign of this is the number of times I’ve sent a message that is supposed to include an attachment only to realize after I clicked "Send" that I forgot to add the attachment.  

If I catch the error, then I quickly send another message with the attachment and a note saying something like, "I guess it’d be handy if I included the attachment."  Sometimes I don’t notice that I forgot the attachment until I get a message from one of the recipients pointing out that I forgot to include it.  It’s not just me either.  I get several messages a month where the sender forgot to include an attachment.  

How do I know that a message should have included an attachment?  Because the message body typically mentions one.  Something like "the attached file", "the attachment", "the enclosed item", etc.  Wouldn’t it be great if Outlook could detect keywords like "attached", "attachment", "enclosed", or "enclosure" in the body of a message and then check to see if there are any attachments?  If there aren’t, then I’d like Outlook to warn me that I may have forgotten to add an attachment.  A feature like this would save me (and perhaps, you) a lot of embarrassment.

Background.  At least through the 2010 version Outlook does not have this ability.

Solution.  Once again Microsoft’s decision to make Outlook extensible via VBA (Visual Basic for Applications) offers us a simple solution.  This is one of the prime reasons I love Outlook.  With a few lines of VBA code you can make Outlook do almost anything you want it to.  In this case it takes about 30 lines of code to add the ability to check a message for keywords and take action based on the results.  

This solution works by trapping Outlook’s ItemSend event.  This event fires each time an item is sent.  The code then searches the body of the message for any of the keywords suggesting that the message should include an attachment.  If any of those keywords are found, then the code checks to see if there are any attachments.  If at least one attachment is found, then the message is sent.  However, if the code doesn’t find at least one attachment, then it displays a dialog-box warning you that you may have forgotten to add the attachment.  The dialog-box offers you the chance to cancel the send so you can add the missing attachment.

Requirements.  Outlook 2000 through 2010.  I've included two different versions, one for Outlook versions 2000 - 2003, and another for Outlook 2007 - 2010.  The reason for this is that Outlook 2007 and later includes features that make the code more useful.  

Instructions.
1

Add the Code to Outlook


Outlook 2000 - 2003.
   1.  Start Outlook.
   2.  Click Tools > Macro > Visual Basic Editor.
   3.  If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession.
   4.  Copy the code below and paste it into the right-hand pane of Outlook's VB Editor window.
   5.  Edit the code as needed.  I included comment lines wherever something needs to or can change.
   6.  Click the diskette icon on the toolbar to save the changes.
   7.  Close the VB Editor.
   8.  Click Tools > Macro > Security.
   9.  Set the "Security Level" to Medium.
  10. Close Outlook
  11. Start Outlook
  12. Outlook will display a dialog-box warning that ThisOutlookSession contains macros
        and asking if you want to allow them to run.  Click Yes.

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    'On the next line edit the list of keywords as desired.  Be sure to separate each word with a | character.'
    Const KEYWORDS = "attached|attachment|attachments|enclosed|enclosure"
    'On the next line edit the message that will be displayed when the message should include an attachment as desired.'
    Const WARNING_MSG = "Wording in the message suggests that something is attached, but there are no items attached.  Do you want to cancel the send and add an attachment?"
    'On the next line edit the dialog-box title as desired.'
    Const MSG_TITLE = "Attachment Checker"
    Dim objRegEx As Object, colMatches As Object, bolAttachment As Boolean, olkAttachment As Outlook.Attachment
    Set objRegEx = CreateObject("VBscript.RegExp")
    With objRegEx
        .IgnoreCase = True
        .Pattern = KEYWORDS
        .Global = True
    End With
    Set colMatches = objRegEx.Execute(Item.Body)
    If colMatches.count > 0 Then
        For Each olkAttachment In Item.Attachments
            If olkAttachment.Type <> olEmbeddeditem Then
                bolAttachment = True
                Exit For
            End If
        Next
        If Not bolAttachment Then
            If msgbox(WARNING_MSG, vbQuestion + vbYesNo, MSG_TITLE) = vbYes Then
                Cancel = True
            End If
        End If
    End If
    Set olkAttachment = Nothing
    Set colMatches = Nothing
    Set objRegEx = Nothing
End Sub
                                    
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:

Select allOpen in new window




Outlook 2007 - 2010.
   1.  Start Outlook.
   2.  Click Tools > Macro > Visual Basic Editor.
   3.  If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession.
   4.  Copy the code below and paste it into the right-hand pane of Outlook's VB Editor window.
   5.  Edit the code as needed.  I included comment lines wherever something needs to or can change.
   6.  Click the diskette icon on the toolbar to save the changes.
   7.  Close the VB Editor.
   8.  Click Tools > Trust Center.
   9.  Click Macro Security.
  10. Set "Macro Security" to Warnings for all macros.
  11. Click OK.
  12. Close Outlook
  13. Start Outlook.  Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run.  Click Yes.

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    'On the next line edit the list of keywords as desired.  Be sure to separate each word with a | character.'
    Const KEYWORDS = "attached|attachment|attachments|enclosed|enclosure"
    'On the next line edit the message that will be displayed when the message should include an attachment as desired.'
    Const WARNING_MSG = "Wording in the message suggests that something is attached, but there are no items attached.  Do you want to cancel the send and add an attachment?"
    'On the next line edit the dialog-box title as desired.'
    Const MSG_TITLE = "Attachment Checker"
    Dim objRegEx As Object, colMatches As Object, bolAttachment As Boolean, olkAttachment As Outlook.Attachment
    Set objRegEx = CreateObject("VBscript.RegExp")
    With objRegEx
        .IgnoreCase = True
        .Pattern = KEYWORDS
        .Global = True
    End With
    Set colMatches = objRegEx.Execute(Item.Body)
    If colMatches.count > 0 Then
        For Each olkAttachment In Item.Attachments
            If Not IsEmbedded(olkAttachment) Then
                bolAttachment = True
                Exit For
            End If
        Next
        If Not bolAttachment Then
            If msgbox(WARNING_MSG, vbQuestion + vbYesNo, MSG_TITLE) = vbYes Then
                Cancel = True
            End If
        End If
    End If
    Set olkAttachment = Nothing
    Set colMatches = Nothing
    Set objRegEx = Nothing
End Sub

Function IsEmbedded(olkAttachment As Outlook.Attachment) As Boolean
    'Purpose: Determines if an attachment is embedded.'
    'Written: 9/14/2009'
    'Author: BlueDevilFan'
    'Outlook: 2007'
    Dim olkPA As Outlook.PropertyAccessor
    Set olkPA = olkAttachment.PropertyAccessor
    On Error Resume Next
    IsEmbedded = (olkPA.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E") <> "")
    On Error GoTo 0
    Set olkPA = Nothing
End Function
                                    
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:

Select allOpen in new window




2

Test the Solution


Create a test message.  The message should include one of the keywords.  Make sure that you don’t add an attachment.  Click Send.  Outlook should display a pop-up message that looks something like this.  If you click Yes, then Outlook will abort the send giving you the opportunity to add the missing attachment.  Clicking No sends the message on its way immediately.

Attachment-Checker-Message.jpg
  • 17 KB
  • Outlook Attachment Checker Warning Message
Outlook Attachment Checker Warning Message



Enhancements.  You can expand the list of keywords that suggests the item should include an attachment by editing line #3 of the code.  Right now the code searches for the words "attached", "attachment", "attachments", "enclosed", or "enclosure".  For example, say that you routinely email .zip files with a message like "Your report is in the ZIP file."  Adding the word "ZIP" to the list of keywords would help ensure that you don't send one of these messages without the required file.
    Asked On
    2010-04-25 at 10:42:42ID2964
    Tags

    outlook

    ,

    attachment

    ,

    vba

    ,

    script

    ,

    macro

    Topic

    Outlook Groupware Software

    Views
    7905

    Comments

    Expert Comment

    by: DanRollins on 2010-04-25 at 18:57:23ID: 13826

    Clever Idea!  Got my Yes vote!

    Expert Comment

    by: a_painter on 2010-04-26 at 01:30:01ID: 13832

    A very helpful and useful little bit of code. Got my Yes vote!

    Expert Comment

    by: matthewspatrick on 2010-04-26 at 07:46:43ID: 13846

    BDF,

    I still use a variant of this that you provided for me almost 4 years ago in http://www.experts-exchange.com/Software/Office_Productivity/Groupware/Outlook/Q_21925928.html :)

    I like how you used RegExp instead of the previous approach of making an array of keywords, and searching for each keyword in turn.

    My current Item_Send routine incorporates this as well as the blank subject line prevention you also wrote about:

    Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
        
        ' This sub will scan a mail message before it's sent, looking for a list of words that
        ' indicate you mean to include an attachment.  If it finds any of the words, it then
        ' looks to see if the message has an attachment.  If there is no attachment, you get a
        ' warning message, and a chance to prevent sending the message.
        
        ' Also checks for blank subject field
        
        Dim arrWords As Variant, _
            strWord As Variant, _
            intResponse As Integer, _
            lngSigStart As Long, _
            lngWordStart As Long
        
        ' This is the list of words that the sub will look for.  Use words that suggest the message
        ' probably should have an attachment
    
        arrWords = Array("enclosed", "attach", "attached", "attachment")
    
        ' This part looks for a line in my signature; the idea is that the sub will ignore "attachment"
        ' words that come after it, as these words most likely come from previous messages in the thread
        ' and do not pertain to the current message
        
        lngSigStart = InStr(1, Item.Body, "Patrick G. Matthews, Project Manager", _
            vbTextCompare)
        If lngSigStart = 0 Then lngSigStart = 1000000
    
        ' Item is the object about to be sent; see if it is a mail message, task request, or
        ' meeting request
    
        Select Case Item.Class
            Case olMail
                
                If Item.Sent = False Then
        
                    ' Loop through array of words and look for each in turn
    
                    For Each strWord In arrWords
    
                        ' Look for the word; if found InStr > 0
    
                        lngWordStart = InStr(1, LCase(Item.Body), strWord)
                        If lngWordStart > 0 And lngWordStart < lngSigStart Then
        
                            ' If the word is found, check for attachments.  If there are none,
                            ' show the warning
        
                            If Item.Attachments.Count = 0 Then
                                intResponse = MsgBox("Did you forget to attach something?  I " & _
                                    "found the word '" & strWord & "'" & Chr(10) & "in your " & _
                                    "message, but there is no attachment." & Chr(10) & Chr(10) & _
                                    "Click Yes to stop the mail and add an attachment.", _
                                    vbYesNo + vbExclamation, "Attachment Check")
        
                                ' If user clicks yes, cancel the send
        
                                If intResponse = vbYes Then
                                    Cancel = True
                                    Exit Sub
                                End If
                            End If
                            Exit For
                        End If
                    Next
                    
                    ' Check for blank subject
                    If Trim(Item.Subject) = "" Then
                        intResponse = MsgBox("You did not put in a subject.  Send anyway?", _
                            vbInformation + vbYesNo, "Subject Check")
                        If intResponse <> vbYes Then Cancel = True
                    End If
                End If
        End Select
    End Sub
                                            
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    22:
    23:
    24:
    25:
    26:
    27:
    28:
    29:
    30:
    31:
    32:
    33:
    34:
    35:
    36:
    37:
    38:
    39:
    40:
    41:
    42:
    43:
    44:
    45:
    46:
    47:
    48:
    49:
    50:
    51:
    52:
    53:
    54:
    55:
    56:
    57:
    58:
    59:
    60:
    61:
    62:
    63:
    64:
    65:
    66:
    67:
    68:
    69:
    70:
    71:
    72:
    73:
    74:
    75:
    

    Select allOpen in new window



    I guess the only substantial difference is that I put in that extra check to make sure that the keyword did not appear below a line from my signature; I wanted to prevent false positives when a, earlier, copied message contained the keyword, but the "current" message did not.

    Great work, and voted yes above.

    Cheers,

    Patrick

    Expert Comment

    by: DanRollins on 2010-04-26 at 16:06:50ID: 13853

    Nice addition.  One might be able to "generic-ize" it by matching the start of a previous email (eg: "From:" or "To:")

    Expert Comment

    by: brettdj on 2010-04-26 at 16:46:11ID: 13854

    Another useful article - thx.

    Dave

    Author Comment

    by: BlueDevilFan on 2010-04-26 at 18:16:04ID: 13855

    Thanks, guys.

    Good suggestion, Patrick!  If you don't mind me using your code, then I'll modify the article code so the check is limited to the current message.

    Expert Comment

    by: matthewspatrick on 2010-04-26 at 18:35:02ID: 13856

    BDF,

    Go ahead, please do :)

    Patrick

    Expert Comment

    by: moh10ly on 2010-04-27 at 01:45:56ID: 13862

    That is terrific, However does this code applies to Microsoft Outlook 2010 ?

    Author Comment

    by: BlueDevilFan on 2010-04-27 at 03:18:06ID: 13866

    Hi, moh10ly.

    I've not loaded Outlook 2010 yet, so I can't say.  From what I know about 2010 I believe it should work, but I can't say that for certain.

    Expert Comment

    by: a_painter on 2010-04-27 at 04:03:43ID: 13867

    It works fine in Outlook 2010.

    I have it running here using 2010 Beta.

    Expert Comment

    by: Deon-YCG on 2010-06-21 at 11:06:29ID: 15968

    Have tested this in Outlook 2010 32bit, forget 64bit version too many isses.

    Although finding some of the areas indicated are different I was able to reproduce this in Outlook 2010 - and unfortunately it does not work. The mail with the keywords is sent without any popups

    I am running the retail version.

    Author Comment

    by: BlueDevilFan on 2010-06-21 at 12:17:12ID: 15972

    Hi, Deon-YCG.

    Are macros enabled?

    Expert Comment

    by: DrDamnit on 2010-07-06 at 23:19:11ID: 16687

    Does this work in Outlook 2010?

    Author Comment

    by: BlueDevilFan on 2010-07-07 at 02:13:28ID: 16692

    It should.  I haven't loaded 2010 yet so I haven't tested this with that version.

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 02:44:51ID: 16694

    Hi Bluedevil

    Yes I have enables macros

    I have never done any macro or vb work. In VB I don't get the numers along the side like you have in your code.

    Author Comment

    by: BlueDevilFan on 2010-07-07 at 02:50:00ID: 16695

    The numbers are added by EE's web site.  They never appear in the VB editor.  Do any macros work for you in Outlook?

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 02:58:52ID: 16696

    I have never run any macros in Outlook

    Author Comment

    by: BlueDevilFan on 2010-07-07 at 03:10:35ID: 16697

    We need to determine if macros aren't working at all or if it's just this macro that's not working.  Add the code below and then try running it.  Let me know what happens.
    Sub Testing()
        MsgBox "Macros are working."
    End Sub
    
                                            
    1:
    2:
    3:
    

    Select allOpen in new window

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 03:23:53ID: 16698

    I have added this above and below the original code and on it's own with no mssg popup

    Author Comment

    by: BlueDevilFan on 2010-07-07 at 03:29:16ID: 16699

    How did you run the test and what happened other than the message didn't pop up?  Were there any error/warning messages?

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 03:32:55ID: 16700

    I added it to the top of the original code here. Tested - nothing
    Then added to the bottom. tested - nothing
    Then added it on top and at the end and recieved error: Compile error. Ambiguous name detected: Testing.

    I know this might be frustrasting for you with me with no knowledge of using macros. My apologies

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 03:35:57ID: 16701

    When I put just this code in, run sub in the menu I get the popup

    Author Comment

    by: BlueDevilFan on 2010-07-07 at 03:37:02ID: 16702

    No problem.  Adding the code doesn't run it.  How did you run the macro?

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 03:42:08ID: 16703

    Menus, run, run sub/user form  in the VB page

    Author Comment

    by: BlueDevilFan on 2010-07-07 at 03:44:08ID: 16704

    Good.  That proves that macros are working.  It's apparently just the article macro that's not working.  I need to get 2010 loaded so I can test this and see what's happening.  I'll do that as soon as I can and get back to you.

    Expert Comment

    by: Deon-YCG on 2010-07-07 at 03:46:03ID: 16705

    Cool. thanks for you patience and assistance

    Expert Comment

    by: it-chic on 2010-10-23 at 16:39:15ID: 20730

    The script works great with the one exception that the MsgBox does not appear on top of message in my Outlook 2003 (works fine in 2007 version).  How can VB script or Outlook options be changed to force MSG on top of Word editor, rather than behind it?  It looks like system is locked up when I send test message until I realized the Error Dialog box was just shown behind current outlook email edit window.

    Author Comment

    by: BlueDevilFan on 2010-10-23 at 18:25:35ID: 20731

    I don't have access to a box with Outlook 2003 on it at the moment.  Try changing line #24 to

            If msgbox(WARNING_MSG, vbQuestion + vbYesNo + vbApplicationModal, MSG_TITLE) = vbYes Then

    Expert Comment

    by: Deon-YCG on 2010-10-24 at 23:06:22ID: 20753

    Hi Bluedevil

    Have you had any luck with this in Outlook 2010?

    Thanks

    Author Comment

    by: BlueDevilFan on 2010-10-25 at 04:46:26ID: 20764

    Hi, Deon-YCG.

    I haven't had a chance to test it on 2010 yet, but it should work.  Are you saying that you have tried it on 2010 and it doesn't work?

    Expert Comment

    by: Deon-YCG on 2010-10-25 at 05:13:51ID: 20766

    Hi

    Yes I am running Outlook 2010 and still unable to get it to run. Maybe 1 day I'll be lucky

    Author Comment

    by: BlueDevilFan on 2010-10-25 at 05:43:38ID: 20771

    Are macros enabled?

    Expert Comment

    by: Deon-YCG on 2010-10-25 at 05:49:14ID: 20773

    Hi

    Yes, if you look in this thread you will see where we tested macros previously

    Author Comment

    by: BlueDevilFan on 2010-10-25 at 06:08:32ID: 20776

    Sorry, didn't notice that this was the continuation of a previous conversation.

    Expert Comment

    by: it-chic on 2010-10-25 at 06:33:36ID: 20777

    BlueDevilFan:

    To get MsgBox to front, I had to change line 24 to following:
    If MsgBox(WARNING_MSG, vbQuestion + vbYesNo + vbMsgBoxSetForeground, MSG_TITLE) = vbYes Then

    Thanks for your help!

    Author Comment

    by: BlueDevilFan on 2010-10-25 at 06:37:24ID: 20778

    Cool.  Glad you have a solution.

    Expert Comment

    by: Mamtha1982 on 2011-02-07 at 21:16:54ID: 23636

    Just tested in Outlook 2010, running pefectly.

    Thanks

    Author Comment

    by: BlueDevilFan on 2011-02-08 at 02:14:13ID: 23639

    Great!  Thanks for sharing that.

    Expert Comment

    by: SuraDalbin on 2012-01-19 at 11:09:39ID: 34644

    Hi BlueDevilFan,

    I've been trying to implement this in Office 2007, but for some reason it's not working entirely.  I'm using matthewspatrick code version above, but the only portion that works is the "empty subject line", so I know the code works partially.  The outlook version is running the Outlook 12.0 Object library.

    Any thoughts as to what I could do to make this work would be greatly appreciated.

    Thanks,


    Sura

    Author Comment

    by: BlueDevilFan on 2012-01-20 at 03:03:28ID: 34647

    Hi, Sura.

    Are you familiar with VBA's debugger?  If so, then set a breakpoint on line 19 of Patrick's code, then send a test message containing one of the triggering keywords.  When the code gets to line 19 it will pause and open the debugger.  You can then step through the code and see what's happening.

    Expert Comment

    by: SuraDalbin on 2012-01-24 at 00:03:40ID: 34757

    Hi BDF,

    I apologize about the delayed response. I believe i found the solution to the problem. The code was in fact working correctly, the problem was that my signature includes an image, so if i'm not mistaken, that image counts as an attachment.  I tested the same code without my html signature and it outlook did prompt me to if i wished to send without attachment.

    How can we get around this? Because of company policy, i must have that image in my signature.

    Thanks for your help.


    Sura

    Author Comment

    by: BlueDevilFan on 2012-01-24 at 02:43:50ID: 34759

    How about switching from Patrick's code to my code, which tests for embedded images, and I'll show you how to add the blank subject check to it?

    Expert Comment

    by: SuraDalbin on 2012-02-08 at 15:37:21ID: 42337

    Hi BDF,

    It's that time of the year for me at the office, so I apologize once again for the delay.  I have switched to your original code, but for some reason it's not prompting me if I've forgotten an attachment, even though I have one or more of the triggering words in my message.  Please help.

    Thanks,

    Sura

    Expert Comment

    by: SuraDalbin on 2012-02-08 at 16:03:27ID: 42338

    UPDATE:

    The code does work if I remove my signature, which contains the company logo.  So, I think the issue, if I may say humbly, is that the code should be able to ignore the image(s) embedded in the body of the e-mail and scan for attachments to the e-mail itself.  I'm just not sure how to say this in vba.

    Thanks for your help :-).

    Author Comment

    by: BlueDevilFan on 2012-02-09 at 06:24:44ID: 42415

    @SuraDalbin,

    I just updated the code.  Download the version for Outlook 2007 - 2010 and replace the version you have now.  Test again and let me know what happens.

    Expert Comment

    by: JDettman on 2012-02-14 at 14:25:03ID: 42953

    Wanted to thank you  guys so much for this.  I've merged the ideas from BlueDevilFan and matthewspatrick together.

    However rather then searching for a signature, I look for the string "From: " in the body text.  I also used Len(Item.Body) rather then a constant of 1000000.

    So far it's working well!

    Jim.

    Author Comment

    by: BlueDevilFan on 2012-02-14 at 18:36:35ID: 42974

    Good deal.  Thanks for sharing, Jim.

    Expert Comment

    by: SuraDalbin on 2012-05-04 at 09:12:36ID: 52426

    BlueDevilFan,

    I must apologize for the extremely dealyed response.  I was having a strange problem in viewing this article, I would see a message that read that the article was pending approval.

    Anyway, I wan to thank you for taking the time and addressing this issue.  Yes, the code now works like a charm.  Also, because of ownership changes in our firm, our e-mail signature changed as well, and we now have more than 1 attachment in it, but the code works with this as well.

    Thanks a million,


    Sura

    Author Comment

    by: BlueDevilFan on 2012-05-04 at 10:45:29ID: 52427

    Thanks for the feedback, Sura. Glad you like the solution.

    Add your Comment

    Please Sign up or Log in to comment on this article.

    Join Experts Exchange Today

    Gain Access to all our Tech Resources

    Get personalized answers

    Ask unlimited questions

    Access Proven Solutions

    Search 3.2 million solutions

    Read In-Depth How-To Guides

    1000+ articles, demos, & tips

    Watch Step by Step Tutorials

    Learn direct from top tech pros

    And Much More!

    Your complete tech resource

    See Plans and Pricing

    30-day free trial. Register in 60 seconds.

    Loading Advertisement...

    Top Outlook Experts

    1. apache09

      663,644

      Sage

      2,168 points yesterday

      Profile
      Rank: Genius
    2. alanhardisty

      170,946

      Guru

      0 points yesterday

      Profile
      Rank: Genius
    3. demazter

      131,854

      Master

      0 points yesterday

      Profile
      Rank: Genius
    4. chris_bottomley

      109,375

      Master

      2,800 points yesterday

      Profile
      Rank: Genius
    5. thinkpads_user

      95,624

      Master

      750 points yesterday

      Profile
      Rank: Genius
    6. Rajkumar-MCITP

      89,780

      Master

      0 points yesterday

      Profile
      Rank: Guru
    7. l33tf0b

      83,091

      Master

      0 points yesterday

      Profile
      Rank: Wizard
    8. BlueDevilFan

      73,191

      Master

      50 points yesterday

      Profile
      Rank: Savant
    9. jjmck

      66,336

      Master

      0 points yesterday

      Profile
      Rank: Genius
    10. Neilsr

      61,466

      Master

      0 points yesterday

      Profile
      Rank: Genius
    11. amitkulshrestha

      61,377

      Master

      0 points yesterday

      Profile
      Rank: Genius
    12. jcimarron

      49,232

      0 points yesterday

      Profile
      Rank: Genius
    13. ve3ofa

      46,002

      0 points yesterday

      Profile
      Rank: Genius
    14. dlmille

      45,200

      0 points yesterday

      Profile
      Rank: Genius
    15. akicute555

      44,979

      10 points yesterday

      Profile
      Rank: Wizard
    16. Anuroopsundd

      44,529

      0 points yesterday

      Profile
      Rank: Sage
    17. HendrikWiese

      40,896

      2,000 points yesterday

      Profile
      Rank: Sage
    18. Exchange_Geek

      37,449

      0 points yesterday

      Profile
      Rank: Sage
    19. jordannet

      36,757

      0 points yesterday

      Profile
      Rank: Wizard
    20. acbrown2010

      34,652

      0 points yesterday

      Profile
      Rank: Genius
    21. diverseit

      34,600

      0 points yesterday

      Profile
      Rank: Guru
    22. WORKS2011

      32,775

      0 points yesterday

      Profile
      Rank: Guru
    23. e_aravind

      31,941

      0 points yesterday

      Profile
      Rank: Genius
    24. JBlond

      31,700

      0 points yesterday

      Profile
      Rank: Sage
    25. limjianan

      30,910

      0 points yesterday

      Profile
      Rank: Genius

    Hall Of Fame