如何使运行在 docker 容器内的 django 应用程序使用主机的 sendmail 服务

问题描述

我应该做一个演示,我需要在提供给我的服务器机器上使用 docker 进行部署,该机器已经设置了 sendmail

所以如果我ssh然后跑

echo "Subject: sendmail test" | sendmail -v <my_email>@gmail.com

我实际上收到了一封电子邮件,它有效。

如果我进入容器并从它的 shell 运行它,上面的命令也有效。因此,容器可以与主机的 sendmail 正常通信。

现在我的问题是我不确定我应该如何制作在容器中运行的 django 应用程序,使用主机的 sendmail 来发送一些电子邮件 >

我已阅读与我的问题类似的 this 问题。我尝试了第一个建议,即使用 localhost 作为 EMAIL_HOST,但我没有收到任何电子邮件

我尝试设置 EMAIL_HOST_USER=localhost ,没有密码,但我收到错误 smtplib.SMTPException: STARTTLS extension not supported by server.,从我读到的内容来看,这意味着 I do not need to login

我想避免添加答案中提到的 suggested package,因为在生产部署中他们可能不会使用 sendmail 并且在技术说明上,如果我将该软件包安装为后端映像将在容器内存在的路径中查找 sendmail 二进制文件。所以它不会使用主机的 sendmail

我的 django 应用目前正在使用以下电子邮件相关设置:

EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=localhost
EMAIL_USE_TLS=False
EMAIL_USE_SSL=False
EMAIL_PORT=587
DEFAULT_FROM_EMAIL=webmaster@localhost
EMAIL_HOST_USER=
EMAIL_HOST_PASSWORD=

我使用端口 587 因为当我运行时

$ sudo netstat -nlp | grep :587

我明白了:

tcp        0      0 127.0.0.1:587           0.0.0.0:*               LISTEN      3261/sendmail: MTA:

所以我知道 sendmail 在该端口上运行。

这是我的 docker-compose.yml 文件。为了让我的生活更轻松,而且由于这是一个演示,我将所有服务的 network_mode 设置为 host :

version: '3.8'

services:
  frontend:
    container_name: frontend
    image: frontend-dev-demo:latest
    network_mode: host
    stdin_open: true
    depends_on:
      - backend

  backend:
    container_name: backend
    image: backend-dev-demo:latest
    network_mode: host
    env_file:
      - ./.env.demo
    volumes:
      - ~/Docker/volumes/backend/media:/backend/media/
      - ~/Docker/volumes/backend/static:/backend/static/
    command: >
      sh -c "pipenv run python manage.py collectstatic --noinput && 
             pipenv run python manage.py migrate && 
             pipenv run python manage.py loaddata initial_data.json && 
             pipenv run python manage.py runserver 0.0.0.0:8000"
    stdin_open: true
    depends_on:
      - db

  db:
    container_name: db
    image: postgres:12.6-alpine
    network_mode: host
    volumes:
      - ~/Docker/volumes/backend/database:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=database

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)