在docker容器中配置sendmail

tar*_*tal 24 ubuntu sendmail amazon-web-services docker

我有一个运行php和apache 的docker容器.主机位于运行docker实例的AWS实例中.我无法从docker终端发送电子邮件.有没有办法使用sendmail使用docker的主机配置从docker实例发送电子邮件?

以下命令从主机发送电子邮件,但不从docker实例发送电子邮件.也没有错误.

echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F abc.pqr@domain.com -t abc.pqr@domain.com
Run Code Online (Sandbox Code Playgroud)

xuh*_*dev 20

我所做的是配置主机MTA监听docker0并在容器中安装ssmtp,以便在容器中与主机MTA桥接sendmail.在主机上运行MTA的原因是系统(严重)错误可以发送到管理员的邮箱.不在容器中运行MTA的原因是它是一个重复的进程,因为主机系统已经运行了MTA.

在主机上,我使用了postfix.我们需要做的就是配置postfix来监听docker0并接受来自Docker容器的传出邮件.编辑文件/etc/postfix/main.cf并添加docker0IP地址,inet_interfaces以便它接受来自Docker容器的连接.此外,添加Docker容器的网络地址,mynetworks以便Docker容器合法通过主机上的postfix服务器发送邮件.(参考和更多细节)

要在容器中使用sendmail,请安装ssmtp并将其设置FromLineOverride为允许,并安装mailhub到主机的IP地址中/etc/ssmtp/ssmtp.conf.您可以将其设置mailhub为符号smtp-server,然后使用--add-host选项运行容器,如此Dockerfile中所示(运行它--add-host smtp-server:your-docker0-address).这将在容器中配置可用的sendmail,它实际上将使用主机MTA发送邮件.

  • 这可以工作并获得可用的sendmail命令行可执行文件.但究竟什么是"真正的"sendmail可执行文件的问题.除非我出错了,否则应该可以在不设置自己的smtp服务器的情况下使其工作 - 给定dns mx查找工作和收件人MTA可访问. (3认同)

小智 5

您的Dockerfile中没有任何地方安装了sendmail(或任何其他邮件代理).但是,主机显然确实有sendmail可用."最佳"或类似Docker的解决方案是启动另一个运行MTA的容器(如postfixexim),并配置您的应用程序使用它.

  • 是的,这可以通过在 docker compose 文件中定义 '[Links](https://docs.docker.com/v1.8/compose/yml/#links)' 来完成。但是我已经在主机上运行了一个很好的 Postfix 服务器,如何从 Docker 容器连接到主机 Postfix 服务器(它也运行 docker 容器)。 (3认同)

stu*_*rtz 5

根据以前的答案,使用以下命令
创建config/sendmail_config.sh:

#!/bin/sh
# set host in hosts
line=$(head -n 1 /etc/hosts)
line2=$(echo $line | awk '{print $2}')
echo "$line $line2.localdomain" >> /etc/hosts

yum install -y sendmail sendmail-cf m4 \
    && hostname >> /etc/mail/relay-domains \
    && m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

#remove localhost limit
sed -i -e "s/Port=smtp,Addr=127.0.0.1, Name=MTA/Port=smtp, Name=MTA/g" \
    /etc/mail/sendmail.mc
sendmail -bd
Run Code Online (Sandbox Code Playgroud)

在基于debian的容器上更改yum for apt-get

然后在Dockerfile中添加:

RUN sed -i -e "s#;sendmail_path =#sendmail_path = /usr/sbin/sendmail -t -i#g"  \
    /your_path_to/php.ini
COPY ./config/sendmail_config.sh .
Run Code Online (Sandbox Code Playgroud)

我想用我的php util发送sendmail所以我可以把它粘在任何地方而不必链接到另一个MTA容器或主机来完成任务.
我运行sh sendmail_config.sh,然后运行我的php util.


Igo*_*rev 5

假设在主机上安装并配置了一个邮件服务器!

基于高山的泊坞窗映像应具有sendmail可执行文件。

简单的解决方案是在主机的网络上运行容器:

docker run --rm --net="host" php:fpm-alpine sh -c 'echo "Subject: test" | sendmail -v your@mail.com'
Run Code Online (Sandbox Code Playgroud)

要使用默认网桥运行容器,请将邮件服务器配置为侦听docker接口172.17.0.1,并允许中继来自docker子网172.17.0.0/16的电子邮件。

受以下影响的Exim选项:/etc/exim4/update-exim4.conf.conf

dc_local_interfaces='127.0.0.1 ; ::1 ; 172.17.0.1'
dc_relay_nets='172.17.0.0/16'
Run Code Online (Sandbox Code Playgroud)

重新启动邮件服务器并运行详细的容器:)

docker run --rm --hostname="your-domain.com" php:fpm-alpine sh -c 'echo "Subject: test" | sendmail -v your@mail.com -S 172.17.0.1'
Run Code Online (Sandbox Code Playgroud)