Envoi d'un mail depuis un script shell Linux

120

Je souhaite envoyer un e-mail à partir d'un script Linux Shell. Quelle est la commande standard pour ce faire et dois-je configurer des noms de serveur spéciaux?

appshare.co
la source
8
Essayez de demander sur Superuser [ superuser.com ] ou, mieux encore, Unix et Linux SE [ unix.stackexchange.com ].
Dan Molding
3
Copie

Réponses:

119

Si le serveur est bien configuré, par exemple s'il a un MTA opérationnel, vous pouvez simplement utiliser la commande mail.

Par exemple, pour envoyer le contenu d'un fichier, vous pouvez faire ceci:

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail pour plus de détails.

Francesco Laurita
la source
7
Que signifie «mta» ici, y a-t-il un nom complet ou un lien? En tant que débutant, c'est ce que je veux savoir. Comme je manque d'expérience pour faire ça.
Zen
5
@Zen MTA signifie Agent de transport de courrier. postfix, sendmail, qmail etc
Francesco Laurita
@Zen pour la plupart, vous pouvez considérer MTA comme un serveur SMTP ou IMAP.
user151841
1
Si vous ne savez pas comment installer / configurer et que vous êtes sur Ubuntu: sudo apt-get install mailutilset sélectionnez Site Internet: le courrier est envoyé et reçu directement via SMTP. .
user1717828
86

Si vous voulez une approche propre et simple bash, et vous ne voulez pas utiliser cat, echoetc., la façon la plus simple serait:

mail -s "subject here" email@address.com <<< "message"

<<<est utilisé pour rediriger l'entrée standard. Cela fait longtemps partie de bash.

Peter O.
la source
6
echo -e "Some \ nMultiline and tab \ t msg" | mail -s "subject" [email protected]
Pipo
cat << END...END | mail -s "subject" [email protected]
ulidtko
Hé, cela a très bien fonctionné pour moi, merci! Comment spécifier plusieurs adresses de livraison?
E.Owen
1
@ E.Owen Vous pouvez utiliser l'option -t pour envoyer à plusieurs adresses séparées par des espaces
Jon
25

Si exim et ssmtp sont en cours d'exécution, vous pouvez rencontrer des problèmes. Donc, si vous voulez juste exécuter un simple MTA, juste pour avoir un simple client smtp pour envoyer des notifications par e-mail pour insistance, vous devez d'abord purger le MTA éventuellement préinstallé comme exim ou postfix et réinstaller ssmtp.

Ensuite, c'est assez simple, configurer seulement 2 fichiers (revaliases et ssmtp.conf) - Voir la documentation ssmtp -, et l'utilisation dans votre script bash ou bourne est comme:

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

N'oubliez évidemment pas d'ouvrir la sortie de votre pare-feu sur le port smtp (25).

frelon
la source
Où puis-je changer le numéro de port dans ce script? Dans mon serveur, le port smtp fonctionne sur 8181.
manix
Je ne ferais pas cela dans ce shell sinon vous serez coincé tôt ou tard. Vous pouvez le faire dans le fichier de configuration: Voir unix.stackexchange.com/a/132731
hornetbzz
1
Pourquoi les nouvelles lignes sont-elles ingérées si je crée un simple echo $ MAIL_TXT?
KernelPanic
1
@Marko: Veuillez voir l'homme écho avec l'option -e: activer l'interprétation des échappements de contre-oblique
hornetbzz
Désolé, vous
avez
10

Une autre option pour dans un script bash:

mailbody="Testmail via bash script"
echo "From: [email protected]" > /tmp/mailtest
echo "To: [email protected]" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • Le fichier /tmp/mailtestest écrasé à chaque fois que ce script est utilisé.
  • L'emplacement de sendmail peut différer selon le système.
  • Lorsque vous l'utilisez dans un script cron, vous devez utiliser le chemin absolu de la commande sendmail.
