Docker自建smtp✉️️邮件服务器,支持任意域名、无限别名、入库转发(webhook)等功能

2021-07-22T13:37:00

网络上面有很多十分钟邮箱临时邮箱,但是因为被使用的过多,导致被许多平台给屏蔽了,无法注册一些东西。再加上这些邮件✉️️服务都不支持自行保存数据,会导致有些有用的数据无法备份,也仅能做一些临时没有限制的注册使用。这里就给朋友们分享一下通过Docker自建SMTP邮件系统,完成入库、转发、推送webhook功能,通过这个自建的SMTP来构建满足自己需求的一个邮件服务。

我们将会实现如下的功能:

docker配置SMTP2JSON容器

使用 carlosbaraza/smtp2json 这个docker镜像来创建一个smtp转json的服务:

docker run -p 25:8080 -e POST_URI=https://xiao.nu/mailapi carlosbaraza/smtp2json:latest

镜像默认的端口是8080,我们需要映射到25端口上面,然后POST_URI后面跟上我们webhook的url,当docker容器的服务接收到邮件之后将会把收到的数据转为一段JSON POST到转个url上面。

webhook接收到的数据

{
    "attachments": [],
    "headers": {},
    "html": "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=GB18030\"><div>邮件正文</div>",
    "text": "邮件正文",
    "textAsHtml": "<p>邮件正文</p>\n",
    "subject": "aaa",
    "date": "2021-07-21T08:30:13.000Z",
    "to": {
        "value": [
            {
                "address": "to✉xiao.nu",
                "name": "晓怒"
            }
        ],
        "html": "<span class=\"mp_address_name\">晓怒</span> &lt;<a href=\"mailto:to✉xiao.nu\" class=\"mp_address_email\">to✉xiao.nu</a>&gt;",
        "text": "晓怒 <to✉xiao.nu>"
    },
    "from": {
        "value": [
            {
                "address": "from✉qq.com",
                "name": "晓怒"
            }
        ],
        "html": "<span class=\"mp_address_name\">晓怒</span> &lt;<a href=\"mailto:from✉qq.com\" class=\"mp_address_email\">from✉qq.com</a>&gt;",
        "text": "晓怒 <from✉qq.com>"
    },
    "messageId": "<[email protected]>"
}

webhook代码示例

mailapi里面放置编写好的后续操作的代码实现诸如:数据库入库、邮件转发、推送到微信等功能。

<?php
    header("Content-type:text/html; charset=utf-8");
    $data = json_decode(file_get_contents('php://input'), true);
    $from = join(',', array_column($data['from']['value'], 'address'));
    $to = join(',', array_column($data['to']['value'], 'address'));
    $time = strtotime($data['date']);
    $subject = addslashes($data['subject']);
    $html = addslashes($data['html']);
……

域名邮件MX值设置:

进入域名DNS服务后台(如DNSPOD),添加如下值:

mx类型:@ --> 服务器IP

延伸拓展

自建数据库:

CREATE TABLE `mail` (
  `id` int(11) UNSIGNED NOT NULL,
  `from` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `to` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `subject` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
  `date` int(10) UNSIGNED NOT NULL,
  `html` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邮件表';

ALTER TABLE `mail`
  ADD PRIMARY KEY (`id`),
  ADD KEY `form` (`from`),
  ADD KEY `to` (`to`),
  ADD KEY `subject` (`subject`);

ALTER TABLE `mail`
  MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;

webhook接收到数据后,自动入库,并且推送到微信服务号模板消息,标题使用邮件标题subject,描述使用from+to,链接读取邮件html原文,或者使用自己的正则规则提取需要的元素,如验证码、激活邮件等。

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »