MailEnable 开发指南

发布于 2025-01-22 10:29:40 字数 8689 浏览 10 评论 0

0x00 前言

MailEnable 提供端到端的解决方案,用于提供安全的电子邮件和协作服务。引用自官方网站的说法:最近的一项独立调查报告称 MailEnable 是世界上最受欢迎的 Windows 邮件服务器平台。 对于 MailEnable 的开发者 API,我在官方网站上只找到了 AJAX API 的说明文档 ,所以本文将要尝试编写 Python 脚本,实现对 MailEnable 邮件的访问,记录开发细节,开源代码。

0x01 简介

本文将要介绍以下内容:

  • 环境搭建
  • 开发细节
  • 开源代码 MailEnableManage.py

0x02 环境搭建

1.安装

安装前需要安装 IIS 服务和.Net 3.5,否则无法正常配置 Web 访问

MailEnable 下载地址: http://www.mailenable.com/download.asp

2.配置

启动 MailEnableAdmin.msc,在 MailEnable Management -> Messaging Manager -> Post Offices 下配置邮件服务器信息

如下图

Alt text

默认登录页面:http://mewebmail.localhost/mewebmail/Mondo/lang/sys/login.aspx

3.开启 Web 管理页面

参考资料:http://www.mailenable.com/kb/content/article.asp?ID=ME020132

启动 MailEnableAdmin.msc,选择 MailEnable Management -> Servers -> localhost -> Services and Connectors -> WebAdmin ,右键单击并从弹出菜单中选择 Properties ,选择 Configure... 按钮,进行安装

如下图

Alt text

启动 MailEnableAdmin.msc,在 MailEnable Management -> Messaging Manager -> Post Offices 下选择已配置的 Post Office ,右键单击并从弹出菜单中选择 Properties ,切换到 Web Admin 标签,启用 web administration

如下图

Alt text

选择指定用户,将属性修改为管理员

默认管理页面:http://mewebmail.localhost/meadmin/Mondo/lang/sys/login.aspx

注:如果忘记了用户的明文口令,可以查看默认安装路径 C:\Program Files (x86)\Mail Enable\Config 下的 Auth.tab 文件,其中保存有每个邮箱用户的明文口令

0x03 开发细节

1.版本判断

经过多个版本的测试,总结出来的版本判断方法如下:访问登录页面:http:///mewebmail/Mondo/lang/sys/login.aspx

查看网页源码,如下图

Alt text

其中 <link rel="stylesheet" type="text/css" href="/MEWebMail/Mondo/skins/Arctic/me.css?v=9.84"> 中的 v=9.84 对应 MailEnable 的版本

在脚本实现上,我采用了如下方法:

  1. 找到 ?v= 的位置
  2. 向后截取固定长度的字符串
  3. " 作为分隔符,取出版本号

补充:通过 MailEnableAdmin.msc 获得版本号

启动 MailEnableAdmin.msc,选择 MailEnable Management -> Servers -> localhost -> System -> Diagnose

如下图

Alt text

注:版本号列表

2.用户登录

访问 URL:/mewebmail/Mondo/Servlet/request.aspx

需要的部分关键参数:

  • txtUsername
  • txtPassword
  • loginParam

返回结果为 json 格式,如果登录成功, bReportLoginFailure 的值为 False,对应的 Python 代码如下:

def Check(host, username, password):
    url = host + "/mewebmail/Mondo/Servlet/request.aspx?Cmd=LOGIN&Format=JSON"

    body = {
            "txtUsername": username,
            "txtPassword": password,
            "ddlLanguages": "en",
            "ddlSkins":"Arctic",
            "loginParam":"SubmitLogin"
            }  
    postData = urllib.parse.urlencode(body).encode("utf-8")           
    headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0",
        "Content-Type": "application/x-www-form-urlencoded",    
    }         
    r = requests.post(url, headers=headers, data=postData, verify = False)
    if r.status_code ==200 and r.json()["bReportLoginFailure"] == False:
        print("[+] Valid:%s  %s"%(username, password))      
    else:
        print(r.status_code)
        print(r.text)
    r.close()

3.查看邮箱文件夹

访问 URL:/MEWebMail/Mondo/Servlet/asyncrequest.aspx

需要的部分关键参数:

  • Folder,可以指定为 inbox/sent/drafts/deleted/junk
  • ME_VALIDATIONTOKEN,需要访问/mewebmail/Mondo/Servlet/request.aspx?Cmd=GET-MBX-OPTIONS&Scope=2,从返回结果中获得

