C# 使用 Lotus notes 公共邮箱发送邮件
公司的邮件系统用的是反人类的 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 = To UBound(Attach)
strAttach = Attach(i)
If Len(strAttach) > And Len(Dir(strAttach)) > 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 = 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
但是现实情况是这样的
我们需要邮件从公邮发送出去
何谓公邮:整个Team使用的邮箱,如***admin@email.com 之类的邮箱
使用过反人类的 Lotus notes 都知道公邮是需要先打开个人邮箱才能进去的
于是当我把以上的VBA 代码增加如下代码,设置从公邮里面发送邮件后
Server = "C***/****r/****"
Path = "****\C*****.nsf"
Set db = s.GetDataBase(Server, Path)
邮件确实是从公邮发送出来,但是很遗憾,邮件发送人那显示的是我的个人邮箱,而查看我个人的已发送邮件,是完全查不到,但是在公邮已发送邮件可以看到
这就无法理解了,于是开启了漫长的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 = ; 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;
}
}
抱着必死的心态小心翼翼的点击了调试
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;
}
}
期间还遇到
由于这句代码放置的位置不对,导致显示不正确
doc.AppendItemValue("Principal", "C**********am");//设置邮件的发件人昵称
最终突破的那一刻心情真的很爽,虽然到到现在仍然不知道不要密码的原因,但总归解决了困惑两天的问题,不敢独享
有时候就是听别人说,这条路走不通,就不走了
有时候就是听别人说,已经封装好了,直接调吧,就调了而不知如何实现
有时候就是抄作业,以为自己会了,于是真真用的时候就不知道了
年前终于开始不那么忙了,欠了那么多,该慢慢补回来了
C# 使用 Lotus notes 公共邮箱发送邮件的更多相关文章
- Lotus Notes中编程发送邮件(二)
在编程发送各种类似通知的邮件时,时常会需要发件人显示为某个特定的帐户,比如某个部门的名称或者管理员的名字.另一种需求是,用户收到某封邮件后,回复邮件的地址不同于发件人栏显示的地址.而正常情况下,发送邮 ...
- 46. Lotus Notes中编程发送邮件(一)
邮件是Lotus Notes体系的核心和基本功能,以至于Send()是NotesDocument的一个方法,任何一个文档都可以被发送出去,Notes里的一封邮件也只是一个有一些特殊字段的文档.在程序开 ...
- C# Windows Service调用IBM Lotus Notes发送邮件
近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf ...
- 55. 略谈Lotus Notes的与众不同及系列文章至此的总结
在二十多年的悠久历史里,Lotus Notes发展出一整套独特的概念.技术和思维.由于它早期惊人的领先时代和后续发展中同样惊人的忠于传统,这位软件领域的寿星在如今发展更新速度远超往日和技术愈趋公开互通 ...
- 52. 模版和设计元素——Lotus Notes的代码重用
不论是理论上还是实用上,代码重用都是编程的一个重要议题.可以从两个角度来讨论代码重用. 一是逻辑上代码以怎样的方式被重用.既可以通过面向对象的思想普及以来耳熟能详的继承的方式.比如先建了一个车的基类, ...
- Lotus Notes 学习笔记
这是一个学习关于如何使用Lotus Notes的Agent功能来实现自动化办公的学习笔记. 一. 介绍 Lotus Notes/Domino 是一个世界领先的企业级通讯.协同工作及Internet/I ...
- 杂项之使用qq邮箱发送邮件
杂项之使用qq邮箱发送邮件 本节内容 特殊设置 测试代码 1. 特殊设置 之前QQ邮箱直接可以通过smtp协议发送邮件,不需要进行一些特殊的设置,但是最近使用QQ邮箱测试的时候发现以前使用的办法无法奏 ...
- 使用LotusScript操作Lotus Notes RTF域
Lotus Notes RTF域的功能也非常强大,除了支持普通的文本以外,还支持图片.表格.嵌入对象.Http 链接.Notes 链接.附件等等众多的类型.本文将介绍如何使用这些类来灵活操作富文本域. ...
- DEDECMS会员注册如何配置邮箱发送邮件功能
网站邮件功能是一个非常基础和有效的通信工具,配合dede会员注册邮件验证功能可以大量的拒绝垃圾注册用户.那么如何配置DEDECMS会员注册邮箱发送邮件功能? 1:配置dedecms网站发信EMAI ...
随机推荐
- Sublime Text 3.0版本的傻瓜式汉化步骤
Sublime text 3是非常好的文本编辑器,在试用过N款文本编辑器(Notepad.Notepad++.Notepad2.Programmer's notepad.EditPlus,Vim, T ...
- [国嵌攻略][045-046][一跃进入C大门]
[一跃进入C大门] 跳转方式 1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转 2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转 代码编写 1.在汇编代码中直接使用 ...
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
前文使用Docker搭建Jenkins+Docker持续集成环境我们已经搭建了基于docker+jenkins的持续集成环境,并构建了基于maven的项目.这一节,我们继续扩展功能,增加对Nodejs ...
- 使用 Gacutil.exe 将.Net程序集添加到GAC的方法
使用gacutil.exe工具安装:gacutil -i "要注册的dll文件全路径" "gacutil.exe”工具为.NET自带工具 ,需要注意的是:这个工具在.NE ...
- Node.js系列-http
前言: 最近一直忙着公司项目的事,战友们的留言也没空回复,博客也有段时间没有更新了,年底了就是一个的忙啊~~~(ps:同感的也给个赞吧) 现在前端的就是一直地更新一直有新的东西出来,什么ES2015, ...
- java 静态导入 小结
之前看过静态导入这一块,在编程思想里,但是记不清了,今天搜了下,看到有一个博文写的不错,所以留做备注吧 总结: import static xxx.xxx 和普通导入的区别在于,普通导入是需要通过& ...
- debian 9 双显卡安装NVIDIA显卡驱动
最近用debian,给debian装n卡驱动折腾了好几天了,主要还是网络不好,官方wiki的方法下载经常卡死..摸索了几天感觉已经摸到了头绪,决定写下来供大家参考参考 先提供单显卡NVIDIA驱动的安 ...
- 规范的python编码
规范的 python 编码令人赏心悦目,令代码的表达逻辑更清晰,使得工程代码更容易被维护和交流: 编码规范包括对于代码书写格式的约束,不良语法的禁用和推荐的编码手法,下面做些简要的描述: 1. 代码规 ...
- 没有选择上传的文件或选择的文件大小超出大小(DEDECMS亲身试验成功)
dedecms升级到5.7后,后台上传压缩包文件,提示"没有选择上传的文件或选择的文件大小超出大小",由于很久都没弄这个系统了,所以最早怎么设置的也忘记了,就上百度搜,基本上有说的 ...
- 阿里巴巴Java开发手册评
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...