Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Send Lotus Notes Email Using C#

0.00/5 (No votes)
17 Sep 2008 1  
How to send email to Lotus Notes from C#.

AddUsingStatement.jpg

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:

  1. Automates the email process from within a Windows service.
  2. Gives the user a brief description in the subject line. E.g.: Billing Error: File Not Processed.
  3. 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.

DominoAddRef.jpg

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) 
{
    //Pass in file name 
    string filename = file; 
    //Pass in error message from TryCatch 
    string errMessage = err; 
    //Create new notes session 
    NotesSession _notesSession = new NotesSession(); 
    //Initialize Notes Database to null; nothing in VB. 
    NotesDatabase _notesDataBase = null; 
    //Initialize Notes Document to null; nothing in VB. 
    NotesDocument _notesDocument = null; 
    //Notes Server Name in form of: ServerName/Domain. 
    string sServerName = ConfigurationManager.AppSettings [ "ServerName" ]; 

    //Mail File is in form of: mail\\userName.nsf 
    string sMailFile = ConfigurationManager.AppSettings [ "MailFile" ]; 
    string password = ConfigurationManager.AppSettings [ "Password" ]; 
    string sSendTo = ConfigurationManager.AppSettings [ "SendTo" ]; 
    string sSubject = "Billing Error"; 
    //required for send, since it's byRef and not byVal, gets set later. 
    object oItemValue = null; 
    //use string array to CC Send 
    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" ]; 
    //Initialize Notes Session 
    _notesSession.Initialize(password);

    //Get Database via server name & c:\notes\data\mailfilename.nsf 
    //if not found set to false to not create one 
    _notesDataBase = _notesSession.GetDatabase(sServerName, sMailFile, 
        false); 

    //If the database is not already open then open it. 
    if ( !_notesDataBase.IsOpen ) 
    {
        _notesDataBase.Open( );
    }

    //Create the notes document 
    _notesDocument = _notesDataBase.CreateDocument();

    //Set document type 
    _notesDocument.ReplaceItemValue(
        "Form", "Memo"); 

    //sent notes memo fields (To: CC: Bcc: Subject etc) 
    _notesDocument.ReplaceItemValue(
        "SendTo", sSendTo); 
    _notesDocument.ReplaceItemValue(
        "CopyTo", sCopyTo); 
    _notesDocument.ReplaceItemValue(
        "Subject", sSubject); 

    //Set the body of the email. This allows you to use the appendtext 
    NotesRichTextItem _richTextItem = _notesDocument.CreateRichTextItem("Body"); 

    //add lines to memo email body. the \r\n is needed for each new line. 
    _richTextItem.AppendText(
        "Error: " + errMessage + "\r\n"); 
    _richTextItem.AppendText(
        "File: " + filename + "\r\n"); 
    _richTextItem.AppendText(
        "Resolution: " + resolution + "\r\n"); 
    //send email & pass in byRef field, this case SendTo (always have this, 

    //cc or bcc may not always be there. 
    oItemValue = _notesDocument.GetItemValue( 
        "SendTo" ); 
    _notesDocument.Send(
        false, ref oItemValue); 

    //release resources. 
    _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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here