0

0

C#WindowsService调用IBMLotusNotes发送邮件

php中文网

php中文网

发布时间:2016-07-06 13:30:22

|

1355人浏览过

|

来源于php中文网

原创

近日研究了下 IBMLotusMail ,这货果然是麻烦,由于公司策略,没有开放 smtp ,很多系统邮件都没有办法发送,于是入手 google 学习 LotusMail ,想做成 Windows 服务,提供 wcf 服务给内部应用系统使用。在 google 上找了很多资料,由于是系统邮件,很多东西

近日研究了下ibm lotus mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习lotus mail,想做成windows服务,提供wcf服务给内部应用系统使用。在google上找了很多资料,由于是系统邮件,很多东西配置起来又比较麻烦。自己也入了很多坑,特此作为记录。废话不多说,下面开始...

服务器环境:Windows Server 2008R2+Lotus Notes 8.5中文版

特别注意:Lotus Notes 8.5中文版需要配置好账户密码,但是不需要打开它。

本地环境:Lotus Notes 8.5中文版+Visual Studio 2013

~~~~~~~~~~~~~~~~~~~~~~~我是优雅的分隔符~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1,打开VS,新建类库项目LotusMailHelper,添加Lotus Domino Objects引用:

添加完之后VS会自动编译成dll

2,添加类Mail.cs,添加邮件发送方法SendMail

/// 

/// 发送邮件

/// 

/// 

/// 

/// 

public bool SendMail(string[] sendTo, string subject, string messageBody)

3,在Mail.cs添加Using:using Domino;

4,编写SendMail的逻辑

Domino.Notessession nSession = new Domino.NotesSession();
string pwd = System.Configuration.ConfigurationManager.AppSettings["LotusMailPassWord"];//lotus邮箱密码
string server = System.Configuration.ConfigurationManager.AppSettings["LotusMailServer"];//lotus邮箱服务器地址
string serverPath = System.Configuration.ConfigurationManager.AppSettings["LotusMailServerPath"];//存储nsf文件的路径
string saveMessageOnSend = System.Configuration.ConfigurationManager.AppSettings["SaveMessageOnSend"];//发送前是否保存
nSession.Initialize(pwd);//初始化邮件
Domino.NotesDatabase nDatabase =
nSession.GetDatabase(server, serverPath, false);
Domino.NotesDocument nDocument = nDatabase.CreateDocument();
nDocument.ReplaceItemValue("SentTo", sendTo);//收件人,数据:数组
nDocument.ReplaceItemValue("Subject", subject);//主题
if (saveMessageOnSend == "1")//为1时保存到lotus的发件箱
{
    nDocument.SaveMessageOnSend = true;
}
else
{
    nDocument.SaveMessageOnSend = false;//设置保存与否
}
NotesStream HtmlBody = nSession.CreateStream();
HtmlBody.WriteText(messageBody);//构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语
NotesMIMEEntity mine = nDocument.CreateMIMEEntity("Body");//构建邮件正文
mine.SetContentFromText(HtmlBody, "text/html;charset=UTF-8", Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
nDocument.AppendItemValue("PRincipal", "XXX管理员");//设置邮件的发件人昵称
nDocument.Send(false, sendTo); //发送邮件
nDocument.CloseMIMEEntities();//关闭

由于最后会封装为dll,最好是添加try...catch...,加以优化,下面为优化过后:

/// 
/// 發送lotus郵件(需要在web.config或者app.config中添加以下節點
///
/// 
///
/// 
///
/// 
///
/// 
///
///
/// 
/// 數組,收件人
/// 主題
/// 正文html
/// 
public bool SendMail(string[] sendTo, string subject, string messageBody)
{
    try
    {
        Domino.NotesSession nSession = new Domino.NotesSession();
        string pwd = System.Configuration.ConfigurationManager.AppSettings["LotusMailPassword"];//lotus邮箱密码
        string server = System.Configuration.ConfigurationManager.AppSettings["LotusMailServer"];//lotus邮箱服务器地址
        string serverPath = System.Configuration.ConfigurationManager.AppSettings["LotusMailServerPath"];//存储nsf文件的路径
        string saveMessageOnSend = System.Configuration.ConfigurationManager.AppSettings["SaveMessageOnSend"];//发送前是否保存
        nSession.Initialize(pwd);//初始化邮件
        Domino.NotesDatabase nDatabase =
        nSession.GetDatabase(server, serverPath, false);
        Domino.NotesDocument nDocument = nDatabase.CreateDocument();
        nDocument.ReplaceItemValue("SentTo", sendTo);//收件人,数据:数组
        nDocument.ReplaceItemValue("Subject", subject);//主题
        if (saveMessageOnSend == "1")//为1时保存到lotus的发件箱
        {
            nDocument.SaveMessageOnSend = true;
        }
        else
        {
            nDocument.SaveMessageOnSend = false;//设置保存与否
        }
        NotesStream HtmlBody = nSession.CreateStream();
        HtmlBody.WriteText(messageBody);//构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语
        NotesMIMEEntity mine = nDocument.CreateMIMEEntity("Body");//构建邮件正文
        mine.SetContentFromText(HtmlBody, "text/html;charset=UTF-8", Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
        nDocument.AppendItemValue("Principal", "XXX管理员");//设置邮件的发件人昵称
        nDocument.Send(false, sendTo); //发送邮件
        nDocument.CloseMIMEEntities();//关闭
        return true;//已经提交到lotus,返回true
    }
    catch
    {
        return false;//提交失败
    }
}

5,点击项目生成,找到Bin文件夹中的dll,保存到自己喜欢的文件夹,方便后期的调用

============我是更加优美的分隔符=============

下面一起来建立Windows service

1,打开VS,新建Windows服务项目

 名字随便取。。。新建完成之后会自动生成Service1.cs,打开Service1.cs代码看看,主要分为以下几个方法:

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }
    
    protected override void OnStart(string[] args)
    {
    }
    
    protected override void OnStop()
    {
    }
}
OnStart:主要是写入要启动的逻辑代码
OnStop:主要写的是停止服务时要执行的方法,也就是逻辑代码,我一般会将日志写在这

