Einfachste Möglichkeit, einzeilige E-Mails über die Befehlszeile mit Google Mail zu senden?


31

Wenn Sie Raspbian und Ubunntu 16.04 LTS verwenden, benötigen Sie eine generische Linux-Lösung.

Anforderung ist einfach:

Ich benötige eine Möglichkeit, einzeilige E-Mail-Nachrichten über die Befehlszeile zu senden.

Ich habe nur für dieses Rpi3 ein Google Mail-Konto mit der Adresse rpi3abc@gmail.com eingerichtet - ohne 2FA

Jetzt muss ich in der Lage sein, einzeilige E-Mail-Nachrichten von überall (einschließlich Cron) ohne Benutzereingriff zu senden.


Ich möchte auch, dass es in der Lage ist, Textdateien zu senden. grundsätzlich alles von stdin.


Möchten Sie, dass Ihre Nachricht von dieser bestimmten Adresse stammt, rpi3abc@gmail.com, oder ist es für Sie in Ordnung, dass die Nachricht von Ihrem_Benutzernamen @ localhost stammt?
John Smith

Es kommt von rpi3abc@gmail.com, sodass ich weiß, dass mein Computer mit mir kommuniziert. Ich benutze es meistens in Cronjobs.
SDsolar

Antworten:


32

Die einfachste Antwort auf das Senden von einzeiligen Nachrichten über Google Mail ist die Verwendung von ssmtp


Installieren Sie es mit den folgenden Befehlen:

sudo apt-get update
sudo apt-get install ssmtp

Bearbeiten Sie /etc/ssmtp/ssmtp.conf, um wie folgt auszusehen:

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

Senden Sie einen Einzeiler wie folgt:

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

oder

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

Dann erhalten Sie, wahr * nix, in wenigen Sekunden die Aufforderung zurück.

Überprüfen Sie Ihr Konto unter myusername@gmail.com und voila, es ist da!


Dies funktioniert auch beim Senden einer Datei:

cat program.py | ssmtp myotherusername@yahoo.com

Und das Programm wird in der Mailbox angezeigt

Wenn die Datei eine Textdatei ist, kann sie eine erste Zeile enthalten, die besagt Subject: xxxxxx

Dies kann mit verschiedenen Cronjobs verwendet werden, die mir Daten mit Betreffzeilen senden, die den Inhalt angeben.


Dies funktioniert mit allem, was eine Nachricht vorbereitet, die über stdin an ssmtp weitergeleitet wird.


Weitere Informationen zum Sichern dieser Dateien gegen andere Benutzer und dergleichen finden Sie in diesem Artikel:

E-Mail über die Raspberry Pi-Befehlszeile senden


Lesen Sie auch die Antwort weiter unten, in der es Ruidarum geht, die FROM:Adresse zu sperren, die ggf. in formatierten Nachrichtendateien geändert wird.


Wenn ich nur herausfinden könnte, wie man SMS auf die gleiche Weise versendet.


1
Ich verwende auch ssmtpin meinen VMs sehr leichte. +1
Rui F Ribeiro

1
Warum nicht die sendmail-API von Python aus verwenden und dann direkt senden?
Rui F Ribeiro

Um noch einen Schritt weiter zu gehen, finden Sie hier eine sehr einfache Anleitung zum Einfügen
SDsolar

Zur Beantwortung von Ruis Frage: sendmailAlleine muss der MTA - Mail Transport Agent nicht außerhalb des Rechners kommunizieren. Standardmäßig sendmailwerden Nachrichten an andere Benutzer in derselben Box, jedoch nicht außerhalb, gesendet , da Unixen von Natur aus mehrere Benutzer umfasst . ssmtpist der MTA, der meiner Meinung nach am einfachsten für Google Mail zu konfigurieren ist.
SDsolar

1
Ich habe ewig versucht, postix einzurichten. Das hat funktioniert! Ein Hinweis für jeden, der dies liest: Die Konf hat einen Tippfehler. Der Root-Parameter sollte "gmail.com" sein, nicht "gmail".
Qodeninja

8

