
Introduction
I had this problem at work; I needed to send a notification via Lotus Notes Email with a description of the error (ex.Message
) and the name of the file that contained the error. Example: looking up values in a database that are not supplied in an XML file that I use to create a pipe delimited flat file going to another system. This would cause the flat file to not be processed; it would instead be moved to an error folder, and an event log entry would be created. Of course, this doesn't help the users, but an email would. The Internet doesn't have much in the way of C#-To-Lotus Notes, so I took some VBA samples, a few C# GUI samples, and modified them for my own needs, since what was there doesn't work for use in a Windows service. This gives the service the use of an application, and best of all, I don't have to do anything but check my email.
I also use this procedure to create an email to notify another user that a file was successfully processed and is awaiting them to import into the ERP system.
Background
What this does:
- Automates the email process from within a Windows service.
- Gives the user a brief description in the subject line. E.g.: Billing Error: File Not Processed.
- In the body of the email, it gives the user the file name, the error in understandable terms, and a useful tip on how to fix the problem. Case in point, some of our work orders do not have a lead tech assigned; this value is looked up in the database and is not contained in the XML file. The lack of a lead tech will cause an error to be thrown (I created several custom exceptions for this purpose, e.g.:
LeadTechNotFoundException
). I use this to tell the user to go into the database, add a lead tech, and then move the XML file from the error folder back into the processing folder. The service picks it up via a FileSystemWatchers
and re-processes it. If they copy instead of move, I check for the file and delete it if it exists. Simple, eh?
Using the code
Set your reference to the Domino COM Object.

This code can be used as is or modified. It's fully functional (at least on my systems).
static void SendNotesErrorMail( string err, string file)
{
string filename = file;
string errMessage = err;
NotesSession _notesSession = new NotesSession();
NotesDatabase _notesDataBase = null;
NotesDocument _notesDocument = null;
string sServerName = ConfigurationManager.AppSettings [ "ServerName" ];
string sMailFile = ConfigurationManager.AppSettings [ "MailFile" ];
string password = ConfigurationManager.AppSettings [ "Password" ];
string sSendTo = ConfigurationManager.AppSettings [ "SendTo" ];
string sSubject = "Billing Error";
object oItemValue = null;
string[] sCopyTo = new string[4];
sCopyTo [ 0 ] =
ConfigurationManager.AppSettings [ "Recipient0" ];
sCopyTo [ 1 ] =
ConfigurationManager.AppSettings [ "Recipient1" ];
sCopyTo [ 2 ] =
ConfigurationManager.AppSettings [ "Recipient2" ];
sCopyTo [ 3 ] =
ConfigurationManager.AppSettings [ "Recipient3" ];
_notesSession.Initialize(password);
_notesDataBase = _notesSession.GetDatabase(sServerName, sMailFile,
false);
if ( !_notesDataBase.IsOpen )
{
_notesDataBase.Open( );
}
_notesDocument = _notesDataBase.CreateDocument();
_notesDocument.ReplaceItemValue(
"Form", "Memo");
_notesDocument.ReplaceItemValue(
"SendTo", sSendTo);
_notesDocument.ReplaceItemValue(
"CopyTo", sCopyTo);
_notesDocument.ReplaceItemValue(
"Subject", sSubject);
NotesRichTextItem _richTextItem = _notesDocument.CreateRichTextItem("Body");
_richTextItem.AppendText(
"Error: " + errMessage + "\r\n");
_richTextItem.AppendText(
"File: " + filename + "\r\n");
_richTextItem.AppendText(
"Resolution: " + resolution + "\r\n");
oItemValue = _notesDocument.GetItemValue(
"SendTo" );
_notesDocument.Send(
false, ref oItemValue);
_richTextItem =
null;
_notesDocument =
null;
_notesDataBase =
null;
_notesSession =
null;
}
Points of Interest
This was a pain. There are a lot of VBA / Access / Excel with Lotus Notes how-to's etc. There is also a pretty nice example here from another user, with a GUI.
The changes I will make is to check a value in the app.config file and set the array size from that count. I also need to add some additional sections to the "resolution" section for my users. I may post a sample project, if I can get some time.
This is my first post here, so I hope it helps someone out.