C# 使用 Lotus notes 公共邮箱发送邮件
公司的郵件系統(tǒng)用的是反人類的 Lotus notes, 你敢信?
最近要實現一個功能,郵件提醒功能,就是通過自動發(fā)送提醒郵件
?前前后后這個問題搞了2天,由于公司的諸多條件限制,無法直接調用到公司發(fā)送郵件的接口,只有通過類似 Lotus script,VBA 等其他方式來實現。
用VBA代碼實現發(fā)送郵件,其實我在n年前就實現過了
代碼如下,網上一搜也一大堆
Function SendEmailbyNotesWithAttachement_2(Addresses, Attach, cc)strSubject = ThisWorkbook.Sheets("EMAIL").Range("B1")strbody = ThisWorkbook.Sheets("EMAIL").Range("A1")'Declare VariablesDim s As ObjectDim db As ObjectDim body As ObjectDim bodyChild As ObjectDim header As ObjectDim stream As ObjectDim host As StringDim message As Object' Notes variablesSet s = CreateObject("Notes.NotesSession")Set db = s.CURRENTDATABASESet stream = s.CreateStream' Turn off auto conversion to rtfs.ConvertMIME = False' Create messageSet message = db.CREATEDOCUMENTmessage.Form = "memo"message.Subject = strSubjectmessage.sendTo = Split(Addresses, ";")message.CopyTo = ccmessage.SaveMessageOnSend = True' Create the body to hold HTML and attachmentSet body = message.CreateMIMEEntity'Child mime entity which is going to contain the HTML which we put in the streamSet bodyChild = body.CreateChildEntity()Call stream.WriteText(strbody)Call bodyChild.SetContentFromText(stream, "text/HTML;charset=UTF-8", ENC_NONE)Call stream.CloseCall stream.Truncate' This will run though an array of attachment paths and add them to the emailFor i = 0 To UBound(Attach)strAttach = Attach(i)If Len(strAttach) > 0 And Len(Dir(strAttach)) > 0 Then' Get the attachment file namepos = InStrRev(strAttach, "\")Filename = Right(strAttach, Len(strAttach) - pos)'A new child mime entity to hold a file attachmentSet 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") ThenMsgBox "Open failed"End IfIf stream.Bytes = 0 ThenMsgBox "File has no content"End IfCall bodyChild.SetContentFromBytes(stream, "application/octet-stream", ENC_IDENTITY_BINARY) ' All my attachments are excel this would need changing depensding on your attachments.End IfNext'Send the emailCall message.Send(False)s.ConvertMIME = True ' Restore conversionEnd Function View Code VBA?但是現實情況是這樣的
我們需要郵件從公郵發(fā)送出去
何謂公郵:整個Team使用的郵箱,如***admin@email.com 之類的郵箱
使用過反人類的 Lotus notes 都知道公郵是需要先打開個人郵箱才能進去的?
于是當我把以上的VBA 代碼增加如下代碼,設置從公郵里面發(fā)送郵件后
Server = "C***/****r/****"Path = "****\C*****.nsf"Set db = s.GetDataBase(Server, Path) View Code郵件確實是從公郵發(fā)送出來,但是很遺憾,郵件發(fā)送人那顯示的是我的個人郵箱,而查看我個人的已發(fā)送郵件,是完全查不到,但是在公郵已發(fā)送郵件可以看到
這就無法理解了,于是開啟了漫長的2天人類大戰(zhàn)反人類Lotus notes戰(zhàn)役
前前后后試過各種VBA代碼【表問為什么不直接調接口】
但要不就是能顯示為公郵發(fā)送的,但郵件 body 不能Html格式,否則就是相反,總之一句話:二者不可兼得
期間看遍國內外關于Lotus notes VBA的網站
最后,實在是忍不了了,開始搜索Python,C#
一直猶猶豫豫沒有寫是因為同事告訴我,比如使用C#就需要郵箱密碼,而這個東西我們沒有也不會有的
最后的最后,決定賭一把,我先用C#,直接寫出來,等報錯提示密碼沒有的時候我再想辦法
于是戰(zhàn)戰(zhàn)兢兢有了以下代碼
/// <summary>/// 通過notes發(fā)送郵件/// </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);//初始化NotesDatabasedb = 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");//設置郵件的發(fā)件人昵稱NotesRichTextItem rt = doc.CreateRichTextItem("Body");var richStyle = ns.CreateRichTextStyle();richStyle.PassThruHTML = 1;rt.AppendStyle(richStyle);rt.AppendText(mailBoby);//發(fā)送郵件 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抱著必死的心態(tài)小心翼翼的點擊了調試
WTF!!!!
居然收到一封有郵件!沒有密碼啊!不需要密碼嗎!密碼不用也能發(fā)送!!!
再試了一次后,發(fā)現真的不需要!!!
因為我們每天開機打開notes的時候也不需要輸入密碼!!!這可能是和本機的ID文件有綁定!!!在畢業(yè)后的第一家公司中是需要輸入密碼的!
于是欣喜若狂
開始修改代碼
最終版本
/// <summary>/// 通過notes發(fā)送郵件/// </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);//初始化NotesDatabasedb = 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和系統(tǒng)提醒語NotesMIMEEntity mine = doc.CreateMIMEEntity("Body");//構建郵件正文mine.SetContentFromText(HtmlBody, "text/html;charset=UTF-8", Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);doc.AppendItemValue("Principal", "C**********am");//設置郵件的發(fā)件人昵稱//發(fā)送郵件 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");//設置郵件的發(fā)件人昵稱
?
最終突破的那一刻心情真的很爽,雖然到到現在仍然不知道不要密碼的原因,但總歸解決了困惑兩天的問題,不敢獨享
有時候就是聽別人說,這條路走不通,就不走了
有時候就是聽別人說,已經封裝好了,直接調吧,就調了而不知如何實現
有時候就是抄作業(yè),以為自己會了,于是真真用的時候就不知道了
?
年前終于開始不那么忙了,欠了那么多,該慢慢補回來了
?
轉載于:https://www.cnblogs.com/LionelMessi/p/8447879.html
總結
以上是生活随笔為你收集整理的C# 使用 Lotus notes 公共邮箱发送邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四十九日祭
- 下一篇: .Net Cancellable Tas