1. 程式人生 > >C# 使用 Lotus notes 公共郵箱發送郵件

C# 使用 Lotus notes 公共郵箱發送郵件

*** set char which replace ilb mva file odin

公司的郵件系統用的是反人類的 Lotus notes, 你敢信?

最近要實現一個功能,郵件提醒功能,就是通過自動發送提醒郵件

前前後後這個問題搞了2天,由於公司的諸多條件限制,無法直接調用到公司發送郵件的接口,只有通過類似 Lotus script,VBA 等其他方式來實現。

用VBA代碼實現發送郵件,其實我在n年前就實現過了

代碼如下,網上一搜也一大堆

技術分享圖片
Function SendEmailbyNotesWithAttachement_2(Addresses, Attach, cc)
 
    strSubject = ThisWorkbook.Sheets("EMAIL
").Range("B1") strbody = ThisWorkbook.Sheets("EMAIL").Range("A1") Declare Variables Dim s As Object Dim db As Object Dim body As Object Dim bodyChild As Object Dim header As Object Dim stream As Object Dim host As String Dim message As Object
Notes variables Set s = CreateObject("Notes.NotesSession") Set db = s.CURRENTDATABASE Set stream = s.CreateStream Turn off auto conversion to rtf s.ConvertMIME = False Create message Set message = db.CREATEDOCUMENT message.Form
= "memo" message.Subject = strSubject message.sendTo = Split(Addresses, ";") message.CopyTo = cc message.SaveMessageOnSend = True Create the body to hold HTML and attachment Set body = message.CreateMIMEEntity Child mime entity which is going to contain the HTML which we put in the stream Set bodyChild = body.CreateChildEntity() Call stream.WriteText(strbody) Call bodyChild.SetContentFromText(stream, "text/HTML;charset=UTF-8", ENC_NONE) Call stream.Close Call stream.Truncate This will run though an array of attachment paths and add them to the email For i = 0 To UBound(Attach) strAttach = Attach(i) If Len(strAttach) > 0 And Len(Dir(strAttach)) > 0 Then Get the attachment file name pos = InStrRev(strAttach, "\") Filename = Right(strAttach, Len(strAttach) - pos) A new child mime entity to hold a file attachment Set bodyChild = body.CreateChildEntity() Set header = bodyChild.CreateHeader("Content-Type") Call header.SetHeaderVal("multipart/mixed") Set header = bodyChild.CreateHeader("Content-Disposition") Call header.SetHeaderVal("attachment; filename=" & Filename) Set header = bodyChild.CreateHeader("Content-ID") Call header.SetHeaderVal(Filename) Set stream = s.CreateStream() If Not stream.Open(strAttach, "binary") Then MsgBox "Open failed" End If If stream.Bytes = 0 Then MsgBox "File has no content" End If Call bodyChild.SetContentFromBytes(stream, "application/octet-stream", ENC_IDENTITY_BINARY) All my attachments are excel this would need changing depensding on your attachments. End If Next Send the email Call message.Send(False) s.ConvertMIME = True Restore conversion End Function
View Code VBA

但是現實情況是這樣的

我們需要郵件從公郵發送出去

何謂公郵:整個Team使用的郵箱,如***[email protected] 之類的郵箱

使用過反人類的 Lotus notes 都知道公郵是需要先打開個人郵箱才能進去的

於是當我把以上的VBA 代碼增加如下代碼,設置從公郵裏面發送郵件後

技術分享圖片
     Server = "C***/****r/****"
     Path = "****\C*****.nsf"
     Set db = s.GetDataBase(Server, Path)
View Code

郵件確實是從公郵發送出來,但是很遺憾,郵件發送人那顯示的是我的個人郵箱,而查看我個人的已發送郵件,是完全查不到,但是在公郵已發送郵件可以看到

這就無法理解了,於是開啟了漫長的2天人類大戰反人類Lotus notes戰役

前前後後試過各種VBA代碼【表問為什麽不直接調接口】

但要不就是能顯示為公郵發送的,但郵件 body 不能Html格式,否則就是相反,總之一句話:二者不可兼得

期間看遍國內外關於Lotus notes VBA的網站

最後,實在是忍不了了,開始搜索Python,C#

一直猶猶豫豫沒有寫是因為同事告訴我,比如使用C#就需要郵箱密碼,而這個東西我們沒有也不會有的

最後的最後,決定賭一把,我先用C#,直接寫出來,等報錯提示密碼沒有的時候我再想辦法

於是戰戰兢兢有了以下代碼

技術分享圖片
        /// <summary>
        /// 通過notes發送郵件
        /// </summary>
        /// <param name="mailTo">實時數據庫</param>
        /// <returns></returns>
        public static void SendForNotes()
        {

            string notesPwd = "";
            string notesServer = "C***3/C***/***r/***C";
            string NotesDBName = @"M**l\C***to.nsf";
            string mailTo = "m****o@c**.***.com";
            string mailSubject = DateTime.Now.ToString();

            string mailBoby = "<html><body><table border=‘1‘><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr></table></body></html>";

            NotesSession ns;
            NotesDatabase db;
            NotesDocument doc;
            try
            {
                ns = new NotesSession();
                if (ns != null)
                {
                    //您本機notes的密碼
                    ns.Initialize(notesPwd);
                    //初始化NotesDatabase
                    db = ns.GetDatabase(notesServer, NotesDBName, false);
                    doc = db.CreateDocument();
                    doc.ReplaceItemValue("Form", "Memo");
                    doc.ReplaceItemValue("SendTo", mailTo);
                    doc.ReplaceItemValue("Subject", mailSubject.Replace(\r‘, ‘ ‘).Replace(‘\n‘, ‘ ‘));
                    doc.AppendItemValue("Principal", "C******m");//設置郵件的發件人昵稱
                    NotesRichTextItem rt = doc.CreateRichTextItem("Body");
                    var richStyle = ns.CreateRichTextStyle();
                    richStyle.PassThruHTML = 1;

                    rt.AppendStyle(richStyle);
                    rt.AppendText(mailBoby);
                    //發送郵件         
                    object obj = doc.GetItemValue("SendTo");
                    doc.Send(false, ref obj);
                    doc = null;
                }
            }
            catch (Exception ex)
            {
                //   Log.CreateLog(ex.Message);
            }
            finally
            {
                ns = null;
                db = null;
                doc = null;
            }
        }
View Code

抱著必死的心態小心翼翼的點擊了調試

WTF!!!!

居然收到一封有郵件!沒有密碼啊!不需要密碼嗎!密碼不用也能發送!!!

再試了一次後,發現真的不需要!!!

因為我們每天開機打開notes的時候也不需要輸入密碼!!!這可能是和本機的ID文件有綁定!!!在畢業後的第一家公司中是需要輸入密碼的!

於是欣喜若狂

開始修改代碼

最終版本

技術分享圖片
        /// <summary>
        /// 通過notes發送郵件
        /// </summary>
        /// <param name="mailTo">實時數據庫/lysh</param>
        /// <returns></returns>
        public static void SendForNotes2()
        {

            string notesPwd = "";
            string notesServer = "C****3/**/S***/****";
            string NotesDBName = @"****\******.nsf";
            string mailTo = "****t**@***.com";
            string mailSubject = DateTime.Now.ToString();

            string mailBoby = "<html><body><table border=‘1‘><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr></table></body></html>";

            NotesSession ns;
            NotesDatabase db;
            NotesDocument doc;
            try
            {
                ns = new NotesSession();
                if (ns != null)
                {
                    //您本機notes的密碼
                    ns.Initialize(notesPwd);
                    //初始化NotesDatabase
                    db = ns.GetDatabase(notesServer, NotesDBName, false);
                    doc = db.CreateDocument();
                    doc.ReplaceItemValue("Form", "Memo");
                    doc.ReplaceItemValue("SendTo", mailTo);
                    doc.ReplaceItemValue("Subject", mailSubject.Replace(\r‘, ‘ ‘).Replace(‘\n‘, ‘ ‘));

                    doc.SaveMessageOnSend = true;

                    NotesStream HtmlBody = ns.CreateStream();
                    HtmlBody.WriteText(mailBoby);//構建HTML郵件,可以在頭和尾添加公司的logo和系統提醒語
                    NotesMIMEEntity mine = doc.CreateMIMEEntity("Body");//構建郵件正文
                    mine.SetContentFromText(HtmlBody, "text/html;charset=UTF-8", Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);

                    doc.AppendItemValue("Principal", "C**********am");//設置郵件的發件人昵稱
                    //發送郵件         
                    object obj = doc.GetItemValue("SendTo");
                    doc.Send(false, ref obj);
                    doc = null;
                }
            }
            catch (Exception ex)
            {
                //   Log.CreateLog(ex.Message);
            }
            finally
            {
                ns = null;
                db = null;
                doc = null;
            }
        }    
View Code

期間還遇到

由於這句代碼放置的位置不對,導致顯示不正確

doc.AppendItemValue("Principal", "C**********am");//設置郵件的發件人昵稱

最終突破的那一刻心情真的很爽,雖然到到現在仍然不知道不要密碼的原因,但總歸解決了困惑兩天的問題,不敢獨享

有時候就是聽別人說,這條路走不通,就不走了

有時候就是聽別人說,已經封裝好了,直接調吧,就調了而不知如何實現

有時候就是抄作業,以為自己會了,於是真真用的時候就不知道了

年前終於開始不那麽忙了,欠了那麽多,該慢慢補回來了

C# 使用 Lotus notes 公共郵箱發送郵件