ubuntu - Configurar sendmail dentro de un contenedor docker
amazon-web-services (10)
Agregar un nombre de dominio completo al nombre de host de Docker en / etc / hosts hace el truco para mí:
{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}
A mi me parece esto:
172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606
También puede usar este script de bash para actualizar automáticamente esta línea:
#!/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
Referencia: http://hjk41.azurewebsites.net/2015/09/25/using-sendmail-inside-docker/
Tengo un contenedor docker ejecutando php y apache. El host está en una instancia de AWS que tiene la instancia de docker en ejecución. No puedo enviar un correo electrónico desde la terminal de la ventana acoplable. ¿Hay alguna forma de enviar un correo electrónico desde la instancia de la ventana acoplable usando sendmail que use la configuración del host del acoplador?
El siguiente comando envía un correo electrónico desde el host pero no envía un correo electrónico desde la instancia de la ventana acoplable. Tampoco se da ningún error.
echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F [email protected] -t [email protected]
De acuerdo con el manual de Sendmail, podemos usar el comando sendmail -bd
para ejecutar un servicio. Pero existe con estado cero. Asi que...
# In your Dockerfile
RUN yum install -y sendmail
# Run mail listener
RUN sendmail -bd
CMD sleep infinity
# or run your command
También puedes usar supervisor. Yo uso esta configuración:
[program:sendmail]
command=/usr/sbin/sendmail -bd
autostart=true
autorestart=false
numprocs=1
startretries=0
Y probarlo:
$ echo test123 | sendmail [email protected]
No te olvides de revisar la carpeta de spam.
Debe apuntar inet_interfaces al puente de la ventana acoplable (docker0) en la configuración posterior a la corrección ubicada en el conjunto /etc/postfix/main.cf
inet_interfaces =
Más detalles de trabajo internos al enviar correos electrónicos desde la ventana acoplable a través de postfix instalado en el host
Nota: use el comando ifconfig para obtener la dirección de puente de la ventana acoplable
EDITAR: Consulte la respuesta de xuhdev para obtener más información y cómo configurar el reenvío de correo. Mi respuesta se puede usar para configurar sendmail en lugar de postfix en el host.
EDITAR # 2: agregar una regla de firewall para permitir el tráfico smtp desde la ventana acoplable
He hecho una configuración similar como el tarun mittal como sigue:
- en la aplicación docker, lo he configurado para usar el servidor smtp con la ip de la interfaz docker0 (172.17.42.1)
en el host de la ventana acoplable, se modificó el archivo /etc/mail/sendmail.mc para incluir la escucha en la interfaz de la ventana docker0 (a diferencia de todas las interfaces en la respuesta de tarun: se agrega la línea negrita)
DAEMON_OPTIONS (`Familia = inet, Nombre = MTA-v4, Puerto = smtp, Addr = 127.0.0.1 '') dnl
DAEMON_OPTIONS (`Familia = inet, Nombre = MTA-v4, Puerto = smtp, Addr = 172.17.42.1 '') dnl
Permitir el acceso desde los contenedores de la ventana acoplable a la interfaz de la ventana acoplable en el cortafuegos iptables -I INPUT -s 172.17.0.0/24 -d 172.17.42.1 -dport 25 -j ACCEPT
En / etc / mail / access, he agregado al final para permitir que todas las instancias de docker envíen correos electrónicos y hash makemap / etc / mail / access </ etc / mail / access para compilar la base de datos
/// EDITADO - USE DEBAJO COMO DOCKER IRÁ A 172.17.1.X después de muchas reconstrucciones
/// OLD - Conectar: 172.17.0 RELAY
Conectar: 172.17 RELAY
Finalmente reinicie sendmail - servicio sendmail restart
En ninguna parte de su Dockerfile está instalado sendmail (o cualquier otro agente de correo). El anfitrión, sin embargo, aparentemente tiene sendmail disponible. La "mejor" o la mejor solución similar a Docker es girar otro contenedor que ejecute un MTA (como postfix o exim ), y configurar su aplicación para usarlo.
Lo que hago es configurar el MTA del host para escuchar en docker0
e instalar ssmtp en el contenedor para salvar a sendmail en el contenedor con el MTA del host. El motivo para ejecutar un MTA en el host es que los errores del sistema (críticos) se pueden enviar al buzón del administrador. La razón para no ejecutar MTA en el contenedor es que es un proceso duplicado ya que el sistema host ya ejecuta un MTA.
En el host, utilicé postfix. Todo lo que necesitamos hacer es configurar postfix para escuchar en docker0
y aceptar correos salientes de los contenedores de Docker. Edite el archivo /etc/postfix/main.cf
y agregue la dirección IP de inet_interfaces
a inet_interfaces
para que acepte las conexiones de los contenedores de Docker. Además, agregue las direcciones de red de los contenedores Docker a mynetworks
para que los contenedores Docker sean legales para enviar correos a través del servidor de Postfix en el host. ( referencia y más detalles )
Para usar sendmail en contenedores, instale ssmtp y configure FromLineOverride
para que esté permitido, y luego mailhub
la dirección IP del host en /etc/ssmtp/ssmtp.conf
. Puede configurar mailhub
para que sea un símbolo como smtp-server
y luego ejecutar el contenedor con la opción --add-host
, como se muestra en este Dockerfile (ejecutarlo con --add-host smtp-server:your-docker0-address
) . Esto configuraría un sendmail utilizable en contenedores que en realidad usarían el MTA del host para enviar correos.
Yo mismo descubrí una forma, aunque no la solución más elegante. Configuré el sendmail dentro de mi ventana acoplable para retransmitir la solicitud a través de la dirección IP del host. Agregue la siguiente línea al archivo "/ etc / mail / access
Connect:<host_ip_here> RELAY
Además, tanto en el host como en la ventana acoplable, comente la siguiente línea en el archivo "/etc/mail/sendmail.mc" prefijándolo con "dnl #" y el sufijo con "dnl".
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA'')
Pasé la IP del host como una variable de entorno al contenedor de la ventana acoplable, para que sea configurable. Ahora sendmail del docker retransmitirá la solicitud smtp de sendmail a través de la máquina host.
Yo también luché con este problema. Desde mi código de Python que se ejecuta dentro de un contenedor de la ventana acoplable, tuve que enviar temporalmente correos electrónicos usando postfix (servidor smtp) que se ejecuta en la máquina host. Después de probar un montón de cosas, lo que resultó ser una solución simple fue el comando de ejecución de la ventana acoplable con --net = "host". Precaución: Esta puede no ser una buena solución en todos los casos, ya que dicho contenedor compartirá la pila de red con el host de la ventana acoplable y, desde el punto de vista del contenedor, localhost (o 127.0.0.1) se referirá al host de la ventana acoplable. Esto es lo que hice en un host de ubuntu: docker run -it --net = "host" ubuntu / bin / bash Esto me dio el shell del contenedor. Luego instalé python en este contenedor: apt-get update && apt-get -y install supervisor python-pip
Luego lancé el intérprete de Python y encendí las siguientes líneas de código:
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
También encontré [esto] [1] una lectura útil.
construyendo sobre respuestas anteriores,
crear config / sendmail_config.sh con:
#!/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
cambiar yum para apt-get en contenedores basados en debian
luego en Dockerfile agrega:
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 .
Quiero sendmail con mi utilidad php para poder pegarlo en cualquier lugar sin tener que vincular a otro contenedor o host de MTA para completar la tarea.
Ejecuto sh sendmail_config.sh, y luego ejecuto mi utilidad php.
¡Suponiendo que haya un servidor de correo instalado y configurado en el host!
Las imágenes docker basadas en Alpine deben tener el ejecutable sendmail
.
La solución simple es ejecutar el contenedor en la red del host:
docker run --rm --net="host" php:fpm-alpine sh -c ''echo "Subject: test" | sendmail -v [email protected]''
Para ejecutar el contenedor con el puente de red predeterminado, configure el servidor de correo para escuchar en la interfaz de la ventana acoplable 172.17.0.1 , y permita retransmitir correos electrónicos desde la subred de la ventana acoplable 172.17.0.0/16 .
Exim opciones afectadas en: /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''
Reinicie el servidor de correo y ejecute el contenedor detallado :)
docker run --rm --hostname="your-domain.com" php:fpm-alpine sh -c ''echo "Subject: test" | sendmail -v [email protected] -S 172.17.0.1''