在容器中为您的应用设置SMTP服务器

时间:2018-10-22 16:52:01

标签: email docker smtp docker-container

我有一个应用程序,该应用程序发送电子邮件并要求在端口25上运行smtp。为此,我创建了另一个容器并将端口25从主机映射到容器。

效果不佳,因为它不断抛出以下错误

ERROR: for smtp Cannot start service smtp: driver failed programming external connectivity on endpoint push_smtp_1 (25f260f6185dd34cfdb8fb9956c28187028aaca4d850d7a73acc4c2180c55696): Error starting userland proxy: Bind for 0.0.0.0:25: unexpected error (Failure EADDRINUSE)

在尝试重新启动docker客户端的其他帖子之后,不确定在这里可能出什么问题,并确认端口25 lsof -i:25上没有其他任何运行。让我知道我是否在这里丢失了什么。

这个问题的第二部分是,处理smtp服务器的理想方法是什么。

  1. 是否应在应用容器中创建smtp服务器。浏览了此博客http://www.tothenew.com/blog/setting-up-sendmail-inside-your-docker-container/

  2. 如果不是(1),那么最好创建一个smtp容器并映射端口。这样,得到上述错误的原因是什么。

下面是我的docker-compose:

version: '3'
services:
  push:
    image: emailService
    ports:
    - "9602:9602/tcp"
    networks:
    - default
    build:
      context: ./
      dockerfile: Dockerfile
      args:
      - "TARGET=build"
    depends_on:
    - gearmand
    - smtp
  smtp:
    image: catatnight/postfix:latest
    ports:
    - "25:25"
    networks:
    - default
  gearmand:
    image: <path>/<to>/gearmand:latest
    ports:
    - "4730:4730/tcp"
    networks:
    - default

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您希望仅从另一个容器而不是从外部容器即可访问SMTP服务器,则无需映射端口。

使用docker-compose,所有定义的容器将自动添加到网络中,在该网络中,容器可以通过名称相互访问(请参见https://docs.docker.com/compose/networking/)。如果您的自定义“默认”网络是桥接网络,那么它也将正常工作。

这意味着您可以从其他容器直接在smtp:25访问SMTP容器(即其内部端口和内部主机名,而不是docker主机的主机端口和可公开路由的IP地址)。

没有其他人能够使用您的SMTP服务器。我认为这可能会导致收件人不接受它发送的电子邮件的问题(请参阅https://serverfault.com/q/364473)。 @David Maze指出,无论如何还是最好使用公共/官方邮件提供商。

答案 1 :(得分:0)

我认为问题在于主机上的其他内容已经在该端口上进行监听

尝试找出主机上正在使用https://www.cyberciti.biz/faq/how-do-i-find-out-what-ports-are-listeningopen-on-my-linuxfreebsd-server/监听的端口

答案 2 :(得分:0)

使用主机上的其他端口:

version: '3'
services:
  push:
    image: emailService
    ports:
    - "9602:9602/tcp"
    networks:
    - default
    build:
      context: ./
      dockerfile: Dockerfile
      args:
      - "TARGET=build"
    depends_on:
    - gearmand
    - smtp
  smtp:
    image: catatnight/postfix:latest
    ports:
    - "2525:25"
    networks:
    - default
  gearmand:
    image: <path>/<to>/gearmand:latest
    ports:
    - "4730:4730/tcp"
    networks:
    - default