Home > Domino Tips > Developer > Exporting email from Lotus Notes to .EML messages
Domino Tips:
EMAIL THIS
 TIPS & NEWSLETTERS TOPICS 

LOTUSSCRIPT

Exporting email from Lotus Notes to .EML messages


Arthur Turner
05.31.2006
Rating: -3.96- (out of 5)


Lotus Notes, Domino, Workplace and WebSphere tips and advice
Digg This!    StumbleUpon Toolbar StumbleUpon    Bookmark with Delicious Del.icio.us    Add to Google


VIEW MEMBER FEEDACK TO THIS TIP

Have you ever wanted to store your email in a file system, but still be able to keep the whole context of the email together? This tip will enable you to extract individual mail items and store them in a file system. The file created can be read directly from Microsoft Outlook and keeps all the internal integrity. Attachments are stored inside the message as MIME encoded attachments. The only problem I have had is with email sent from MAC, which I assume is due to the encoding used.

There are just two parts to this. The first is some LotusScript that is called from an action. The second is a form that helps in the conversion. Much of this code has been cribbed from the internet, so I want to thank all those that produced some of the original code. All of the examples I found did part of the job, but did not go all the way; and the only other option was to go for a package solution, which was expensive and also did not quite meet what I was searching for.

This form has just two fields. The first is MimeRichTextField. This should be set to store contents as HTML and MIME and is a RichTextField, which is also editable. The second field is called HtmlText and is also an editable RichText field. Let it be known that this is a standard Lotus Notes Richtext field. The form should be called MimeConvert and created in the mail file or mail file template.

The LotusScript code below should be copied into an agent. Run it from the action menu and on all selected documents.

'Export Email: 

Option Public

Dim CONVERT_DB_SERVER As String
Dim CONVERT_DB_NAME As String
Dim CONVERT_FORM As String
Dim CONVERT_FIELD As String
Dim CONVERT_TOFIELD As String
Dim OUTFILENAME As String
Dim crlf As String
Dim SaveTempDoc As Integer
Dim fileNum As Integer


Dim doc As NotesDocument
Dim nstream As NotesStream
Dim x As String
Dim count As Integer
Dim b As String

'** ShellExecute will open a file 
using the registered file association 
on the computer.
'** If it returns a value of greater 
than 32 then the call was 
successful; otherwise
'** it should return one of the 
error codes below. The parameters are:
'**hwnd = an active window handle, or 0
'**operation = "edit", "explore", "find", 
"open", or "print"
'**fileName = a file or directory name
'**parameters = if fileName 
is an executable file, the command line parameters
'**to pass when launching the 
application, or "" if no parameters
'**are necessary
'**directory = the default 
directory to use, or "" if you don't care
'**displayType = one of the 
displayType constants listed below
Declare Function ShellExecute 
Lib "shell32" Alias "ShellExecuteA" 
_ (Byval hwnd As Long, Byval operation 
As String, Byval fileName As String,
 _ Byval parameters As String, Byval 
directory As String, Byval displayType As Long) As Long

'** FindExecutable will determine the 
executable file that is set up to open a particular
'** file based on the file associations 
on this computer. If it returns a value of greater than
'** 32 then the call was successful; 
otherwise it should return one of t
he error codes
'** below. The parameters are:
'**fileName = the full path to the 
file you are trying to find the association for
'**directory = the default directory to 
use, or "" if you don't care
'**retAssociation = the associated 
executable will be returned as this parameter,
'**with a maximum string length 
of 255 characters (you will want
'**to pass a String that's 256 
characters long and trim the 
'**null-terminated result)
Declare Function FindExecutable Lib 
"shell32" Alias "FindExecutableA" _ 
(Byval fileName As String, Byval 
directory As String, Byval retAssociation As String) 
As Long

'** constants for the displayType parameter 
Const SW_HIDE = 0 Const SW_SHOWNORMAL = 1
 Const SW_NORMAL = 1 Const SW_SHOWMINIMIZED = 2 
Const SW_SHOWMAXIMIZED = 3 Const SW_MAXIMIZE = 3 
Const SW_SHOWNOACTIVATE = 4 Const SW_SHOW = 5 
Const SW_MINIMIZE = 6 Const SW_
SHOWMINNOACTIVE = 7 Const SW_
SHOWNA = 8 Const SW_RESTORE = 9 
Const SW_SHOWDEFAULT = 10 Const SW_MAX = 10

'** possible errors returned by ShellExecute
Const ERROR_OUT_OF_MEMORY = 0  
'The operating system is out of memory or resources.
Const ERROR_FILE_NOT_FOUND = 2
'The specified file was not found. 
Const ERROR_PATH_NOT_FOUND = 3 
'The specified path was not found. 
Const ERROR_BAD_FORMAT = 11   
'The .exe file is invalid (non-Microsoft 
Win32® .exe or error in .exe image). 
Const SE_ERR_FNF = 2       
'The specified file was not found. 
Const SE_ERR_PNF = 3      
'The specified path was not found. 
Const SE_ERR_ACCESSDENIED = 5  
'The operating system denied access
 to the specified file. 