2,将service1.cs删除,新建一个Windows服务,并命名成公司要求的。例如我的是MailService.cs。

3,新建一个处理邮件的方法:

public void SendMail()
{
    while(true)
    {
        //这里写邮件数据获取以及发送邮件
        Thread.Sleep(100);
    }   
}

4,构建邮件model:在解决方案点击鼠标右键添加新建项目,选择类库项目,MailModel,新建MailInfo.cs

public class MailInfo
{
    public string mailId { get; set; }
    public string[] sendTo { get; set; }
    public string subject { get; set; }
    public string mailBody { get; set; }
}

5,新建类库DbHelper,添加类Mail.cs,在里面写GetMailData()方法,RemoveMailData(),GetMailCount(),InsertMailData()等方法,这里由于涉及到公司的信息,不是很方便写出来。大家可以自行添加进去

public MailModel.MailInfo GetMailData()
{
    //这里写获取邮件数据
    return MailInfo;//返回数据库第一封待发邮件数据
}
public void RemoveMailData(string mailId)
{
    //删除数据库中指定id的邮件数据
}
public long GetMailCount()
{
    //这里写获取邮件数量
    return 邮件数量
}
public bool InsertMailData()
{
    //这里写插入一封邮件数据
    return true;
}

6,新建类库WCF项目,添加wcf,名字为SendMail

添加完成之后VS会自动生成ISendMail.cs和SendMail.cs。打开ISendMail.cs会看到如下代码

// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ISendMail”。
[ServiceContract]
public interface ISendMail
{
    [OperationContract]
    void DoWork();
}

里面只有一个DoWork方法,我们新建一个ApplySendMail();注意:在顶上要添加[OperationContract]否则不会公开该函数。最后的ISendMail.cs代码如下

[ServiceContract]
public interface ISendMail
{
    [OperationContract]
    string ApplySendMail(string[] sendTo, string subject, string body, string password);
}

接着打开SendMail.cs,去实现接口的ApplySendMail()方法

