C#中利用Lotus notes公共郵箱發(fā)送郵件的方法
前言
公司的郵件系統(tǒng)用的是反人類的 Lotus notes, 你敢信?
最近要實(shí)現(xiàn)一個(gè)功能,郵件提醒功能,就是通過自動(dòng)發(fā)送提醒郵件
前前后后這個(gè)問題搞了2天,由于公司的諸多條件限制,無法直接調(diào)用到公司發(fā)送郵件的接口,只有通過類似 Lotus script,VBA 等其他方式來實(shí)現(xiàn)。
用VBA代碼實(shí)現(xiàn)發(fā)送郵件,其實(shí)我在n年前就實(shí)現(xiàn)過了
代碼如下,網(wǎng)上一搜也一大堆
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
VBA
但是現(xiàn)實(shí)情況是這樣的
我們需要郵件從公郵發(fā)送出去
何謂公郵:整個(gè)Team使用的郵箱,如***admin@email.com 之類的郵箱
使用過反人類的 Lotus notes 都知道公郵是需要先打開個(gè)人郵箱才能進(jìn)去的
于是當(dāng)我把以上的VBA 代碼增加如下代碼,設(shè)置從公郵里面發(fā)送郵件后
Server = "C***/****r/****" Path = "****\C*****.nsf" Set db = s.GetDataBase(Server, Path)
郵件確實(shí)是從公郵發(fā)送出來,但是很遺憾,郵件發(fā)送人那顯示的是我的個(gè)人郵箱,而查看我個(gè)人的已發(fā)送郵件,是完全查不到,但是在公郵已發(fā)送郵件可以看到
這就無法理解了,于是開啟了漫長的2天人類大戰(zhàn)反人類Lotus notes戰(zhàn)役
前前后后試過各種VBA代碼【表問為什么不直接調(diào)接口】
但要不就是能顯示為公郵發(fā)送的,但郵件 body 不能Html格式,否則就是相反,總之一句話:二者不可兼得
期間看遍國內(nèi)外關(guān)于Lotus notes VBA的網(wǎng)站
最后,實(shí)在是忍不了了,開始搜索Python,C#
一直猶猶豫豫沒有寫是因?yàn)橥赂嬖V我,比如使用C#就需要郵箱密碼,而這個(gè)東西我們沒有也不會(huì)有的
最后的最后,決定賭一把,我先用C#,直接寫出來,等報(bào)錯(cuò)提示密碼沒有的時(shí)候我再想辦法
于是戰(zhàn)戰(zhàn)兢兢有了以下代碼
/// <summary>
/// 通過notes發(fā)送郵件
/// </summary>
/// <param name="mailTo">實(shí)時(shí)數(shù)據(jù)庫</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)
{
//您本機(jī)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");//設(shè)置郵件的發(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;
}
}
抱著必死的心態(tài)小心翼翼的點(diǎn)擊了調(diào)試
WTF!!!!
居然收到一封有郵件!沒有密碼啊!不需要密碼嗎!密碼不用也能發(fā)送?。?!
再試了一次后,發(fā)現(xiàn)真的不需要!??!
因?yàn)槲覀兠刻扉_機(jī)打開notes的時(shí)候也不需要輸入密碼?。?!這可能是和本機(jī)的ID文件有綁定!!!在畢業(yè)后的第一家公司中是需要輸入密碼的!
于是欣喜若狂
開始修改代碼
最終版本
/// <summary>
/// 通過notes發(fā)送郵件
/// </summary>
/// <param name="mailTo">實(shí)時(shí)數(shù)據(jù)庫/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)
{
//您本機(jī)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);//構(gòu)建HTML郵件,可以在頭和尾添加公司的logo和系統(tǒng)提醒語
NotesMIMEEntity mine = doc.CreateMIMEEntity("Body");//構(gòu)建郵件正文
mine.SetContentFromText(HtmlBody, "text/html;charset=UTF-8", Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
doc.AppendItemValue("Principal", "C**********am");//設(shè)置郵件的發(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;
}
}
期間還遇到
由于這句代碼放置的位置不對(duì),導(dǎo)致顯示不正確
doc.AppendItemValue("Principal", "C**********am");//設(shè)置郵件的發(fā)件人昵稱
最終突破的那一刻心情真的很爽,雖然到到現(xiàn)在仍然不知道不要密碼的原因,但總歸解決了困惑兩天的問題,不敢獨(dú)享
有時(shí)候就是聽別人說,這條路走不通,就不走了
有時(shí)候就是聽別人說,已經(jīng)封裝好了,直接調(diào)吧,就調(diào)了而不知如何實(shí)現(xiàn)
有時(shí)候就是抄作業(yè),以為自己會(huì)了,于是真真用的時(shí)候就不知道了
年前終于開始不那么忙了,欠了那么多,該慢慢補(bǔ)回來了
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:C#將PDF轉(zhuǎn)為多種圖像文件格式的方法(Png/Bmp/Emf/Tiff)
欄 目:C#教程
下一篇:C# 實(shí)現(xiàn)拖拉控件改變位置與大小的方法
本文標(biāo)題:C#中利用Lotus notes公共郵箱發(fā)送郵件的方法
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5277.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10C#實(shí)現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實(shí)現(xiàn)由四周向中心縮小的窗體退出特效
- 01-10Extjs4如何處理后臺(tái)json數(shù)據(jù)中日期和時(shí)間
- 01-10C#中DataGridView常用操作實(shí)例小結(jié)
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#利用反射技術(shù)實(shí)現(xiàn)去掉按鈕選中時(shí)的邊框效果
- 01-10C#中查找Dictionary中的重復(fù)值的方法
- 01-10C#中TreeView實(shí)現(xiàn)適合兩級(jí)節(jié)點(diǎn)的選中節(jié)點(diǎn)方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什