Const SE_ERR_OOM = 8      
'There was not enough memory to complete the operation. 
Const SE_ERR_SHARE = 26     
'A sharing violation occurred. 
Const SE_ERR_ASSOCINCOMPLETE = 27 
'The file name association is incomplete or invalid. 
Const SE_ERR_DDETIMEOUT = 28   
'The DDE transaction could not be completed 
because the request timed out. 
Const SE_ERR_DDEFAIL = 29    
'The DDE transaction failed. 
Const SE_ERR_DDEBUSY = 30    
'The Dynamic Data Exchange (DDE) 
transaction could not be completed 
because other DDE transactions were being processed. 
Const SE_ERR_NOASSOC = 31    
'There is no application associated with
 the given file name extension. This error will 
also be returned if you attempt to print a file 
that is not printable. 
Const SE_ERR_DLLNOTFOUND = 32  
'The specified dynamic-link library (DLL) was not found. 

Declare Function GetActiveWindow Lib 
"user32.dll" () As Long 

' // BrowseInfo stucture
Type BROWSEINFO
hwndOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type


' // BrowseFlags constants
Const BIF_BROWSEFORCOMPUTER = 1000
Const BIF_BROWSEFORPRINTER = 2000
Const BIF_DONTGOBELOWDOMAIN = 2
Const BIF_RETURNFSANCESTORS = 8
Const BIF_RETURNONLYFSDIRS = 1
Const BIF_STATUSTEXT = 4

Const MAX_SIZE = 255

' // Win32 function to browse for a folder, 
rather than a file or files Declare Function 
BrowseFolderDlg Lib "shell32.dll" Alias 
"SHBrowseForFolder" (lpBrowseInfo 
As BROWSEINFO) As Long

' // Win32 function that returns the path of 
the folder selected Declare Function 
GetPathFromIDList Lib "shell32.dll" Alias 
"SHGetPathFromIDList" 
(Byval PointerToIDList As Long, Byval 
pszPath As String) As Long


Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim body As NotesItem
Dim rtitem As NotesRichTextItem
Dim mimebits As Variant
Dim n As Integer

Dim msgid As Variant
 
crlf = Chr(13) & Chr(10)
'Dim mime As NotesMIMEEntity, 
mime2 As NotesMIMEEntity

'** this is a form that has a rich 
text field that is set to store contents
'** in MIME format
CONVERT_FORM = "MimeConvert"


'** this is the field on the form 
mentioned above that stores rich text
'** as MIME
CONVERT_TOFIELD="MimeRichTextField"
CONVERT_FIELD = "Body"
 
'** do you want to save the 
temporary doc after you're done with it
'** (True) or delete it (False)?
SaveTempDoc = False
expdir$=BrowseForFolder()
If expdir$="" Then
Messagebox "You have not selected 
a directory", MB_OK, "Select output Directory"
Exit Sub
End If
 
Dim mime As NotesMIMEEntity
Dim subj As String
Set nstream=s.CreateStream
Set db = s.CurrentDatabase
s.ConvertMime = False ' 
Do not convert MIME to rich text|
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
 
