刚到这个工厂工作的时候,这个工厂的一个应用需要将某个发件人发来的邮件中的附件保存在指定的目录下,以便另外一个服务去指定目录下读取这个附件。不过有一个问题是这个应用一直运行的不是很稳定,有的时候它并不能将附件正确保存,并且占用资源较大,后来也引起了一个生产问题。在后来的某个空闲的时刻,便写了这样一个windows service,目前该服务已经稳定运行三月有余,它具有以下功能:
- 支持多个邮箱账号
- 支持将邮箱中某个文件夹下的附件保存到指定位置
- 支持2种收邮件的协议:POP3和IMAP,以及支持SSL传输
- 如果某个邮件附件已经保存,会将该邮件标记为已读
由于是windows service,它没有UI界面,直接来看一下它的config file.
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="MailSettings" type="XPLAttachments.XPLConfigrationData,XPLAttachments" /> </configSections> <MailSettings> <Emails> <add name="PSI" IP="1.zhuoyue.me" UserName="***" Password="***" Port="143" Protocol="IMAP" AttachmentsSavingPath="C:\" UseSSL="false" MailBoxFolder="Inbox"></add> <add name="PSI2" IP="2.zhuoyue.me" UserName="***" Password="***" Port="143" Protocol="POP3" AttachmentsSavingPath="D:\" UseSSL="false" MailBoxFolder="Inbox\Boss"></add> </Emails> </MailSettings> <system.diagnostics> <trace autoflush="true" indentsize="4" useGlobalLock="true"> <listeners> <add name="default" initializeData="exception.log" type="System.Diagnostics.TextWriterTraceListener" /> </listeners> </trace> </system.diagnostics> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> </startup> </configuration>
简单看一下这个config file,我们可以看到,通过<Emails>元素我们可以设置多个邮箱账号,其中MailBoxFolder表示要读取邮箱中的哪个文件夹,AttachmentsSavingPath表示要将读取到的附件保存到文件系统中的哪个文件夹下。另外它也拥有Exception处理的基本功能,由于.net diagnostics的设计很灵活,由此可以由多种listener来进行Exception的记录,比如windows event,当然也可以自己实现新的listener,比如发送异常到指定邮箱,目前我在生产中使用的是最简单的文本日志方式。