SPRBRN
la source
1
a voté contre parce que plusieurs processus peuvent appeler le script en même temps. Cela pourrait entraîner un fichier tmp corrompu / incorrect. De plus, le fichier / tmp n'est pas écrasé à chaque fois qu'il est utilisé - il augmente en fait avec chaque e-mail contenant tous les e-mails précédents à l'intérieur. Pas bon.
Taterhead
1
La première écriture dans / tmp / mailtest est un écrasement donc il supprimera tout ce qui s'y trouvait auparavant. Pourtant, cette méthode n'est pas idéale pour les autres raisons que vous avez décrites.
Simon
8

En général, vous voudrez utiliser la mailcommande pour envoyer votre message en utilisant le MTA local (qui le livrera en utilisant SMTP à la destination ou le transférera simplement vers un serveur SMTP plus puissant, par exemple, chez votre FAI). Si vous n'avez pas de MTA local (bien qu'il soit un peu inhabituel pour un système de type UNIX d'en omettre un), vous pouvez soit utiliser un MTA minimaliste comme ssmtp .

ssmtpest assez simple à configurer. En gros, il vous suffira de spécifier où se trouve le serveur SMTP de votre fournisseur:

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

Une autre option consiste à utiliser l'un des myriades de scripts qui se connectent simplement au serveur SMTP directement et essaient d'y publier un message, tels que Smtp-Auth-Email-Script , smtp-cli , SendEmail , etc.

GreyCat
la source
"ssmtp" a été installé sur la machine donc je n'ai pas pu l'essayer mais merci quand même
appshare.co
5

En admettant que vous souhaitez utiliser un serveur smtp, vous pouvez faire:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

Modifiez somehost, someportet someaccount@somedomainaux valeurs réelles que vous utiliseriez. Aucun cryptage ni authentification n'est effectué dans cet exemple.

Germano
la source
Et que faire si mailxn'est pas installé?
nalply
2

La mailcommande fait cela (qui l'aurait deviné ;-). Ouvrez votre shell et entrez man mailpour obtenir la page de manuel de la mailcommande pour toutes les options disponibles.

DarkDust
la source
2
Je l'ai fait mais il n'y a pas d'option pour spécifier un serveur à utiliser
appshare.co
1
Cela fait partie de la configuration de votre agent de transfert de courrier local, par exemple Sendmail ou Postfix.
DarkDust
2

Vous n'avez même pas besoin d'un MTA. Le protocole SMTP est assez simple pour l'écrire directement sur votre serveur SMTP. Vous pouvez même communiquer via SSL / TLS si le package OpenSSL est installé. Consultez cet article: https://33hops.com/send-email-from-bash-shell.html

Ce qui précède est un exemple sur la façon d'envoyer des e-mails texte / html qui fonctionneront immédiatement. Si vous souhaitez ajouter des pièces jointes, la chose peut devenir un peu plus compliquée, vous devrez encoder en base64 les fichiers binaires et les intégrer entre les limites. C'est un bon endroit pour commencer à enquêter: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP

Daniel J.
la source
2

Sous Linux, courrier utilitaire de peut être utilisé pour envoyer des pièces jointes avec l'option "-a". Parcourez les pages de manuel pour en savoir plus sur l'option. Par exemple, le code suivant enverra une pièce jointe:

mail -s "CECI EST OBJET" -a pièce jointe.txt [email protected] <<< "Bonjour mon pote, veuillez trouver les rapports d'échec."

krish___na
la source
Bienvenue à SO. Merci d'avoir publié une réponse. Veuillez lire les informations sur la façon d'écrire une bonne réponse et modifier en conséquence. Enjoy SO ;-)
ZF007
2

ENVOYER UN MAIL DE LINUX À GMAIL

UTILISATION DE POSTFIX

1: installer le logiciel

Debian et Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

Feutre:

dnf update && dnf install postfix mailx

CentOS:

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

Arch Linux:

pacman -Sy postfix mailutils