public class SendMail : ISendMail
{
    public string ApplySendMail(string[] sendTo, string subject, string body, string password)
    {
        string result = string.Empty;
        string mailPassword = System.Configuration.ConfigurationManager.AppSettings["password"];
        if (mailPassword == password)
        {
            try
            {
                MailModel.MailInfo mail = new MailModel.MailInfo
                {
                    sendTo = sendTo,
                    subject = subject,
                    mailBody = body
                };
                long count = DbHelper.Mail.GetMailCount();
                if (DbHelper.Mail.InsertMailData(mail))
                {
                    result = string.Format("提交成功.前面大約還有:{0}個任務", count);
                }
                return result;
            }
            catch
            {
                return "提交失敗";
            }
        }
        else
        {
            return "密码错误,无法提交";
        }
    }
}

至此wcf基础已经可以了,下面继续完成Windows服务那一块

迦恩计算机资源网源码(图书销售类)
迦恩计算机资源网源码(图书销售类)

采用三层架构开发,前台集成了产品在线展示,用户注册、在线调查、在线投稿后台有类别管理\图书管理\订单管理\会员管理\配送范围管理\邮件列表\广告管理\友情链接管理等后台添加图书时自动生成缩略图和文字水印主要参考了petshop的设计架构、使用了Asp.net2.0中很多MemberShip、master等新功能后台管理地址/web/admin/ 超级管理员账号密码均为aspx1特别提示:该系统需要

下载

7,完成处理邮件的方法SendMail(),这里要添加之前写好的LoutusMailHelper.dll

public void SendMail()
{
    while(true)
    {
        var mailData=DbHelper.Mail.GetMailData();
        if(mailData!=null)
        {
            if(LotusMailHelper.Mail.SendMail(mailData.sendTo,mailData.subject,mailData.mailBody))
            {
                DbHelper.Mail.RemoveMailData(mailData.mailId);
            }
            Thread.Sleep(100);//休息0.1秒
        }
        else
        {
            Thread.Sleep(10000);//休息10秒钟
        }       
    }   
}

8,完成OnStart()逻辑:①,先添加私有成员到MailService.cs

partial class MailService : ServiceBase
{
    public MailService()
    {
        InitializeComponent();
    }
    private System.ServiceModel.ServiceHost _host;
    
    /*
    此处省略部分代码
    */
}

②,编写OnStart()代码

protected override void OnStart(string[] args)
{
    _host = new System.ServiceModel.ServiceHost(typeof(WCF.Mail));
    _host.Open();
    //启动wcf服务
    
    //启动一个线程专门轮询发送邮件
    Thread sendMail = new Thread(new ThreadStart(SendMail));
    sendMail.IsBackground = true;
    sendMail.Start();
}

9,编写OnStop()代码,添加日志记录代码

10,配置App.config,wcf一定要配置。先看App.config中是否存在system.serviceModel节点,存在的话只需修改部分字段即可,不存在的话添加如下:


    
      
        "">
          "true" httpsGetEnabled="true" />
          "false" />
        
      
    
    
      "WCF.Mail">
        "" binding="basicHttpBinding" contract="WCF.IMail">
          
            "localhost" />
          
        
        "mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        
        
          
            "http://localhost:8733/MailService/Mail/" />
          
        
        
      
    
  

~~至此,基本的都已经完成,下面到Windows service部署

1,打开MailService.cs视图界面,添加安装程序。会自动出现如下界面:

选中serviceProcessInstaller1组件,查看属性,设置account为LocalSystem

选中serviceInstaller1组件,查看属性

设置ServiceName的值, 该值表示在系统服务中的名称

设置StartType, 如果为Manual则手动启动,默认停止,如果为Automatic为自动启动

设置Description,添加服务描述

2,重新生成项目

3,打开Windows的cmd,输入C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe exe路径

等待安装。安装完毕之后打开计算机管理,查看服务,点击启动。

***删除服务:sc delete 服务名

 

至此,所有步骤都完成了,可以畅快的调用wcf来发送系统邮件了

>>>>>>>>>>>>>

 

 百度经验 : C#创建Windows服务与安装-图解

 

推荐数据库使用nosql数据库,redis或者mongodb,在接下里的随笔里我会记录mongdb和redis的使用过程。。。第一次发文,紧张死宝宝了

 


本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.1万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 15.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号