ssmtpist nur einer von vielen Sendmail-Wrappern. Alle diese akzeptieren eine Nachricht bei Standardeingabe und optional eine Liste von Adressen als Befehlszeilenargumente und bieten alle eine Binärdatei mit dem Namen, sendmaildie (zumindest die Grundfunktionen) der traditionellen Sendmail-Befehlszeilen-API implementiert. Richtigerweise muss diese Nachricht jedoch eine wohlgeformte RFC822-Nachricht sein. Zumindest sollte es einen Subject:Header haben.

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

(Mit ssmtp, sendmailist nur ein Symlink zu ssmtp. Postfix, Exim und ich glauben, jeder andere MTA, der Provides: mail-transport-agenteine ähnliche Anordnung hat, außer natürlich, sendmailwo die sendmailBinärdatei "die reale Sache" ist.)

Üblicherweise können Sie eine einfache E-Mail-Nachricht mit einem Here-Dokument zusammenfügen.

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

Here we interpolate the shell variable $result
____HERE

(Die Sendmail- -tOption besagt, dass die Empfängerliste aus den Kopfzeilen der Nachricht entnommen werden soll, die Sie in der Standardeingabe erhalten. Der genaue Pfad zu Sendmail unterscheidet sich zwischen den Plattformen.)

Eine andere übliche Variante besteht darin, die Ausgabe einiger Befehle zu kombinieren. Achten Sie darauf, dass zwischen den Kopfzeilen und dem Nachrichtentext eine leere Zeile (ein "Hals") steht.

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail elsewhere@example.org

Für alles, was über sehr einfache Nur-ASCII-Textnachrichten hinausgeht, müssen Sie wissen, wie eine richtige MIME-Nachricht erstellt wird. In diesem Fall ist es normalerweise sinnvoller, ein Tool wie dieses zu verwenden mutt. Einige Plattformen verfügen über ein mailoder, mailxdas weiß, wie Anhänge und Nicht-ASCII-Text gesendet werden, dies ist jedoch nicht vollständig portierbar.

Hier besteht die Herausforderung darin, keinen Client zu finden, der eine E-Mail-Nachricht entgegennimmt und versucht, sie zu senden. Sie muss für die Besonderheiten von Google Mail konfiguriert werden. Dazu muss der MTA den Benutzernamen und das Kennwort kennen, die für den Remoteserver verwendet werden sollen um es als ausgehenden Smarthost verwenden zu können.

Hinter den Kulissen laufen die meisten Clients wie mutt, mailxusw. normalerweise nur sendmailhinter den Kulissen, um die Nachricht vom System zu erhalten.


Ich werde nicht viel Glück haben, wenn ich sendmail direkt verwende. Wenden wir uns daher ssmtp zu. Upvote für Ihre Antwort. Übrigens, um Bilder als Anhang zu versenden, fand ich den einfachsten Weg möglich. Ich muss nicht einmal an MIME denken. Ich benutze nur mpack, wie hier beschrieben: unix.stackexchange.com/questions/381131/…
SDsolar

7

Hinzufügen zur eigenen Antwort des OP:

Bei der Konfiguration ssmtpkönnen Sie Benutzern auch das Definieren des Absenders verbieten oder erlauben und auch die Domäne überschreiben. Möglicherweise möchten Sie dies aus mehreren Gründen tun, einschließlich der Nachricht, die nicht in den Spam-Ordner fällt.

Sie können hinzufügen /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

Bitte beachten Sie, dass YES zwar in einer Himbeere zu Hause verwendet werden kann, in einem System mit mehreren Benutzern aus Sicherheitsgründen jedoch möglicherweise nicht ratsam ist.


Upvote. Hervorragende Infos.
SDsolar

5

Was ist los mit "Mail"?

Echo "Hallo" | mail -s "Wichtige Mail" user@example.com

"mail" ist / etc / alternativer Link zu / usr / bin / bsd-mailx aus dem Paket bsd-mailx. Ich glaube, es ist standardmäßig da. Ein großartiges Dienstprogramm zum Senden von E-Mails beispielsweise aus Cron-Skripten.

Funktioniert auch unter Ubuntu und FreeBSD.


3
mailxist nur ein Frontend. Es muss ein MTA konfiguriert werden, damit die Nachricht tatsächlich vom lokalen System abgerufen wird. Es gibt mehrere inkompatible Versionen, die häufig verwendet werden. Wenn Ihre Zielplattform jedoch nur Debian ist, können Sie sich auf ein relativ aktuelles BSD-Verhalten verlassen.
Tripleee

4