FreeBSD:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

dans la configuration, sélectionnez le support SASL

make install clean

pkg install mailx

2. Configurer Gmail

/ etc / postfix. Créez ou modifiez le fichier de mot de passe:

vim /etc/postfix/sasl_passwd

im en utilisant vim vous pouvez utiliser n'importe quel éditeur de fichier comme nano, cat .....

> Ubuntu, Fedora, CentOS, Debian, OpenSUSE, Arch Linux:

Ajoute ça

où l'utilisateur remplace par votre nom de messagerie et le mot de passe est votre mot de passe gmail

[smtp.gmail.com]:587    user@gmail.com:password

Enregistrez et fermez le fichier et rendez-le accessible uniquement par root: car c'est un contenu sensible qui contient votre mot de passe

chmod 600 /usr/local/etc/postfix/sasl_passwd

> FreeBSD:

répertoire / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Ajoutez la ligne:

[smtp.gmail.com]:587    user@gmail.com:password

Enregistrez et rendez-le accessible uniquement par root:

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Configuration de Postfix

fichier de configuration main.cf

6 paramètres que nous devons définir dans le Postfix

Ubuntu, Arch Linux, Debian:

Éditer

 vim /etc/postfix/main.cf

modifiez les valeurs suivantes:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_options qui dans la configuration sera défini sur vide , pour garantir qu'aucune option de sécurité incompatible avec Gmail n'est utilisée.

sauver et fermer

comme comme pour

OpenSUSE:

vim /etc/postfix/main.cf

modifier

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

il nécessite également la configuration du fichier master.cf

modifier:

vim /etc/postfix/master.cf

comme en décommentant cette ligne (supprimer #)

#tlsmgr unix - - n 1000? 1 tlsmg

sauver et fermer

Fedora, CentOS:

vim /etc/postfix/main.cf

modifier

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD:

vim /usr/local/etc/postfix/main.cf

modifier:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

enregistrez et fermez ceci

4. Traiter le fichier de mot de passe:

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

postmap /etc/postfix/sasl_passwd

pour freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Redémarrez postfix

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

systemctl restart postfix.service

pour FreeBSD:

service postfix onestart
nano /etc/rc.conf

ajouter

postfix_enable=YES

enregistrer puis exécuter pour démarrer

service postfix start

5. Activez les "Applications moins sécurisées" dans Gmail à l'aide du lien ci-dessous

https://support.google.com/accounts/answer/6010255

6. Envoyer un e-mail de test

mail -s "subject" recever@domain.com

appuyez sur Entrée

ajouter le corps du courrier comme vous le souhaitez appuyez sur entrée puis appuyez sur ctrl + d pour une terminaison correcte

si cela ne fonctionne pas, vérifiez à nouveau toutes les étapes et vérifiez si vous activez " l'application moins sécurisée" dans votre Gmail

puis redémarrez postfix si vous modifiez quelque chose dans ce

pour le script shell, créez le fichier .sh et ajoutez la commande en 6 étapes comme exigence

par exemple juste pour un échantillon

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

Le script envoie un e-mail lorsque l'utilisation du disque dépasse le pourcentage spécifié par la variable THRESHOLD (80% ici).

chandan A
la source
Le nom de cette réponse ne devrait-il pas être "ENVOYER UN MAIL DE LINUX À [email protected] VIA GMAIL"?
Cameron Hudson le
1

vous pouvez utiliser la commande 'email' ou 'emailx'.

(1) $ vim /etc/mail.rc # ou # vim /etc/nail.rc

set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

Parce que s'il n'est pas envoyé à partir d'un compte autorisé, le courrier électronique sera envoyé dans la liste des courriers indésirables.

(2) $ echo "Merci de ne pas oublier de supprimer les sujets ons inutilisés!" | mail -s "sujets de déchets" -a a.txt [email protected] #send to group user '[email protected]'

TINGTING WANG
la source