ubuntu amazon-web-services sendmail docker

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.



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''