n=0
While Not(doc Is Nothing)
n=n+1
If doc.subject(0) ="" Then
subj="No subject"
Else
subj=validatefilename(doc.subject(0)) 
End If
OUTFILENAME=expdir$ & "" & subj & " - " 
& doc.NoteID & ".eml"
Set body = doc.GetFirstItem("Body")
fileNum% = Freefile
fileName$ = OUTFILENAME
Open filename$  For Output As fileNum%
If body.Type = MIME_PART Then
Set mime = body.GetMimeEntity
mimebits=getmultipartmime(mime)
Print #fileNum%, mimebits
Else
Call GetRichTextAsHtmlFile
(doc, CONVERT_FIELD, OUTFILENAME, True)
   
End If
Close fileNum%
'Kill filename$
Set doc = dc.GetNextDocument(doc)
Wend
 
 
Msgbox Cstr(n) & " emails have 
been exported to " & expdir$
  
End Sub 



Function remsub(substr As String)
Dim mystr As String
For a=1 To Len(substr)
y=Asc(Mid$(substr,a,1))
If Not ( y="13" Or y="10") Then
mystr=mystr+Mid$(substr,a,1)
End If
Next
remsub=mystr
End Function
Function GetBoundary 
(header As String) As String
'** get the boundary from the 
initial header of a multi-part MIME string
'** normally, the format in Notes is 
something like:
'**    Content-Type: multipart/related; 
boundary="=_related 0012868C85256E16_="
Dim boundary As String
boundary = Strright(header, "boundary=""")
 
