基于Mailkit的Email管理软件的实现过程中的问题分析

发表时间:2020/10/14   来源:《科学与技术》2020年16期   作者:卢辉
[导读] 本文描述了在开发一个基于Mailkit开源项目的邮件管理软件的过程中遇到的某些问题的分析与解决方法,此项目已实际应用于某外贸企业。
        卢辉
        南京擎天全税通信息科技有限公司   江苏省南京市   211800
        摘要 本文描述了在开发一个基于Mailkit开源项目的邮件管理软件的过程中遇到的某些问题的分析与解决方法,此项目已实际应用于某外贸企业。
关键词:Email; .NET; Mailkit; IMAP; SMTP
        随着信息科技的蓬勃发展,即时通讯(IM)工具成为人们日常生活、工作、学习中必不可少的一部分。但是,在正式的企业生产行为中,无论是商务谈判,抑或是订单的询价、报价以及各种票据的往来,大部分还是通过电子邮件这种途径进行。如今有许多成熟的邮件客户端软件,如老牌的Outlook、Thunderbird,还有国内使用广泛的Foxmail。但是因为这些软件绝大部分功能是面向普通用户的,而企业可能会有特殊的邮件管理需求,所以设计一个个性化的定制邮件管理客户端软件是必要的。
        传统的.NET平台的邮件发送是基于SmtpClient实现的,如今微软官方已经将此工具标记为弃用(Obsolete),并推荐了一个继任者:Mailkit,这是一个开源的基于MimeKit的跨平台邮件库,支持SMTP、POP3以及IMAP协议,具有非常强大的功能。
        在实现本系统的过程中,遇到了一些问题,本文将就这些问题进行简单的分析并给出解决方案。
一、系统简介
        客户作为一家外贸企业,拥有大量的供应商和购货方信息,平时的询价、订单、发票等信息都是通过电子邮件的方式来进行,所以邮件非常多,而且供应商和购货方的邮件会混杂在一起,仅靠人力,很难对这些繁杂的数据进行有效管理。
        本系统最大的特色功能是将相关邮件自动根据企业和客户信息归类,并清晰标识收取和发送的邮件,使用户能够一目了然地查看邮件并从中提取需要的信息。
        在与对方约定邮件主题命名规则后,可以自动提取邮件主题中的请求回复日期和邮件优先级,提醒用户及时回复邮件,防止错失重要信息。
        图1-系统主界面
二、问题分析
        在系统开发过程中遇到了一些问题,经过查找资料及开发验证,最终找到了相应的解决方法,在此简单描述一下问题及分析解决过程。
        2.1 邮件中附件的发送和提取
        和其他多数客户端类似,Mailkit中,邮件信息同样以MimeMessage的形式存储,附件信息存储在MimeMessage的Attachments属性中,因可能包含多个附件,所以是以列表的形式存储。附件有一个名为Content-Disposition的参数,其值如下所示:


        Content-Disposition的值为attachment表示这个附件是以消息体的形式展示;如果值为inline,则表示附件是内嵌入邮件信息中,比如在邮件正文中直接插入图片文件。附件文件名称为“filename.jpg”。
        邮件的附件有两种格式,一种为MessagePart,另一种为MimePart。在解析附件时,要采用不同的方式。
        MessagePart为RFC-822标准,此标准支持任意的ASCII字符,此标准在2001年被RFC-2822取代,在2008年被RFC-5322取代。
        相比较MessagePart而言,MimePart格式对邮件(包括附件)的内容的支持更加多样化。它支持ASCII以外的字符文本,如UTF-8等字符集,且支持非文本格式的附件,如二进制、图像、音视频等多媒体信息,而且支持不同部分组成的消息体格式。
        所以,在提取邮件中的附件时,如果附件格式为MessagePart,则直接读取附件中的Message属性并写入流中,如下所示:

        如果附件格式为MimePart,则需要对其Content属性进行Decode操作,然后写入流中,如下所示。

        附件的文件名称是作为一个MIME参数存储在Content-Disposition头中,但是原始的MIME规范说明并没有为非ASCII编码的文件名称指定编码方法。所以在发送包含附件的邮件时,如果附件名称采用非ASCII的编码,那么某些电子邮件客户端(如Outlook2007之前的版本)在收取这封邮件时,就不能正确显示附件名称,而是会显示为"ATT0####.dat"的形式,解决此问题的方法,是在添加附件时,设置ContentDisposition.Parameter的EncodingMethod属性值为RFC-2047。

        2.2 新邮件推送
        邮件客户端通过一个后台Idle线程来实现新邮件的自动推送,大部分邮件服务端都支持Idle机制。

        但是某些邮件服务器没有对外开放这个功能,这个时候,就需要手动创建后台线程循环抓取收件箱状态来间接实现邮件推送功能。获取收件箱中最新的未读邮件的uid,将其与已存的最新邮件的uid比较,如果前者的uid大于后者,则认为有新的未读邮件到达收件箱。
        2.3 邮件正文编辑器的实现
        邮件正文编辑器的实现比较复杂,因为要实现文字字体、颜色的设置、图片、表格的插入等功能。在开放过程中尝试了两种方式:RichTextBox和WebBrowser。对于RichTextBox,对于字体样式、图片的支持较完善,但是对于某些标签,如文本的引用样式,没有找到有效的实现方式,在转发邮件或者回复邮件时,不能正确地以引用格式显示原邮件内容。
        对于WebBrowser的实现方式,有一个名为SmithHtmlEditor的开源项目,能较好地实现邮件的编辑功能,原项目中对于文字行距设置的是固定数值,这样在调整某一行文字样式时,如加大字号,会遮挡住其他行文字的显示,所以需要将其行距设置为字号成衣某个比例值。
三、结论
        Mailkit是一个非常强大且成熟的开源邮件客户端库,本项目也仅使用了其中很小的一部分功能,相较于其他成熟的邮件客户端软件来说,功能也很单一,所以开发过程中遇到的问题也只是很少的一部分,但是对于常用的邮件服务器来说,可实现邮件的正常收发、管理功能。
        目前大部分邮件服务提供商都开放了IMAP(POP)/SMTP功能,但是某些提供商对这些功能进行了部分限制,比如强制使用其开放的客户端才能正常收发邮件,将正常发送的邮件识别为垃圾邮件从而发送失败,不提供IDLE功能,无法较好地实现新邮件推送功能。对于这些限制,目前尚未找到相应的解决方法。
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: