Visual Basic, extract Lotus Notes email attachments

Posted on 2009-05-12
Last Modified: 2013-12-18
Hi There,

I have found that since moving to late binding the attached VB code no longer extracts the filename of attachments in a Lotus Notes client email.  Please note that this is a client tool (not a domino server tool)

Even though the attachments are processed correctly, I have found the following line  produces an empty string.
sFileName = domNotesItem.Values(0)

What do I need to do to be able to continue to use late binidng but extract my files correctly.

Thanks in advance.
Set Doc = nv.GetFirstDocument


    Do While (Not (Doc Is Nothing))

        iCount = iCount + 1

        If Len(Doc.NoteID) & Doc.NoteID = sMessageId Then


            sSubject = Doc.GetItemValue("subject")(0)

            sText = Doc.GetItemValue("Body")(0)

            sAttachedFileNames = ""


            'Extract all items.

            For Each domattachment In Doc.Items

                Set domNotesItem = domattachment

                If domNotesItem.Type = 1084 Then

                    'OK!!!!! We have the file, lets extract it and create our string

                    sFileName = domNotesItem.Values(0)

                    sAttachmentFiles = sAttachmentFiles & sFileName & "|"


                    Call Doc.GetAttachment(sFileName).ExtractFile(sTempFilename)

                    sAttachmentPaths = sAttachmentPaths & sTempFilename & "|"

                End If



            sMessageId = Len(Doc.NoteID) & Doc.NoteID

            ReadMessage = "SUCCESS"


            GoTo EXITFUNCTION

        End If


        Set Doc = nv.GetNextDocument(Doc)


Open in new window

Question by:jcwiatr
  • 4
LVL 39

Expert Comment

Comment Utility
I have to guess a bit here, because I don't know the intricacies of using Lotus Notes, but it might be that either:

1) the default accessor (method/property) is not called, you can try it with .Item(index) (but that's only true if it is not an array but a collection of some sort)
2) the Values collection contains empty data, you check in debug env. using Immediate Window
3) or your method is wrong, but I can't tell. Check this:, it may reveal some info I don't have.

otherwise, there are some excellent people around at Lotus Notes, who may be able to help further.
LVL 39

Accepted Solution

abel earned 500 total points
Comment Utility
Ok, my mistake, I should RTFM before posting. From the documentation of Lotus Notes it gives (quote):

For text, number, date-time items, and attachments this property always returns an array, even when there is only a single value in the item. If you know the item contains only a single value, access the first element in the array, which is at index 0. If you know the item contains multiple values, but you don't know how many, iterate over the array using the Forall statement. For attachments, the attachment name can be passed to the GetAttachment method in NotesDocument. This property returns the same value(s) for an item as the GetItemValue method in NotesDocument.
you may want to try the GetItemValue method, perhaps it returns more?

And from that previous link at EE that I posted, I understand that you should be able to do the following, which might work as an alternative method, quote:

Use notesDocument.getFirsttem("$File"), which is the object reference data.  The returned notesItem has property notesIte.text, which will be the file name.  There can be multiple $File items, so delete each one after you process its correspodning getAttachment, by using notesItem.remove.  As long as you don't, it will have no lasting effect, but will allow you to try to get .getFirstItem("$File") again (returning the next $File instead of the same one again)

-- Abel --
LVL 39

Expert Comment

Comment Utility
Yet another alternative, which is originates from that same thread, is this: using NotesSession.Evaluate and @AttachmentNames on the NotesDocument

Author Closing Comment

Comment Utility
Thanks for your help.  I used the s.Evaluate("@AttachmentNames",Doc) option.
LVL 39

Expert Comment

Comment Utility
thanks for the follow-up & pts, glad it works.

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
This article describes some techniques which will make your VBA or Visual Basic Classic code easier to understand and maintain, whether by you, your replacement, or another Experts-Exchange expert.
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now