Ubuntu 在docker容器中配置sendmail

Ubuntu 在docker容器中配置sendmail,ubuntu,amazon-web-services,sendmail,docker,Ubuntu,Amazon Web Services,Sendmail,Docker,我有一个正在运行的php和apache。主机位于运行docker实例的AWS实例中。我无法从docker终端发送电子邮件。是否有任何方法可以使用使用docker主机配置的sendmail从docker实例发送电子邮件 以下命令从主机发送电子邮件,但不从docker实例发送电子邮件。也没有给出错误 echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F abc.pqr@domain.com -t abc.pqr@domai

我有一个正在运行的php和apache。主机位于运行docker实例的AWS实例中。我无法从docker终端发送电子邮件。是否有任何方法可以使用使用docker主机配置的sendmail从docker实例发送电子邮件

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

echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F abc.pqr@domain.com -t abc.pqr@domain.com

Dockerfile中没有安装sendmail(或任何其他邮件代理)。然而,主机显然有可用的sendmail。“最好的”或最像Docker的解决方案是启动另一个运行MTA的容器(如或),并配置您的应用程序以使用它。

我自己想出了一种方法,尽管不是最优雅的解决方案。我在docker中配置了sendmail,以便通过主机的ip中继请求。将以下行添加到文件“/etc/mail/access

Connect:<host_ip_here>          RELAY

我将主机ip作为一个环境变量传递给docker容器,以便对其进行配置。现在docker的sendmail将通过主机中继其sendmail的smtp请求。

编辑:有关更多信息以及如何设置邮件转发器,请参阅xuhdev answer。我的答案可用于设置sendmail,而不是主机上的后缀

编辑#2:添加防火墙规则以允许来自docker的smtp通信

我做了一个与塔伦米塔尔相似的设置,如下所示:

  • 在docker应用程序中,我将其设置为使用ip为docker0接口的smtp服务器(172.17.42.1)
  • 在docker host中,修改了/etc/mail/sendmail.mc以包括docker0接口上的监听(与tarun的答案中的所有接口相反,粗体添加行)

    DAEMON_选项(`Family=inet,Name=MTA-v4,Port=smtp,Addr=127.0.0.1')dnl

    DAEMON_选项(`Family=inet,Name=MTA-v4,Port=smtp,Addr=172.17.42.1')dnl

  • 允许从docker容器访问防火墙中的docker接口 iptables-I输入-s 172.17.0.0/24-d 172.17.42.1-dport 25-j接受

  • 在/etc/mail/access中,我在末尾添加了允许所有docker实例发送电子邮件和makemap hash/etc/mail/access来编译数据库

    ///已编辑-使用以下内容,因为DOCKER在多次重建后将转到172.17.1.X

    ///旧-连接:172.17.0继电器

    连接:172.17继电器

  • 最后重新启动sendmail-服务sendmail重新启动


我要做的是将主机MTA配置为在
docker0上侦听,并在容器中安装ssmtp,以便将容器中的sendmail与主机MTA连接起来。在主机上运行MTA的原因是该系统(关键)可以将错误发送到管理员邮箱。不在容器中运行MTA的原因是,它是一个重复的进程,因为主机系统已运行MTA

在主机上,我使用了postfix。我们需要做的就是配置postfix来监听
docker0
并接受来自Docker容器的传出邮件。编辑文件
/etc/postfix/main.cf
,并将
docker0
IP地址添加到
inet\u接口
,以便它接受来自Docker容器的连接。另外,添加网络Docker容器到mynetworks的工作地址,以便Docker容器通过主机上的postfix服务器发送邮件是合法的。()


要在容器中使用sendmail,请安装ssmtp并将
fromleinoverride
设置为允许,并将
mailhub
设置为
/etc/ssmtp/ssmtp.conf
中主机的IP地址。您可以将
mailhub
设置为符号,例如
smtp服务器
,然后使用
添加主机
选项运行容器,如s所示不过,在这种情况下(使用
--添加主机smtp服务器:your-docker0-address
)运行它。这将在容器中配置一个可用的sendmail,该容器将实际使用主机MTA发送邮件。

在/etc/hosts中向Docker主机名添加一个完全限定的域名对我有好处:

{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}
在我看来是这样的:

172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606
您还可以使用此bash脚本自动更新此行:

#!/bin/bash
line=$(head -n 1 /etc/hosts | awk '{printf "%s %s.localdomain %s", $1, $2, $2}')
sed -e "1 s/^.*$/${line}/g" /etc/hosts > hosts
# with sed -i, it actually performs a rename of /etc/hosts, but docker does not
# allow that, so we have to use a temp file and copy it to overwrite /etc/hosts
cp hosts /etc/hosts
rm hosts

参考资料:

我也很难解决这个问题。从我在docker容器中运行的python代码来看,我需要使用主机上运行的postfix(smtp服务器)临时发送电子邮件。在尝试了所有方法之后,结果证明是一个简单的解决方案,即使用--net=“host”运行docker命令“。注意:在所有情况下,这可能不是一个好的解决方案,因为这样的容器将与docker主机共享网络堆栈,并且从容器的角度来看,localhost(或127.0.0.1)将引用docker主机。 以下是我在ubuntu主机上所做的: docker run-it--net=“host”ubuntu/bin/bash 这给了我容器的外壳。 然后,我在这个容器中安装了python: apt-get-update&apt-get-y安装管理器python-pip

然后我启动了python解释器并启动了以下代码行:

import smtplib
from email.mime.text import MIMEText

fromaddr = 'testemail.yourdomain.com'
toaddr = 'youremail.yourdomain.com'

msg = MIMEText('Sample email from python/docker container')
msg['from'] = fromaddr
msg['subject'] = 'Subject of python email'
msg['to'] = toaddr

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddr, msg.as_string())
server.quit
我还发现[这][1]是一个有用的读物。

根据我们可以使用
sendmail-bd
命令来运行服务。但它以零状态存在。所以

# In your Dockerfile
RUN yum install -y sendmail
# Run mail listener
RUN sendmail -bd

CMD sleep infinity
# or run your command
您也可以使用supervisord。 我使用这个配置:

[program:sendmail]
command=/usr/sbin/sendmail -bd
autostart=true
autorestart=false
numprocs=1
startretries=0
并测试它:

$ echo test123 | sendmail your@mail.com

别忘了检查垃圾邮件文件夹。

基于以前的答案,
使用以下内容创建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
为基于debian的容器上的apt get更改yum

然后在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 .
我希望使用php util发送邮件,这样我就可以将其粘贴到任何地方,而不必链接到其他MTA容器或主机来完成任务。

我运行sh sendmail_config.sh,然后运行我的php util。

您必须将inet_接口指向位于set/etc/postfix/main.cf的postfix配置中的docker桥(docker0)

inet_接口=

更多内部工作细节,请访问

注意:使用ifconfig命令获取docker网桥地址

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

<
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 .
docker run --rm --net="host" php:fpm-alpine sh -c 'echo "Subject: test" | sendmail -v your@mail.com'
dc_local_interfaces='127.0.0.1 ; ::1 ; 172.17.0.1'
dc_relay_nets='172.17.0.0/16'
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'