【问题标题】:Nodemailer cannot send email from within Docker containerNodemailer 无法从 Docker 容器内发送电子邮件
【发布时间】:2021-10-30 20:21:17
【问题描述】:

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

上下文

  • 开发小网站应用程序
  • 技术:
    • 用于前端和后端(节点)的 Next 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 以“npm run start”或“npm run dev”从 Linux 主机启动我的应用程序来发送电子邮件时,邮件会送达
  • 当我尝试使用 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 ... 启动容器 -> 相同的结果(上述错误)
  • 容器和主机的/etc/resolv.conf 不同(但我认为这可能不是重点,因为ping 命令正确解析,但如果我错了,请随意说我)
  • 我不是系统管理员(我是开发人员),所以我不知道这件事中是否隐含了 iptables 或 ufw(防火墙)(顺便说一句,在节点上安装非预安装的软件包很困难:高山)
  • 电子邮件服务器身份验证正确(用户名、主机名、密码),因为当我以npm run startnpm run dev 启动我的应用程序时,它可以正常工作
  • 在桥接(默认)桥接(使用 docker-compose 自定义)和主机之间切换容器的网络...同样的问题(上述错误)

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

【问题讨论】:

    标签: node.js docker nodemailer alpine


    【解决方案1】:

    发现什么不起作用:我使用的是 docker-compose 没有 --env-file 选项。

    这样,我试图在我的应用程序中访问的所有环境变量(例如 PORT、HOST、PSWD、USR)都留下了undefined(这是因为那些环境变量不是在构建步骤中已经内置 - 设计选择,而是在运行时使用 process.env 访问)

    解决方案(根据您的情况更改 .env 文件部分):

    docker-compose --env-file ./.env.production

    有用的官方资源(docker-compose) Docker-compose using --env-file option

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 2020-11-17
      • 2020-08-29
      • 2020-12-03
      • 2018-04-09
      • 2021-09-15
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多