C#中利用Lotus notes公共邮箱发送邮件的方法
前言
公司的邮件系统用的是反人类的Lotusnotes,你敢信?
最近要实现一个功能,邮件提醒功能,就是通过自动发送提醒邮件
前前后后这个问题搞了2天,由于公司的诸多条件限制,无法直接调用到公司发送邮件的接口,只有通过类似Lotusscript,VBA等其他方式来实现。
用VBA代码实现发送邮件,其实我在n年前就实现过了
代码如下,网上一搜也一大堆
FunctionSendEmailbyNotesWithAttachement_2(Addresses,Attach,cc) strSubject=ThisWorkbook.Sheets("EMAIL").Range("B1") strbody=ThisWorkbook.Sheets("EMAIL").Range("A1") 'DeclareVariables DimsAsObject DimdbAsObject DimbodyAsObject DimbodyChildAsObject DimheaderAsObject DimstreamAsObject DimhostAsString DimmessageAsObject 'Notesvariables Sets=CreateObject("Notes.NotesSession") Setdb=s.CURRENTDATABASE Setstream=s.CreateStream 'Turnoffautoconversiontortf s.ConvertMIME=False 'Createmessage Setmessage=db.CREATEDOCUMENT message.Form="memo" message.Subject=strSubject message.sendTo=Split(Addresses,";") message.CopyTo=cc message.SaveMessageOnSend=True 'CreatethebodytoholdHTMLandattachment Setbody=message.CreateMIMEEntity 'ChildmimeentitywhichisgoingtocontaintheHTMLwhichweputinthestream SetbodyChild=body.CreateChildEntity() Callstream.WriteText(strbody) CallbodyChild.SetContentFromText(stream,"text/HTML;charset=UTF-8",ENC_NONE) Callstream.Close Callstream.Truncate 'Thiswillrunthoughanarrayofattachmentpathsandaddthemtotheemail Fori=0ToUBound(Attach) strAttach=Attach(i) IfLen(strAttach)>0AndLen(Dir(strAttach))>0Then 'Gettheattachmentfilename pos=InStrRev(strAttach,"\") Filename=Right(strAttach,Len(strAttach)-pos) 'Anewchildmimeentitytoholdafileattachment SetbodyChild=body.CreateChildEntity() Setheader=bodyChild.CreateHeader("Content-Type") Callheader.SetHeaderVal("multipart/mixed") Setheader=bodyChild.CreateHeader("Content-Disposition") Callheader.SetHeaderVal("attachment;filename="&Filename) Setheader=bodyChild.CreateHeader("Content-ID") Callheader.SetHeaderVal(Filename) Setstream=s.CreateStream() IfNotstream.Open(strAttach,"binary")Then MsgBox"Openfailed" EndIf Ifstream.Bytes=0Then MsgBox"Filehasnocontent" EndIf CallbodyChild.SetContentFromBytes(stream,"application/octet-stream",ENC_IDENTITY_BINARY)'Allmyattachmentsareexcelthiswouldneedchangingdepensdingonyourattachments. EndIf Next 'Sendtheemail Callmessage.Send(False) s.ConvertMIME=True'Restoreconversion EndFunction VBA
但是现实情况是这样的
我们需要邮件从公邮发送出去
何谓公邮:整个Team使用的邮箱,如***admin@email.com之类的邮箱
使用过反人类的Lotusnotes都知道公邮是需要先打开个人邮箱才能进去的
于是当我把以上的VBA代码增加如下代码,设置从公邮里面发送邮件后
Server="C***/****r/****" Path="****\C*****.nsf" Setdb=s.GetDataBase(Server,Path)
邮件确实是从公邮发送出来,但是很遗憾,邮件发送人那显示的是我的个人邮箱,而查看我个人的已发送邮件,是完全查不到,但是在公邮已发送邮件可以看到
这就无法理解了,于是开启了漫长的2天人类大战反人类Lotusnotes战役
前前后后试过各种VBA代码【表问为什么不直接调接口】
但要不就是能显示为公邮发送的,但邮件body不能Html格式,否则就是相反,总之一句话:二者不可兼得
期间看遍国内外关于LotusnotesVBA的网站
最后,实在是忍不了了,开始搜索Python,C#
一直犹犹豫豫没有写是因为同事告诉我,比如使用C#就需要邮箱密码,而这个东西我们没有也不会有的
最后的最后,决定赌一把,我先用C#,直接写出来,等报错提示密码没有的时候我再想办法
于是战战兢兢有了以下代码
//////通过notes发送邮件 /// ///实时数据库 /// publicstaticvoidSendForNotes() { stringnotesPwd=""; stringnotesServer="C***3/C***/***r/***C"; stringNotesDBName=@"M**l\C***to.nsf"; stringmailTo="m****o@c**.***.com"; stringmailSubject=DateTime.Now.ToString(); stringmailBoby=" Month Savings "; NotesSessionns; NotesDatabasedb; NotesDocumentdoc; try { ns=newNotesSession(); 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");//设置邮件的发件人昵称 NotesRichTextItemrt=doc.CreateRichTextItem("Body"); varrichStyle=ns.CreateRichTextStyle(); richStyle.PassThruHTML=1; rt.AppendStyle(richStyle); rt.AppendText(mailBoby); //发送邮件 objectobj=doc.GetItemValue("SendTo"); doc.Send(false,refobj); doc=null; } } catch(Exceptionex) { //Log.CreateLog(ex.Message); } finally { ns=null; db=null; doc=null; } } January $100
抱着必死的心态小心翼翼的点击了调试
WTF!!!!
居然收到一封有邮件!没有密码啊!不需要密码吗!密码不用也能发送!!!
再试了一次后,发现真的不需要!!!
因为我们每天开机打开notes的时候也不需要输入密码!!!这可能是和本机的ID文件有绑定!!!在毕业后的第一家公司中是需要输入密码的!
于是欣喜若狂
开始修改代码
最终版本
//////通过notes发送邮件 /// ///实时数据库/lysh /// publicstaticvoidSendForNotes2() { stringnotesPwd=""; stringnotesServer="C****3/**/S***/****"; stringNotesDBName=@"****\******.nsf"; stringmailTo="****t**@***.com"; stringmailSubject=DateTime.Now.ToString(); stringmailBoby=" Month Savings "; NotesSessionns; NotesDatabasedb; NotesDocumentdoc; try { ns=newNotesSession(); 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; NotesStreamHtmlBody=ns.CreateStream(); HtmlBody.WriteText(mailBoby);//构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语 NotesMIMEEntitymine=doc.CreateMIMEEntity("Body");//构建邮件正文 mine.SetContentFromText(HtmlBody,"text/html;charset=UTF-8",Domino.MIME_ENCODING.ENC_IDENTITY_BINARY); doc.AppendItemValue("Principal","C**********am");//设置邮件的发件人昵称 //发送邮件 objectobj=doc.GetItemValue("SendTo"); doc.Send(false,refobj); doc=null; } } catch(Exceptionex) { //Log.CreateLog(ex.Message); } finally { ns=null; db=null; doc=null; } } January $100
期间还遇到
由于这句代码放置的位置不对,导致显示不正确
doc.AppendItemValue("Principal","C**********am");//设置邮件的发件人昵称
最终突破的那一刻心情真的很爽,虽然到到现在仍然不知道不要密码的原因,但总归解决了困惑两天的问题,不敢独享
有时候就是听别人说,这条路走不通,就不走了
有时候就是听别人说,已经封装好了,直接调吧,就调了而不知如何实现
有时候就是抄作业,以为自己会了,于是真真用的时候就不知道了
年前终于开始不那么忙了,欠了那么多,该慢慢补回来了
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。