web-dev-qa-db-fra.com

Le moyen le plus simple d'envoyer du courrier sur une ligne via la ligne de commande à l'aide de gmail?

L'utilisation de Raspbian et Ubunntu 16.04 LTS nécessite donc une solution Linux générique.

L'exigence est simple:

J'ai besoin d'un moyen d'envoyer des messages électroniques sur une seule ligne à partir de la ligne de commande.

J'ai créé un compte gmail uniquement pour ce Rpi3 particulier, avec l'adresse [email protected] - sans 2FA

Alors maintenant, je dois pouvoir envoyer des messages électroniques sur une ligne de n'importe où (y compris cron) sans intervention de l'utilisateur.


Je voudrais également qu'il puisse envoyer des fichiers texte; en gros, n'importe quoi de stdin.

34
SDsolar

La réponse la plus simple à l'envoi de messages sur une seule ligne via gmail est d'utiliser ssmtp


Installez-le avec les commandes suivantes:

Sudo apt-get update
Sudo apt-get install ssmtp

Éditer /etc/ssmtp/ssmtp.conf pour ressembler à ceci:

[email protected]
mailhub=smtp.gmail.com:465
FromLineOverride=YES
[email protected]
AuthPass=testing123
UseTLS=YES

Envoyez un one-liner comme ceci:

echo "Testing...1...2...3" | ssmtp [email protected]

ou

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp [email protected]

Ensuite, fidèle à * nix, vous obtenez simplement l'invite en quelques secondes.

Vérifiez votre compte [email protected], et le tour est joué!


Cela fonctionne également bien lors de l'envoi d'un fichier, comme suit:

cat program.py | ssmtp [email protected]

Et le programme apparaîtra dans la boîte aux lettres

Si le fichier est un fichier texte, il peut avoir une première ligne indiquant Subject: xxxxxx

Cela peut être utilisé avec divers travaux cron peut m'envoyer des données avec des lignes d'objet indiquant le contenu.


Cela fonctionnera avec tout ce qui prépare un message qui est canalisé dans ssmtp via stdin.


Pour plus de détails tels que la sécurisation de ces fichiers contre d'autres utilisateurs et autres, consultez cet article:

Envoyer un e-mail à partir de la ligne de commande du Raspberry Pi


Assurez-vous également de regarder ci-dessous la réponse publiée par Rui sur le verrouillage du FROM: adresse qui pourrait être modifiée dans les fichiers de messages formatés, si nécessaire.


Maintenant, si seulement je pouvais comprendre comment envoyer SMS de la même manière.

36
SDsolar

ssmtp n'est qu'un des nombreux wrappers Sendmail. Tous ceux-ci acceptent un message sur l'entrée standard, et éventuellement une liste d'adresses comme arguments de ligne de commande, et ils offrent tous un binaire nommé sendmail qui implémente (au moins les fonctionnalités de base de) la commande Sendmail traditionnelle- API de ligne. Mais à proprement parler, ce message doit être un message RFC822 bien formé. Au minimum, il doit avoir un Subject: entête.

ssmtp [email protected] <<<$'Subject: testing 1...2...3'

(Avec ssmtp, sendmail n'est qu'un lien symbolique vers ssmtp. Postfix, Exim, et je crois que tous les autres MTA qui Provides: mail-transport-agent a un arrangement similaire, sauf bien sûr sendmail où le binaire sendmail est "la vraie chose".)

Plus communément, vous pouvez reconstituer un simple e-mail avec un document ici.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: [email protected]

Here we interpolate the Shell variable $result
____HERE

(Le Sendmail -t L'option indique de prendre la liste des destinataires des en-têtes du message que vous recevez sur l'entrée standard. Le chemin précis vers Sendmail variera selon les plates-formes.)

Une autre variante courante consiste à combiner la sortie de quelques commandes. Prenez soin d'avoir une ligne vide (un "cou") entre les en-têtes et le corps du message.

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail [email protected]

