J'ai un conteneur docker php et Apache. L'hôte se trouve dans une instance AWS sur laquelle l'instance de docker est en cours d'exécution. Je ne parviens pas à envoyer un courrier électronique à partir du terminal de docker. Existe-t-il un moyen d'envoyer un courrier électronique à partir d'une instance de docker à l'aide de sendmail utilisant la configuration de l'hôte du docker?
La commande suivante envoie un courrier électronique à partir de l'hôte mais n'envoie pas un courrier électronique à partir de l'instance de menu fixe. Aucune erreur n'est donnée non plus.
echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F [email protected] -t [email protected]
Ce que je fais est de configurer le MTA hôte pour écouter sur docker0
et installer ssmtp dans le conteneur pour relier sendmail dans le conteneur avec le MTA hôte. La raison d'exécuter un MTA sur l'hôte est que les erreurs système (critiques) peuvent être envoyées à la boîte aux lettres de l'administrateur. La raison pour ne pas exécuter MTA dans le conteneur est qu'il s'agit d'un processus dupliqué car le système hôte exécute déjà un MTA.
Sur l'hôte, j'ai utilisé postfix. Tout ce que nous avons à faire est de configurer postfix pour qu’il écoute sur docker0
et d’accepter les mails sortants des conteneurs Docker. Editez le fichier /etc/postfix/main.cf
et ajoutez l'adresse IP docker0
à inet_interfaces
pour qu'il accepte les connexions des conteneurs Docker. Ajoutez également les adresses réseau des conteneurs Docker à mynetworks
afin que les conteneurs Docker puissent envoyer des messages via le serveur postfix sur l’hôte. ( référence et plus de détails )
Pour utiliser sendmail dans des conteneurs, installez ssmtp et définissez FromLineOverride
pour être autorisé et and mailhub
sur l'adresse IP de l'hôte dans /etc/ssmtp/ssmtp.conf
. Vous pouvez définir mailhub
comme un symbole tel que smtp-server
, puis exécuter le conteneur avec l'option --add-Host
, comme indiqué dans ce fichier Dockerfile (exécutez-le avec --add-Host smtp-server:your-docker0-address
). Cela configurerait un sendmail utilisable dans des conteneurs qui utiliseraient réellement le MTA hôte pour envoyer des mails.
Sendmail (ou tout autre agent de messagerie) n'est installé nulle part dans votre fichier Docker. Cependant, l'hôte dispose apparemment de sendmail. La solution "la meilleure" ou la plus semblable à celle de Docker consiste à créer un autre conteneur qui exécute un MTA (comme postfix ou exim ) et à configurer votre application pour l'utiliser.
en s'appuyant sur les réponses précédentes,
Créer config/sendmail_config.sh avec:
#!/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
change yum pour apt-get sur des conteneurs basés sur debian
puis dans Dockerfile, ajoutez:
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 .
Je veux sendmail avec mon utilitaire php pour pouvoir le coller n'importe où sans avoir à se connecter à un autre conteneur ou hôte MTA pour effectuer la tâche.
J'exécute sh sendmail_config.sh, puis mon utilitaire php.
Ajouter un nom de domaine complet au nom d'hôte Docker dans/etc/hosts me facilite la tâche:
{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}
Pour moi, cela ressemble à ceci:
172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606
Vous pouvez également utiliser ce script bash pour mettre à jour automatiquement cette ligne:
#!/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
Référence: http://hjk41.azurewebsites.net/2015/09/25/using-sendmail-inside-docker/
J'ai trouvé un moyen moi-même, bien que ce ne soit pas la solution la plus élégante. J'ai configuré le sendmail dans mon menu fixe afin de relayer la demande via l'adresse IP de l'hôte. Ajoutez la ligne suivante au fichier "/ etc/mail/access
Connect:<Host_ip_here> RELAY
En outre, dans l'hôte ainsi que dans le menu fixe, commentez la ligne suivante dans le fichier "/etc/mail/sendmail.mc" en la préfixant par "dnl #" et en la complétant par "dnl".
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
J'ai transmis l'ip de l'hôte en tant que variable d'environnement au conteneur de menu fixe, de sorte qu'il soit configurable. Maintenant, le sendmail du docker va relayer sa demande smtp de sendmail via la machine hôte.
EDIT: S'il vous plaît voir la réponse de xuhdev pour plus d'informations et comment configurer le redirecteur de courrier. Ma réponse peut être utilisée pour configurer sendmail au lieu de postfix sur Host.
EDIT # 2: Ajouter une règle de pare-feu pour autoriser le trafic smtp à partir du menu fixe
J'ai fait une configuration similaire à celle du tarun mittal comme suit:
dans docker Host, modification du fichier /etc/mail/sendmail.mc pour inclure l'écoute sur l'interface docker0 (contrairement à toutes les interfaces de la réponse de tarun - la ligne en gras est ajoutée)
DAEMON_OPTIONS (`Famille = inet, Nom = MTA-v4, Port = smtp, Addr = 127.0.0.1 ') dnl
DAEMON_OPTIONS (`Famille = inet, Nom = MTA-v4, Port = smtp, Addr = 172.17.42.1 ') dnl
Autorisez l'accès des conteneurs du menu fixe à l'interface du menu fixe dans le pare-feu Iptables -I INPUT -s 172.17.0.0/24 -d 172.17.42.1 -dport 25 -j ACCEPT
dans/etc/mail/access, j’ai ajouté à la fin pour permettre à toutes les instances de docker d’envoyer des emails et makemap hash/etc/mail/access </ etc/mail/access pour compiler la base de données
/// RÉVISÉ - UTILISER CI-DESSOUS, DOCKER PASSANT À 172.17.1.X après de nombreuses reconstructions
/// OLD - Connect: 172.17.0 RELAY
Connecter: 172.17 RELAIS
Enfin redémarrez sendmail - service sendmail restart
J'ai eu du mal avec ce problème aussi. À partir de mon code python s'exécutant dans un conteneur Docker, je devais envoyer temporairement des courriels à l'aide de postfix (serveur smtp) exécuté sur la machine hôte. Après avoir essayé tout un tas de choses, ce qui s’est avéré être une solution simple est la commande d'exécution de docker avec --net = "Host". Attention: Cela peut ne pas être une bonne solution dans tous les cas, car un tel conteneur partagera la pile réseau avec l'hôte docker et, du point de vue du conteneur, localhost (ou 127.0.0.1) désignera l'hôte docker . Voici ce que j'ai fait sur un hôte Ubuntu: Docker run -it --net = "Host" ubuntu /bin/bash Cela m'a donné le conteneur Shell . J'ai ensuite installé python dans ce conteneur : apt-get update && apt-get -y superviseur d'installation python-pip
Ensuite, j'ai lancé l'interpréteur python et lancé les lignes de code suivantes:
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
J'ai aussi trouvé [ceci] [1] une lecture utile.
Vous devez pointer inet_interfaces sur le docker bridge (docker0) dans la configuration post-fix située dans le groupe /etc/postfix/main.cf
inet_interfaces =
Plus de détails internes sur envoi d’email depuis docker via postfix installé sur l’hôte
Remarque: utilisez la commande ifconfig pour obtenir l'adresse du pont fixe