Nodemailer 无法从 Docker 容器内发送电子邮件

时间:2021-06-02 17:35:45

标签: node.js docker nodemailer alpine

我已经在互联网上到处搜索/阅读/尝试了大约 3 周,然后才在这里发帖......

上下文

  • 开发小型网站应用
  • 技术:
    • 用于前端和后端(节点)的下一个 JS(ReactJs、HTML、CSS)
    • Linux 作为主机 (Ubuntu 20.04 LTS)
    • Docker 封装应用的容器(基于 node:alpine 镜像)(Docker 版本 20.10.6)
    • Nodemailer 节点发送电子邮件的模块
  • 这是使用 Nodemailer 发送电子邮件的代码:
import type { NextApiRequest, NextApiResponse } from "next";
import * as nodemailer from "nodemailer";

export default async (req: NextApiRequest, res: NextApiResponse) => {
  res.statusCode = 200;

  let transporter = nodemailer.createTransport({
    host: process.env.NM_HOST,
    port: parseInt(process.env.NM_PORT),
    secure: true,
    auth: {
      user: process.env.NM_USER,
      pass: process.env.NM_PASS,
    },
    tls: {
      rejectUnauthorized: false,
    },
  });
  // console.log("User:");
  // console.log(process.env.NM_USER);

  let info = await transporter.sendMail({
    from: "Website <xxx@xxx.com>",
    to: "Website <xxx@xxx.com>",
    subject: "New contact",
    text: "NAME:\n" + req.body.data.name + "\n----------\nEMAIL:\n" + req.body.data.email + "\n----------\nBODY:\n" + req.body.data.body,
  }, function (err, info) {
    if (err) {
      console.log(err)
    } else {
      console.log(info);
    }
  });
  console.log("Message sent: %s", info);

  res.json({
    a: req.body.data.name,
    b: req.body.data.email,
    c: req.body.data.body,
  });
};

问题

  • 当我尝试使用 Nodemailer 从 Linux 主机启动我的应用程序作为“npm run start”或“npm run dev”发送电子邮件时,邮件会被发送
  • 当我尝试使用 Nodemailer 从 Docker 的容器启动我的应用程序发送电子邮件时,出现以下错误(来自应用程序的输出本身)
Error: connect ECONNREFUSED 127.0.0.1:465
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1133:16) {
  errno: -111,
  code: 'ESOCKET',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 465,
  command: 'CONN'
}

我已经尝试过的和我观察到的:

  • ping google.com(以及许多其他)在容器内工作(使用 docker exec -ti container-name sh 命令)
  • 使用 docker run --dns 8.8.8.8 ... 启动容器 -> 相同的结果(上面的错误)
  • container's 和 host' /etc/resolv.conf 不同(但我认为这可能不是重点,因为 ping 命令正确解析,但如果我是,请随意说我错了)
  • 我不是系统管理员(我是开发人员),所以我不知道这件事中是否暗示了 iptables 或 ufw(防火墙)(顺便说一句,在节点上安装非预安装的软件包很困难:高山)
  • 电子邮件服务器身份验证是正确的(用户名、主机名、密码),因为当我以 npm run startnpm run dev 身份启动我的应用程序时,它可以正常工作
  • 在网桥(默认)网桥(使用 docker-compose 自定义)和主机之间切换容器网络...同样的问题(上面的错误)

任何愿意提供帮助的人都非常感激。

0 个答案:

没有答案