'** we want everything from the 
boundary=" to the closing "
If (Instr(boundary, """") > 0) Then
boundary = Strleft(boundary, """")
End If
 
If (Len(boundary) > 0) Then
boundary = "--" & boundary
End If
 
GetBoundary = boundary
End Function
Function GetMultipartMime 
(mime As NotesMIMEEntity) As String
'** recursively get all the 
parts of a multi-part MIME entity
Dim child As NotesMIMEEntity
Dim mText As String
Dim boundary As String


count=count+1
 
 
boundary = GetBoundary(mime.Headers)
 
'** DANGER -- ContentAsText 
truncates large MIME bodies in R5!!!
'** ND6 seems to be okay...
If mime.ContentType<>"text" Then
Call mime.encodecontent(1727)
mText = mText & mime.Headers & crlf & crlf
mText = mText & mime.ContentAsText & crlf
Else
mText = mText & mime.Headers & crlf & crlf
mText = mText & crlf & mime.ContentAsText & crlf
End If 
 
Set child = mime.GetFirstChildEntity
While Not(child Is Nothing)
mText = mText & boundary & crlf
mText = mText & GetMultipartMime(child)
Set child = child.GetNextSibling
Wend
 
If (Len(boundary) > 0) Then
mText = mText & boundary & "--" & crlf & crlf
End If

GetMultipartMime = mText
End Function
Function getlist(field As String)
Dim values As Variant
Dim out As String
Dim session As New NotesSession
Dim nam As NotesName
values = doc.GetItemValue( field )
Forall v In values
c=c+1
Set nam=session.CreateName(v)
If c>1 Then
out = out +"; "+ nam.abbreviated
Else
out=nam.abbreviated
End If
  
End Forall
getlist=out
End Function
Function WriteHtmlStringToFile 
(htmlBody As String, _ fileName As String, 
setFileExtension As Integer, 
isMultiPart As Integer) As Integer
'** send a NotesStream containing 
HTML to the specified fileName
'** (if setFileExtension is True, the 
fileName will automatically have
'** either .htm or .mht appended as 
the file extension, depending
'** on whether isMultiPart is 
True (.mht) or False (.htm))
Dim htmlStart As String, 
htmlEnd As String


'** set our variables, based 
on isMultiPart and setFileExtension
If Not  isMultiPart Then
'** non-multi-part files need 
opening and closing HTML
htmlStart = "<html><body>"
htmlEnd = "</body></html>"
End If

'fileName = fileName & ".eml"

'** open the file for output
'fileNum = Freefile()
'Open fileName For Output As fileNum
Print #fileNum%,"From: " & 
getlist("From")
Print #fileNum%,"To: " & 
getlist("SendTo")
Print #fileNum%,"Cc: " & 
getlist("CopyTo")
Print #fileNum%, "Bcc: " &
 getlist("BlindCopyTo")
Print #fileNum%,"Subject: " 
& doc.subject(0)
Print #fileNum%, "Date: " 
& Format(doc.posteddate(0), 
"dd mmm yyyy  hh:mm:ss") 
msgid=doc.GetItemValue("$MessageID")
Print #fileNum, "Message-ID: " & msgid(0)
If Not  ismultipart Then 
Print  #fileNum%, "MIME-Version: 1.0"
If Not  ismultipart Then 
Print #fileNum%,"Content-Type: 
multipart/alternative;" 
If Not  ismultipart Then 
Print #fileNum%, Chr(09) &
 |boundary="| & Cstr(doc.NoteID) & |"| 
Print #1, "X-Priority: " & doc.importance(0) 
Forall i In doc.Items
If i.text<>"" Then
If i.name<>"Body" Then
Print #1, "X-Notes-Item: " & i.text & ";
 name=" & i.name
End If
End If
End Forall 
If Not  ismultipart Then Print 
#fileNum%, crlf & "--" & Cstr(doc.NoteID) 
If Not  ismultipart Then Print 
#fileNum%,"Content-Type: text/html;"
If Not  ismultipart Then Print 
#fileNum%, Chr(09) & |charset="iso-8859-1"|
If Not  ismultipart Then Print 
#fileNum%, "Content-
Transfer-Encoding:  quoted-printable" & crlf
If Not ismultipart Then 
Print #fileNum%, htmlStart
Print #fileNum%, htmlBody
If Not  ismultipart Then Print 
#fileNum%, htmlEnd & crlf
If Not ismultpart Then Print 
#fileNum%, crlf & "--" & Cstr(doc.NoteID) & "--"
 
'Close #fileNum
WriteHtmlStringToFile = True
Exit Function
 
processError:
Print "Error " & Err & ": " & Error$
Reset
WriteHtmlStringToFile = False
Exit Function
 
End Function
Function RefreshDocFields 
(doc As NotesDocument) As String
'** Refresh the fields on a 
document, and return the NoteID of
'** the refreshed doc 
(I don't think this would cause the NoteID
'** to change, but just in case)
On Error Resume Next

'** before we save the uidoc, 
disable any MIME conversion warnings
'** by setting the 
MIMEConvertWarning parameter in Notes.ini to 1
Dim session As 
New NotesSession
Dim oldWarningVal As String
oldWarningVal = 
session.GetEnvironmentString
("MIMEConvertWarning", True)
Call session.SetEnvironmentVar
("MIMEConvertWarning", "1", True)
 
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.EditDocument(True, doc)
Call uidoc.Save
RefreshDocFields = uidoc.Document.NoteID
Call uidoc.Close(True)
 
%REM
'** if you're not running this on 
a Notes client, you could
'** try to run this in the 
background by doing everything 
'** using the Notes COM objects, 
although this is totally
'** unsupported and probably 
riddled with memory leaks
'** if you could actually get 
it working (plus, it would only
'** work on a Windows server...)
Dim oleSession As Variant
Dim oleDb As Variant
Dim oleDoc As Variant
Dim oleWorkspace As Variant
Dim oleUidoc As Variant
 
'** first we have to get a 
handle to the doc as an OLE object
Set oleSession = 
CreateObject("Notes.NotesSession")
Call oleSession.Initialize
Set oleDb = oleSession.
GetDatabase("", doc.ParentDatabase.FilePath)
Set oleDoc = oleDb.GetDocumentByID(doc.NoteID)

'** if we were able to do that, 
we can open and save it as a UIDoc
'** using COM
If Not (oleDoc Is Nothing) Then
Set oleWorkspace = 
CreateObject("Notes.NotesUIWorkspace")
Set oleUidoc = 
oleWorkspace.EditDocument(True, oleDoc)
Call oleUidoc.Save
RefreshDocFields = oleUidoc.Document.NoteID
Call oleUidoc.Close(True)
End If
%END REM
 
'** reset the MIMEConvertWarning 
Notes.ini variable and return
Call session.SetEnvironmentVar
("MIMEConvertWarning", oldWarningVal, True)
 
End Function
Function GetRichTextAsHtmlFile 
(doc As NotesDocument, _ fieldName 
As String, fileName As String, 
setFileExtension As Integer) As Integer
'** convert a rich text field to HTML, 
and send it to the specified file
'** (if setFileExtension is True, the 
fileName will automatically have
'** either .htm or .mht appended 
as the file extension, depending
'** on whether the HTML 
representation is multi-part or not)
Dim isMultiPart As Integer
Dim htmlBody As String
 
htmlBody = GetRichTextAsHtmlString
(doc, fieldName, isMultiPart)
GetRichTextAsHtmlFile = 
WriteHtmlStringToFile
(htmlBody, fileName, True, isMultiPart)
 
End Function


Function GetRichTextAsHtmlString 
(doc As NotesDocument, _ fieldName 
As String, isMultiPart As Integer) As String
'** get the contents of the given field 
as HTML by copying them
'** to a MIME rich text field and 
reading the MIME field
Dim session As New NotesSession
Dim mText As String
Dim db As NotesDatabase
Dim newDoc As NotesDocument
Dim noteID As String
Dim currentSessionMimeSetting As Integer
 
Dim rtitem As NotesRichTextItem
Dim rtitem2 As NotesRichTextItem
Dim mimeItem As NotesItem
Dim mime As NotesMIMEEntity
Dim MimeFieldName As String
 
'** make sure we can actually 
get the rich text field we want to
'** copy, and make sure it's 
really rich text (error 13 if it's not)
On Error 13 Resume Next
Set rtitem = doc.GetFirstItem(fieldName)
If (rtitem Is Nothing) Then
Exit Function
End If
 
'** save the current ConvertMime 
setting, because we'll change it
'** a couple of times
currentSessionMimeSetting = 
session.ConvertMime
 
'** initially set the ConvertMime 
property to True and create a
'** temporary document, 
which allows us to treat the MIME field
'** as rich text so we can 
append some real rich text to it
session.ConvertMime = True
 
'** create a new document to 
manipulate the MIME entry with.
Set db =session.CurrentDatabase
'Set db = session.
GetDatabase(CONVERT_DB_SERVER,
 CONVERT_DB_NAME)
Set newDoc = New NotesDocument(db)
 
'** this document must use a 
form that already exists in this
'** database, and the MIME 
field that we create must be the
'** same name as a field 
that's already on the form as a rich text
'** field that stores its data in MIME format
newDoc.Form = CONVERT_FORM
MimeFieldName = CONVERT_TOFIELD
 
Set rtitem2 = New NotesRichTextItem
(newDoc, MimeFieldName)
Call rtitem2.AppendRTItem(rtitem)
Call newDoc.Save(True, True)
 
'** HERE'S THE TRICK: 
you have to open the temporary doc
'** as a uidoc, and then 
save and close it.
'** This will convert all the 
rich text in our MIME field back to
'** MIME format (which is 
why the field had to exist as a valid
'** MIME field on a valid 
form in the first place, so Notes will 
'** know to convert it back)
noteID = RefreshDocFields(newDoc)

'** after you've done this, you 
need to reset the reference for
'** the newDoc variable, 
so none of the in-memory information
'** about the document will remain
Set newDoc = Nothing
 
'** set ConvertMime to False, 
reopen the temporary doc,
'** and now we can get the 
rich text contents as HTML
session.ConvertMime = False
Set newDoc = db.GetDocumentByID(noteID)
Set mimeItem = newDoc.
GetFirstItem(MimeFieldName)
If Not (mimeItem Is Nothing) Then
If (mimeItem.Type = MIME_PART) Then
Set mime = mimeItem.GetMimeEntity
If Not (mime Is Nothing) Then
If (mime.ContentType = "multipart") Then
'** for multi-part MIME, 
which is anything with graphics,
'** you need to get the various 
parts one at a time.
'** If you write this to a file, 
it should be a .mht file so the
'** the browser knows what to do with it.
'** NOTE: there is a bug in R5 
where you can't always
'** get the full contents of large 
sections of multi-part
'** MIME -- if you're dealing with 
large images, they will
'** often get cropped off at the bottom
isMultipart = True
mText = GetMultipartMime(mime)
Else
'** if we're not dealing with 
multi-part (thank goodness)
'** we can just grab the HTML 
contents and go
isMultipart = False
mText = mText & mime.ContentAsText
End If
End If
End If
End If
 
'** delete or save the temporary doc 
when we're done (depending on
'** the SaveTempDoc setting)
If SaveTempDoc Then
Set rtitem2 = 
New NotesRichTextItem
(newDoc, "HTMLText")
Call rtitem2.AppendText(mText)
Call newDoc.Save(True, True)
Else
Call newDoc.Remove(True)
End If
 
'** set the ConvertMIME setting
 back to whatever it was
'** before we started all this, and exit out
session.ConvertMIME = 
currentSessionMimeSetting
GetRichTextAsHtmlString = mText
End Function
Function validatefilename(filename As String)
Dim l As Integer
Dim x As Integer
Dim newname As String
l=Len(filename)
For x = 1 To l
If Mid$(filename,x,1) 
Like "[-@()~^$#[{}=A-Za-z0-9]" Then
newname=newname+Mid$(filename,x,1)
Else
If Mid$(filename,x,1)=" " Or 
Mid$(filename,x,1)="]" 
Or Mid$(filename,x,1)=
","  Or Mid$(filename,x,1)="'"  
Or Mid$(filename,x,1)="!" Then
newname=newname+Mid$(filename,x,1)
Else
Print Mid$(filename,x,1) " is not valid"
End If
 
End If
Next x
validatefilename=newname
End Function
Function isFolder(Byval sFolderPath 
As String) As Integer
Const ATTR_DIRECTORY = 16
isFolder = False
If Dir$(sFolderPath, ATTR_DIRECTORY)
 <> "" Then isFolder = True End Function 
Function isFile(Byval sFileName As String) 
As Integer
On Error Resume Next
Dim lFileLength As Long
Const ATTR_NORMAL = 0
 
isFile = False
If Dir$(sFileName, ATTR_NORMAL) <> 
"" Then
lFileLength = Filelen(sFileName)
If (lFileLength > 0) Then isFile = True
End If
End Function
Function BrowseForFolder() As String
Dim mBrowseInfo As BROWSEINFO
Dim lngPointerToIDList As Long
Dim lngResult As Long
Dim strPathBuffer As String
Dim strReturnPath As String
Dim vbNullChar As String
 
vbNullChar = Chr(0)
 
On Error Goto lblErrs
 
mBrowseInfo.hwndOwner = 
GetActiveWindow()
 
' // Set the default folder for the 
dialog box (0 = My Computer, ' // 5 = 
My Documents)
mBrowseInfo.pidlRoot = 0

mBrowseInfo.lpszTitle = 
"Select the folder you wish to use:"
' // Pointer to a buffer that receives
 the display name ' // of the folder 
selected by the user
mBrowseInfo.pszDisplayName = 
String(MAX_SIZE, Chr(0)) ' // Value 
specifying the types of folders to be 
listed ' // in the dialog box 
as well as other options
mBrowseInfo.ulFlags = 
BIF_RETURNONLYFSDIRS
 
' // Returns a pointer to an item identifier 
list that ' // specifies the location of the 
selected folder relative ' // to the 
root of the name space
lngPointerToIDList = BrowseFolderDlg(mBrowseInfo)
 
If lngPointerToIDList <> 0& Then
' // Create a buffer
strPathBuffer = String(MAX_SIZE, Chr(0))
  
' // Now get the selected path
lngResult = GetPathFromIDList
(Byval lngPointerToIDList, Byval strPathBuffer) 
' // And return just that
strReturnPath = Left$(strPathBuffer, 
Instr(strPathBuffer, vbNullChar) - 1)
End If
 
BrowseForFolder = strReturnPath
 
lblEnd:
Exit Function
 
lblErrs:
Messagebox "Unexpected error: "
 & Error$ & " (" & Cstr(Err) & ").", 0, "Error"
Resume lblEnd
End Function
Sub Terminate
 
End Sub


MEMBER FEEDBACK TO THIS TIP

We have had lots of responses about this tip, with our users saying that there are too many line breaks in the code for it to work. Here you will find the code in its original format, as I received it from the tip author. Hope it works for everyone.
—Matt Gervais, SearchDomino.com Assistant Site Editor

******************************************

When copying the code to an agent, how do I control which sections of the code end up in which module in Domino Designer? The sections are not separated or labeled clearly and when pasted into any single module in a new agent the sections, they do not separate consistently nor into the correct modules such as (Options), (Declarations), (Initialize), etc. Also, what is the output file of this code and can the output be read by a browser or other application?
—Dave O.

******************************************

You should open the attached file and do the following:

Select All
Create a new Agent
Go into the (Options) section and select the text Option Public and paste.

This will create all the functions and set up the declarations and Initialize Sub.

As for the output file, the file that gets created is an .EML file which appears to be a generic email format. Microsoft Outlook reads it fine as is. The format can also be read by a number of other readers.
—Arthur Turner, tip author.

******************************************

I've updated the above link with a new text file straight from the tip's author, Arthur Turner. He says it is the best way to look at it and it formats the LotusScript the best way. Please feel free to email me with any further questions or comments regarding this tip.
—Matt Gervais, SearchDomino.com Assistant Site Editor

******************************************

The attachments in the subject email, documents do not appear in the exported .EML files. Instead, Microsoft-Outlook Express displays the following message: "OE removed access to the following unsafe attachments in your mail: "

There does not seem to be a way to get at the attachment. The Outlook behaves the same way with all attachments that I've tested, regardless of file type. Since I am unfamiliar with Microsoft Outlook, I'm uncertain if this is caused by some sort of security setting to be found someplace in Outlook or another related Microsoft application.

What I am really trying to do is select a large number of documents in a database and then print all the documents plus their attachments to a .PDF file or any generic file format. Since Notes/Domino does not provide a way to do this directly, it seems that there would be many users out there who would need to do this. I think that not only I, but indeed the whole SearchDomino.com community would find a resolutions to this Notes/Domino limitation to be a very helpful and useful enhancement.
—Dave O.

******************************************

I think the problem is caused by Outlook Express itself. One of the security settings is to remove files that may cause security concerns, good old Microsoft thinking for you as always. The setting to fix this is in Tools/Options, security tab virus protection section and untick the option 'Do not allow attachments to be saved or opened that could potentially be a virus'
—Arthur Turner, tip author.

******************************************

I disabled the security setting so that the file attachments are now accessible in Outlook Express. However, the fundamental problem remains in that I cannot find a way to print a massive quantity of documents, plus their attachments, so it appears I have traded a Notes/Domino limitation for a MS-Outlook Express limitation.
—Dave O.

******************************************

I was looking at the code that the author sent you. I noticed that there are three lines missing in the print. When I pasted in the code; the lines below in bold appeared, yet they are not in his article code. Any Idea what this horizondmsave.exe is?


'fileName$ = "c:\program files\horizon\horizondmsave.exe" 
        'If isfile(fileName$) Then 
'        result& = ShellExecute(0, "open", fileName$, 
"DIR=c:\export", "", SW_SHOW) 
        'Else 
Msgbox Cstr(n) & " emails have been exported to " & expdir$ 
        'End If

—Frank M.

******************************************

This code relates to a document management system. The code allows us to launch into it directly. As this was not necessary, I took it out of the original example.
—Arthur Turner, tip author.

******************************************

When I try to run the code provided, I receive an error message that says, "Cannot locate Form: MIMEConvert". Do you know how I should go about solving this? Also, do you know if it is possible to open the emails on another computer by installing Lotus Notes if I save my inbox as an .nsf file?
—Mavis H.

******************************************

This form has just two fields. The first is MimeRichTextField. This should be set to store contents as HTML and MIME, and is also a RichTextField -- which is also editable. The second field is called HtmlText, and is also an editable RichText field. Let it be known that this is a standard Lotus Notes Richtext field. The form should be called MimeConvert and created in the mail file or mail file template. This form should be designed in the mail database or template.

As for part 2 of his query, yes, you can copy a mail database and open it on another computer so long as the user ID is copied across as well.

Some suggestions might be to output the file named with Sender name and subject, or to change this line in code:

OUTFILENAME=expdir$ & "" & subj & " - " 
& doc.NoteID & ".eml"
to
Dim session As New NotesSession

Dim nam As NotesName

Set enam = 
session.CreateName( DOC.FROM(0))

EMLFROM$ = enam.Addr822Phrase

OUTFILENAME=expdir$ & "" 
& EMLFROM$ & "-"& subj  & ".eml"  

—Arthur Turner, tip author.

******************************************

If I were to save the email content and attachment to an .EML file, can it be read by the Lotus Notes client?
—A.R.

******************************************

Unfortunately, the answer to your question is no. Lotus Notes will not be able to read these files unless they were presented as IMAP4, POP3 or native Lotus Notes format and I could not find out how to export individual mail items in Lotus Notes format.
—Arthur Turner, tip author

******************************************

I'm trying to run the agent and I keep receiving the same error message mentioned in the user comments: "Cannot locate Form: MIMEConvert."

While I have access to create agents, it would appear that I am not able to create/update forms. Is there a way to modify this script to run without an additional form?
—Todd B.

******************************************

Sorry, unfortunately I have not looked into this. The nice thing about the form is that it does the clever stuff in converting Richtext field to MIME. What you inquire about may be possible, but I think you are looking to pay for that type of tool and it requires some C programming.
—Arthur Turner, tip author

Do you have comments on this tip? Let us know.

This tip was submitted to the SearchDomino.com tip library by member Arthur Turner. Please let others know how useful it is via the rating scale below. Do you have a useful Lotus Notes, Domino, Workplace or WebSphere tip or code snippet to share? Submit it to our monthly tip contest and you could win a prize.

Rate this Tip
To rate tips, you must be a member of SearchDomino.com.
Register now to start rating these tips. Log in if you are already a member.


Submit a Tip




Digg This!    StumbleUpon Toolbar StumbleUpon    Bookmark with Delicious Del.icio.us    Add to Google


RELATED CONTENT
E-mail
Exploring Lotus Notes Domino 8.0.1 and beyond
LotusScript agent moves tagged spam email to junk mail folder
Send SMS text messages between Lotus Notes 7 and mobile devices
Update to Exchange Server 2003 Connector for Lotus Notes
Two fast and easy Domino Web Access performance tips
Can I encrypt an email sender's name?
How to modify a Lotus Notes signature file using LotusScript
Putting a stop to incoming spam on Lotus Notes 6.5
Lotus Notes replication snafu: Accidentally deleted archived email
How to fix the Lotus Notes unread documents feature

Agent
Verify scheduled agent status with Domino Extensible Language (DXL)
How to export data from a Lotus Notes database to a CSV file
Enable or disable scheduled agents without opening the Lotus Notes database design
Creating custom views in Lotus Notes databases
Editing fields in a Lotus Notes view with Ajax
How to automatically create a backup copy of your Domino Directory
Export Lotus Notes documents to Microsoft Word via Internet Explorer
A bevy of Notes/Domino development tips
Best practices for using the Lotus Notes WebQuerySave agent
A flexible data export agent for Lotus Notes

LotusScript
Update the ACL from the Roles view with LotusScript
LotusScript agent moves tagged spam email to junk mail folder
Create a personalized greeting for Lotus Notes database users
Fail-safe rich-text validation using LotusScript
How to export Lotus Notes views to a Microsoft Excel database
Create file system labels for Microsoft Excel and Word mail merges
Fix Lotus Notes 8.0 issues when launching Microsoft Office applications
Capture rich-text comments in Lotus Notes fields using LotusScript
Retrieve cell values from tables in a Lotus Notes rich-text field
Adding new variable-sized, multi-value fields to Lotus Notes documents

RELATED RESOURCES
2020software.com, trial software downloads for accounting software, ERP software, CRM software and business software systems
Search Bitpipe.com for the latest white papers and business webcasts
Whatis.com, the online computer dictionary

DISCLAIMER: Our Tips Exchange is a forum for you to share technical advice and expertise with your peers and to learn from other enterprise IT professionals. TechTarget provides the infrastructure to facilitate this sharing of information. However, we cannot guarantee the accuracy or validity of the material submitted. You agree that your use of the Ask The Expert services and your reliance on any questions, answers, information or other materials received through this Web site is at your own risk.

HomeNewsTopicsITKnowledge ExchangeTipsAsk the ExpertsWebcastsWhite PapersDomino IT Downloads
About Us  |  Contact Us  |  For Advertisers  |  For Business Partners  |  Site Index  |  RSS
SEARCH 
TechTarget provides enterprise IT professionals with the information they need to perform their jobs - from developing strategy, to making cost-effective IT purchase decisions and managing their organizations' IT projects - with its network of technology-specific Web sites, events and magazines.

TechTarget Corporate Web Site  |  Media Kits  |  Reprints  |  Site Map




All Rights Reserved, Copyright 1999 - 2008, TechTarget | Read our Privacy Policy
  TechTarget - The IT Media ROI Experts