返回结果为 xml 格式,包含该文件夹下所有邮件的数量和每个邮件的简要内容,ID 作为每封邮件的唯一标志,在读取邮件时需要作为参数,为了提高效率,可以使用 xml.dom 解析 xml。

使用 xml.dom 解析 xml 的参考资料:https://docs.python.org/3.8/library/xml.dom.minidom.html

使用 xml.dom 解析 xml,提取出 TOTAL_ITEMS 的 Python 代码如下:

from xml.dom import minidom
DOMTree = minidom.parseString(r.text)
collection = DOMTree.documentElement
total = collection.getAttribute("TOTAL_ITEMS")
print("[+] TOTAL_ITEMS: " + total)

4.查看邮件

访问 URL:/MEWebMail/Mondo/Servlet/request.aspx

需要的部分关键参数:

  • Folder,可以指定为 inbox/sent/drafts/deleted/junk
  • ME_VALIDATIONTOKEN,需要访问/mewebmail/Mondo/Servlet/request.aspx?Cmd=GET-MBX-OPTIONS&Scope=2,从返回结果中获得
  • ID,需要发送查看邮箱文件夹的请求,在返回结果中获得

返回结果为 xml 格式,包含邮件的详细内容,如果存在附件,那么 ATTACHMENTS 的 EXISTS 属性值为 1,如果不存在附件,那么 ATTACHMENTS 的 EXISTS 属性值为 0

MESSAGEID 作为附件的标志,如果包含多个附件,多个附件共享同一个 MESSAGEID,FILENAME 为附件的名称,MESSAGEID+FILENAME 作为附件的唯一标志,在下载附件时需要作为参数

为了提高效率,可以使用 xml.dom 解析 xml,xml 数据示例如下图

Alt text

解析 xml 提取邮件信息的 Python 代码如下:

DOMTree = minidom.parseString(r.text)
collection = DOMTree.documentElement
element = collection.getElementsByTagName("ELEMENT")
id = element[0].getAttribute("ID")
print("[+] ID      : " + id)
fromaddress = element[0].getElementsByTagName("FROM_ADDRESS")
print("    From    : " + fromaddress[0].childNodes[0].data)
to = element[0].getElementsByTagName("TO")
print("    To      : " + to[0].childNodes[0].data)
subject = element[0].getElementsByTagName("SUBJECT")
print("    Subject : " + subject[0].childNodes[0].data)
received = element[0].getElementsByTagName("RECEIVED")
print("    Received: " + received[0].childNodes[0].data)

body = element[0].getElementsByTagName("BODY")
if len(body[0].childNodes) > 0:
    print("    BODY    : " + body[0].childNodes[0].data)

attachments = element[0].getElementsByTagName("ATTACHMENTS")
exists =  attachments[0].getAttribute("EXISTS")
if exists == "1":
    messageid = attachments[0].getElementsByTagName("MESSAGEID")
    print("    Attachments: " + messageid[0].childNodes[0].data)
    items = attachments[0].getElementsByTagName("ITEM")
    for item in items:
        print(" name:" + item.getElementsByTagName("FILENAME")[0].childNodes[0].data)
        print(" size:" + item.getElementsByTagName("SIZE")[0].childNodes[0].data)

5.下载附件

访问 URL:/MEWebMail/Mondo/lang/sys/Forms/MAI/GetAttachment.aspx

需要的部分关键参数:

  • Folder,可以指定为 inbox/sent/drafts/deleted/junk
  • MessageID,需要发送查看邮件的请求,在返回结果中获得
  • Filename,需要发送查看邮件的请求,在返回结果中获得

在保存附件上,需要区分文本格式和二进制格式

0x04 开源代码

完整代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/MailEnableManage.py

代码支持以下功能:

  • GetVersion,版本判断
  • Check,登录验证
  • ListFolder,查看文件夹,命令行显示邮件数量,完整内容保存至文件
  • ViewMail,查看邮件,命令行显示邮件信息,完整内容保存至文件
  • DownloadAttachment,下载附件

0x05 小结

本文介绍了编写 Python 脚本访问 MailEnable 邮件的开发细节,开源代码 MailEnableManage.py ,实现了版本判断、登录验证、查看文件夹、查看邮件和下载邮件的功能。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文