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 = 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

但是现实情况是这样的

我们需要邮件从公邮发送出去

何谓公邮:整个Team使用的邮箱,如***[email protected] 之类的邮箱

使用过反人类的 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****[email protected]**.***.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;
            }
        }

抱着必死的心态小心翼翼的点击了调试

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");//设置邮件的发件人昵称

最终突破的那一刻心情真的很爽,虽然到到现在仍然不知道不要密码的原因,但总归解决了困惑两天的问题,不敢独享

有时候就是听别人说,这条路走不通,就不走了

有时候就是听别人说,已经封装好了,直接调吧,就调了而不知如何实现

有时候就是抄作业,以为自己会了,于是真真用的时候就不知道了

年前终于开始不那么忙了,欠了那么多,该慢慢补回来了

原文地址:https://www.cnblogs.com/LionelMessi/p/8447879.html

时间: 2024-10-18 00:23:36

C# 使用 Lotus notes 公共邮箱发送邮件的相关文章

C#操作Lotus Notes邮件

之前的公司一直用outlook,朋友的公司在用IBM的Lotus Notes,找我说希望我帮忙做一个基于Notes的邮件提醒功能.但是无法让公司内IT来协助,也就意味着只能在User的电脑上来处理了. Google了下,有C#的API,并查到在Notes在安装时会在本地配置文件中写入Server Name及基于当前用户的file.好,开干! 首先需要引入Interop.Domino.dll,这个可以去网上找(240K),也可以直接用NuGet搜Domino. 主要写了两个发邮件的Demo方法,一

基于java mail实现简单的QQ邮箱发送邮件

刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 SMTP 服务 完成验证 获取授权码(后面代码实现时使用) -----------------------------第二步 环境配置 即下载第三方库 https://github.com/javaee/javamail/releases -----------------------------第三步 代

杂项之使用qq邮箱发送邮件

杂项之使用qq邮箱发送邮件 本节内容 特殊设置 测试代码 1. 特殊设置 之前QQ邮箱直接可以通过smtp协议发送邮件,不需要进行一些特殊的设置,但是最近使用QQ邮箱测试的时候发现以前使用的办法无法奏效了...于是上网查了查,QQ对这方面做了一些限制,必须使用授权码才能登陆邮箱.官方链接在这:http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256按照上面的官方文档配置好之后就可以使用QQ邮箱发

lotus notes 数据库中附件的批量导出 2

Lotus Notes 数据库中附件的批量导出 Lotus Notes 数据库是一种文档型数据库,其中文档的富文本域中往往嵌入许多附件(如 Word 文档.PDF 文档.Excel 文档等).用户时常需要将这些附件导出到其他系统中进行使用处理.然而当需要导出许多文档中的附件时,只能手动逐个打开各个文档并将附件导出,然后再将附件导入到其他系统中,那么,当附件数量很大时则会大大降低效率.本文从用户角度出发,分析了若干附件批量导出的需求并给出了相应的解决方案. 引言 Notes 数据库是一种文档型数据

CentOS7像外部163邮箱发送邮件

我们在运维过程中,为了随时了解服务器的工作状态,出现问题随时提醒,像个人邮箱发送邮件是必须的,但是刚刚安装好的系统是无法发送邮件的.需要们进行一些配置和程序的安装,我安装完系统后,自带mail12.5,依然无法外发邮件. 第一步,安装sendmail,和sendmail-cf 使用命令: yum install -y sendmail yum install -y sendmail-cf yum源安装是最方便的安装,自动解决依赖关系. 第二步,配置sendmail.mc 文件 vi /etc/m

演示账号激活的过程:注册——&gt;向指定邮箱发送邮件——&gt;用户登录邮箱,激活账号

今天无意间找到了大学时写的一个功能模块,整理了一把,没做太大的改动,不由得感慨--那时写的代码实在是......呵呵呵,不过这个模块的逻辑过程是对的,现将其贡献出来: 本工程用于演示账号激活的过程:注册-->向指定邮箱发送邮件-->用户登录邮箱,激活账号 本工程编码方式:UTF-8 须执行的sql语句: create database `test`; create table `user` ( `id` char(36) not null comment '用户id', `userName`

asp.net使用qq邮箱发送邮件

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Mail; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class Cemail : System.Web.U

DEDECMS会员注册如何配置邮箱发送邮件功能

网站邮件功能是一个非常基础和有效的通信工具,配合dede会员注册邮件验证功能可以大量的拒绝垃圾注册用户.那么如何配置DEDECMS会员注册邮箱发送邮件功能? 1:配置dedecms网站发信EMAIL 登录dede管理后台->系统->系统基本参数设置->核心设置->选择“网站发信EMAIL:”输入你的发信邮箱,本演示教程使用QQ邮箱来示范——[email protected](说明:防止垃圾邮件的骚扰,@符号将用*替换),详细见下图: 2:配置dedecms发信邮件smtp参数 设置

qq邮箱发送邮件封装

使用qq发送邮件 # coding=utf8 """ qq邮箱发送邮件 """ import sys reload(sys) sys.setdefaultencoding('utf8') import smtplib from email.mime.text import MIMEText class QQMailClient(): """使用qq邮箱发送邮件""" def __init