Ich bin sehr daran interessiert, dafür Folgendes zu verwenden mailx:

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
Einige der hier aufgeführten Optionen sind auf vielen Nicht-Debian / Nicht-BSD-Systemen nicht verfügbar. Die -aOption insbesondere wäre wunderbar , wenn es allgemein unterstützt wurde, sondern sieht nur die mailxFragen hier , um zu sehen , dass dies ganz sicher nicht der Fall.
Tripleee

2

Ich verwende sendEmail, um einfache automatisierte E-Mails über den SMTP-Server eines externen Anbieters zu senden:

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"

Ich übergebe alles in einer Zeile. Wenn Sie dies in einer Befehlszeile tun, werden wahrscheinlich alle Parameter (einschließlich des SMTP-Kennworts) für alle Benutzer angezeigt, wenn sie einen bestimmten Zeitraum ausführen ps -ef. Ich benutze es in einem Shell-Skript.


1
Dies ist keine Standardinstallation, und es gibt mehrere Clients mit diesem Namen. Ich vermute, Sie beziehen sich auf en.wikipedia.org/wiki/SendEmail . Ist es als Debian-Paket verfügbar?
Tripleee

Gutes Denken über das Shell-Skript, wie auf einem Mehrbenutzersystem. Ich finde es gut, dass sich mein Passwort in einer Datei befindet, die tief im Innern des Computers liegt. Ich wünschte nur, ich könnte ein gehashtes Passwort anstelle von Klartext speichern.
SDsolar

Ich bezog mich auf dieses Paket: packages.debian.org/search?keywords=sendemail
user684790

1
Ich sehe diese Antwort nicht als Beweis dafür, dass sie mit Google Mail funktioniert, wie in der ursprünglichen Frage angegeben.
SDsolar

Dies funktioniert mit Google Mail, zum Beispiel: `-s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
Rogerdpack

1

Mein Server ist CEntOS 7 und hat sendmail, aber kein mailx usw. Anstatt ein neues Programm zu installieren, habe ich es direkt mit sendmail getestet und festgestellt, dass dies funktioniert:

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

Für mich scheint dies die einfachste Möglichkeit zu sein, eine kurze E-Mail zu senden, da kein Server oder Daemon ausgeführt oder konfiguriert werden muss und dies über eine einzige Befehlszeile erfolgen kann.

Die Idee ist, dass eine Nachricht mich lediglich darauf hinweist, dass ein bestimmtes Programm einen Fehler ausgelöst hat, ohne potenziell vertrauliche Informationen preiszugeben, und dann eine SSH-Verbindung zum Server herstellt, um dessen Protokolle zu überprüfen. Auf diese Weise müssen Sie sich nicht um Komplikationen wie das Anhängen von Dateien oder das Verschlüsseln des Transports kümmern.

Anmerkungen:

  • -e Weist echo an, '\ n' und andere Escapezeichen zu interpretieren.
  • -t Weist sendmail an, Empfängeradressen von "An:" im Nachrichtenkopf abzurufen.
  • Wenn die E-Mail nicht eintrifft, verwenden Sie tail /var/log/maillog, um Fehlermeldungen anzuzeigen.
  • Wenn Sie an Ihre Google Mail-Adresse senden, erstellen Sie bei Google Mail einen Filter, um sie aus dem Junk-Ordner herauszuhalten.
  • Diese sendmail ist eigentlich 'sendmail.postfix' (was normal sein könnte); es gibt einen Mann Seite hier

1
Auf Ihrem System muss ein MTA installiert sein, der funktioniert. sendmail Diese Antwort zeigt jedoch nicht, dass es mit Google Mail funktioniert, wie in der ursprünglichen Frage angegeben ...
SDsolar

@ SDsolar Du hast recht. Postfix läuft auf meinem Server und ich wusste es nicht. Scheint bei einer Centos-Installation Standard zu sein. Vielleicht hat DigitalOcean es konfiguriert. Es lauscht nicht an einem öffentlichen Port. Was das Senden über Google Mail anbelangt, ist mein Punkt, dass Sie dies nicht müssen. Sie können direkt von Ihrem eigenen Server aus senden, wenn Sie nur an sich selbst senden. (Ich könnte meine eigene Frage stellen und diese Antwort verschieben, wenn sie hier nicht passt.)
j77h
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.