Pour tout ce qui va au-delà de très simples ASCII messages texte uniquement, vous devez comprendre comment composer un message MIME approprié, auquel cas il est généralement plus judicieux d'utiliser un outil comme mutt. Certaines plates-formes ont un mail ou mailx qui sait comment envoyer des pièces jointes et du texte non ASCII, mais ce n'est pas entièrement portable.

Le défi ici n'est pas de trouver un client qui peut prendre un e-mail et tenter de l'envoyer, c'est de le configurer pour les spécificités de Gmail, ce qui nécessite que le MTA connaisse le nom d'utilisateur et le mot de passe à utiliser pour le serveur distant afin pour pouvoir l'utiliser comme hôte intelligent sortant.

Dans les coulisses, la plupart des clients comme mutt, mailx, etc. exécutent généralement sendmail en arrière-plan pour retirer le message du système.

9
tripleee

Ajout à la propre réponse de l'OP:

Lors de la configuration de ssmtp, vous pouvez également interdire ou autoriser les utilisateurs à définir le De, et également remplacer le domaine; vous souhaiterez peut-être le faire pour plusieurs raisons, notamment le message ne tombant pas dans le dossier Spam.

Vous pouvez ajouter à /etc/ssmtp/ssmtp.conf:

# Where will the mail seem to come from?
rewriteDomain=my_internet_domain.uk

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

Veuillez noter que même si OUI peut être utilisé dans une framboise domestique, il peut ne pas être recommandé dans un système multi-utilisateur du point de vue de la sécurité.

8
Rui F Ribeiro

Quel est le problème avec "mail"?

l'écho "Salut là" | mail -s "Courrier important" [email protected]

"mail" étant/etc/lien alternatif vers/usr/bin/bsd-mailx depuis le paquet bsd-mailx. Je pense que c'est là par défaut. Grand utilitaire pour envoyer du courrier à partir de scripts cron, par exemple.

Fonctionne également sur Ubuntu et FreeBSD.

5
Edheldil

Je préfère vraiment utiliser mailx pour cela:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<[email protected]>" -c [email protected] [email protected]
4
Christopher

J'utilise sendEmail pour envoyer de simples e-mails automatisés via le serveur SMTP d'un fournisseur externe:

sendEmail -q -f "[email protected]" -u "mySubject" -t "[email protected]" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

Je passe tout sur une seule ligne, donc faire cela sur une ligne de commande afficherait probablement tous les paramètres (y compris le mot de passe smtp) à tous les utilisateurs, s'ils exécutent un ps -ef pendant que j'exécute la commande. Je l'utilise dans un script Shell.

2
user684790

Mon serveur est CEntOS 7, et a sendmail mais pas mailx etc. Plutôt que d'installer un nouveau programme, j'ai testé directement avec sendmail, et j'ai constaté que cela fonctionne:

echo -e "From: you@whatever\nTo: [email protected]\nSubject: this is the subject\n\nThis is the body,\nwith multiple lines." | sendmail -t

Pour moi, cela semble être le moyen le plus simple d'envoyer un court e-mail, car il ne nécessite pas d'exécuter ou de configurer un serveur ou un démon, et peut être effectué en une seule ligne de commande.

L'idée est qu'un message m'alertera simplement qu'un certain programme a jeté une erreur, sans révéler aucune information potentiellement confidentielle, puis je vais SSH au serveur pour inspecter ses journaux. De cette façon, vous n'avez pas à vous soucier de complications telles que la connexion de fichiers ou le cryptage du transport.

Remarques:

  • -e indique à echo d'interpréter '\ n' et d'autres échappements.
  • -t indique à sendmail d'obtenir les adresses des destinataires à partir de "À:" dans l'en-tête du message.
  • Si le courrier n'arrive pas, utilisez tail /var/log/maillogpour voir les messages d'erreur.
  • Si vous envoyez à votre adresse gmail, faites un filtre sur gmail pour les garder hors du dossier indésirable.
  • Ce sendmail est en fait "sendmail.postfix" (ce qui pourrait être normal); il y a une page de manuel ici
1
j77h