晓怒(xiao.nu),记录分享我的学习笔记,学习一下,记录一下,分享一下。

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

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

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

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": "<xxx@xxx.com>"
}

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原文,或者使用自己的正则规则提取需要的元素,如验证码、激活邮件等。

🤖QQ机器人之知识笔记review系统
4 评论
    seanChrome 97Windows 10
    2022年01月10日回复

    有没有完整的例子和代码呢,这个看着是很简洁,但是奈何技术不够,不会搞

      白小怒Chrome 97Windows 10
      2022年01月15日回复

      @sean 里面只是主要功能的描述,没有整理出来,等有时间的时候把现在用的整理一下。

    roskiaChrome 97Windows 10
    2022年01月12日回复

    这有个问题,你这好像是用forsakenmail搭建,然后做一个邮箱转Json Post后Php入库的操作吧
    但是forsakenmail,比如我用这个邮箱注册了账号,下次要用的账号需要验证码,但是forsakenmail没办法找到之前那个邮箱页面,每次刷新访问都会不同的后缀或前缀的操作,也就是收不到邮件了~

      白小怒Chrome 97Windows 10
      2022年01月15日回复

      @roskia 用的smtp2json,就是将smtp直接转json,然后把json的数据解析出来,入库,可以把收件地址也入到数据库,下次然后做个简单的后端做下搜索就可以实现了。

      所有的内容都在数据库里面,也就不会遗失了。