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

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

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

 前先後後這個問題搞了2天,因爲公司的諸多條件限制,沒法直接調用到公司發送郵件的接口,只有經過相似 Lotus script,VBA 等其餘方式來實現。app

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

代碼以下,網上一搜也一大堆網站

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

 可是現實狀況是這樣的this

咱們須要郵件從公郵發送出去spa

何謂公郵:整個Team使用的郵箱,如***admin@email.com 之類的郵箱調試

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

因而當我把以上的VBA 代碼增長以下代碼,設置從公郵裏面發送郵件後code

     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");//設置郵件的發件人暱稱

 

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

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

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

有時候就是抄做業,覺得本身會了,因而真真用的時候就不知道了

 

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

相關文章
相關標籤/搜索