Ubuntu 在docker容器中配置sendmail
我有一个正在运行的php和apache。主机位于运行docker实例的AWS实例中。我无法从docker终端发送电子邮件。是否有任何方法可以使用使用docker主机配置的sendmail从docker实例发送电子邮件 以下命令从主机发送电子邮件,但不从docker实例发送电子邮件。也没有给出错误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
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重新启动
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'