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


32

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 rpi3abc@gmail.com - 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; fondamentalement, n'importe quoi stdin.


voulez-vous que votre message provienne de cette adresse particulière, rpi3abc@gmail.com ou est-ce OK pour vous que ce message vienne de your_username @ localhost?
John Smith

Cela vient de rpi3abc@gmail.com, donc je sais que mon ordinateur communique avec moi. Je l'utilise principalement dans les tâches cron.
SDsolar

Réponses:


33

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

Modifier /etc/ssmtp/ssmtp.confpour ressembler à ceci:

root=rpi3abc@gmail.com
mailhub=smtp.gmail.com:465
FromLineOverride=YES
AuthUser=rpi3abc@gmail.com
AuthPass=testing123
UseTLS=YES

Envoyez un one-liner comme ceci:

echo "Testing...1...2...3" | ssmtp myusername@gmail.com

ou

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp myusername@gmail.com

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

Vérifiez votre compte myusername@gmail.com, et le tour est joué!


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

cat program.py | ssmtp myotherusername@yahoo.com

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 Ruisur le verrouillage de l' 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 des SMS de la même manière.


1
J'utilise également ssmtpdans mes VMs, très léger. +1
Rui F Ribeiro

1
Pourquoi ne pas utiliser l'API sendmail de Python et l'envoyer directement alors?
Rui F Ribeiro

Pour aller plus loin, voici des instructions très simples pour inclure un fichier image en tant que pièce jointe: unix.stackexchange.com/questions/381131/…
SDsolar

Pour répondre à la question de Rui: sendmailseul n'a pas le MTA - Mail Transport Agent pour communiquer en dehors de la machine. Par défaut, comme Unixen est multi-utilisateurs par conception, sendmailil enverra des messages à d'autres utilisateurs dans la même boîte mais pas à l'extérieur. ssmtpest le MTA que je pense est le plus simple à configurer pour gmail.
SDsolar

1
passé pour toujours essayer de configurer postix cela a fonctionné! une note à tous ceux qui lisent ceci, la conf a une faute de frappe, le paramètre racine doit être gmail.com et non gmail.
qodeninja

9

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

ssmtp address@example.com <<<$'Subject: testing 1...2...3'

(Avec ssmtp, sendmailest juste un lien symbolique vers ssmtp. Postfix, Exim, et je crois que tous les autres MTA qui Provides: mail-transport-agentont un arrangement similaire, sauf bien sûr sendmailoù le sendmailbinaire est "la vraie chose".)

Plus généralement, vous pouvez reconstituer un simple e-mail avec un document ici.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: recipient@example.net

Here we interpolate the shell variable $result
____HERE

(L' -toption Sendmail indique de prendre la liste des destinataires à partir des en-têtes du message que vous recevez sur une entrée standard. Le chemin précis vers Sendmail varie 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 elsewhere@example.org

Pour tout ce qui dépasse les messages texte ASCII très simples, 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 plateformes ont un mailou mailxqui 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 message électronique 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 aiment mutt, mailx, etc généralement juste courir sendmaildans les coulisses pour faire passer le message le système.


Je n'aurai pas beaucoup de chance d'utiliser directement sendmail; se tournant ainsi vers ssmtp. Votez pour votre réponse. Au fait, afin d'envoyer des images en pièces jointes, j'ai trouvé le moyen le plus simple possible. Je n'ai même pas à penser au MIME. J'utilise juste mpack, comme décrit ici: unix.stackexchange.com/questions/381131/…
SDsolar

8

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

Lors de la configuration 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é.


Upvote. Excellente info.
SDsolar

5

Quel est le problème avec "mail"?

l'écho "Salut là" | mail -s "Courrier important" user@example.com

"mail" étant / etc / un 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.


3
mailxest juste une extrémité avant. Il nécessite que certains MTA soient configurés pour réellement retirer le message du système local. Il existe plusieurs versions incompatibles couramment utilisées, mais si votre plate-forme cible est uniquement Debian, vous pouvez vous fier à un comportement BSD relativement récent.
tripleee

4

Je suis vraiment partial à utiliser mailxpour cela:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<sender@email.com>" -c recipient2@email.com recipient1@email.com

1
Plusieurs des options ici ne seront pas disponibles sur de nombreux systèmes non Debian / non BSD. L' -aoption en particulier serait merveilleuse si elle était universellement prise en charge, mais parcourez simplement les mailxquestions ici pour voir que ce n'est certainement pas le cas.
tripleee

2

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

sendEmail -q -f "me@mail.com" -u "mySubject" -t "someone@mail.org" -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 s'exécutent un ps -efmoment, j'exécute la commande. Je l'utilise dans un script shell.


1
Il ne s'agit pas d'une installation standard et plusieurs clients portent ce nom. Je suppose que vous faites référence à en.wikipedia.org/wiki/SendEmail . Est-il disponible en tant que paquet Debian?
tripleee

Bonne réflexion sur le script shell, comme sur un système multi-utilisateur. J'aime que mon mot de passe se trouve dans un fichier au fond des entrailles de la machine. Je souhaite seulement pouvoir stocker un mot de passe haché au lieu d'un texte clair.
SDsolar

Je faisais référence à ce package: packages.debian.org/search?keywords=sendemail
user684790

1
Je ne vois pas cette réponse démontrant qu'elle fonctionne avec gmail comme spécifié dans la question d'origine.
SDsolar

Cela fonctionne avec gmail, ex: `-s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

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

echo -e "From: you@whatever\nTo: you@gmail.com\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'avertira 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
Votre système doit avoir un MTA installé qui fonctionne sendmail - mais je ne vois pas cette réponse démontrant qu'il fonctionne avec gmail comme spécifié dans la question d'origine ...
SDsolar

@SDsolar Vous avez raison. Postfix fonctionne sur mon serveur et je ne le savais pas. On dirait que c'est standard avec une installation Centos; peut-être que DigitalOcean l'a configuré. Ce n'est pas écouter sur un port public. En ce qui concerne l'envoi via gmail, mon point est que vous n'avez pas besoin de le faire, vous pouvez envoyer directement depuis votre propre serveur, si vous n'envoyez que pour vous-même. (Je pourrais poser ma propre question et déplacer cette réponse si elle ne convient pas ici.)
j77h
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.