Najprostszym sposobem na wysłanie wiadomości z jednego wiersza za pomocą wiersza polecenia za pomocą Gmaila?


32

Używając Raspbian i Ubunntu 16.04 LTS, potrzebujesz ogólnego rozwiązania dla systemu Linux.

Wymagania są proste:

Potrzebuję sposobu na wysyłanie wiadomości e-mail w jednym wierszu z wiersza polecenia.

Założyłem konto Gmail tylko dla tego konkretnego Rpi3, z adresem rpi3abc@gmail.com - bez 2FA

Więc teraz muszę być w stanie wysyłać wiadomości jednowierszowe z dowolnego miejsca (w tym crona) bez interwencji użytkownika.


Chciałbym też móc wysyłać pliki tekstowe; w zasadzie wszystko z stdin.


czy chcesz, aby twoja wiadomość pochodziła z tego konkretnego adresu, rpi3abc@gmail.com, czy jest dla ciebie w porządku, że wiadomość pochodzi od twojej_użytkownika @ localhost?
John Smith,

Pochodzi z rpi3abc@gmail.com, więc wiem, że mój komputer się ze mną komunikuje. Używam go głównie do zadań crona.
SDsolar

Odpowiedzi:


33

Najprostszą odpowiedzią na wysyłanie wiadomości jednowierszowych za pośrednictwem Gmaila jest użycie ssmtp


Zainstaluj go za pomocą następujących poleceń:

sudo apt-get update
sudo apt-get install ssmtp

Edytuj, /etc/ssmtp/ssmtp.confaby wyglądać następująco:

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

Wyślij linijkę taką:

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

lub

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

Następnie, zgodnie z * nix, otrzymujesz monit z powrotem za kilka sekund.

Sprawdź swoje konto myusername@gmail.com i voila, jest tam!


Działa to również dobrze podczas wysyłania pliku, ponieważ:

cat program.py | ssmtp myotherusername@yahoo.com

Program pojawi się w skrzynce pocztowej

Jeśli plik jest plikiem tekstowym, może zawierać pierwszą linię Subject: xxxxxx

Można tego używać z różnymi zadaniami crona, które mogą wysyłać mi dane z tematami wskazującymi treść.


Będzie to działać ze wszystkim, co przygotowuje komunikat przesyłany do ssmtp przez stdin.


Aby uzyskać więcej informacji, takich jak zabezpieczenie tych plików przed innymi użytkownikami, i odwiedź ten artykuł:

Wyślij e-mail z wiersza polecenia Raspberry Pi


Pamiętaj również, aby spojrzeć poniżej na odpowiedź na Ruitemat blokowania FROM:adresu, który może zostać zmieniony w sformatowanych plikach wiadomości, jeśli to konieczne.


Teraz gdybym tylko mógł wymyślić, jak wysłać SMS w ten sam sposób.


1
Używam również ssmtpw moich maszynach wirtualnych, bardzo lekki. +1
Rui F Ribeiro

1
Dlaczego więc nie użyć interfejsu API sendmail z Pythona i wysłać go bezpośrednio?
Rui F Ribeiro,


Aby odpowiedzieć na pytanie Rui: sendmailsam nie ma MTA - agenta transportu poczty do komunikacji poza maszyną. Domyślnie, ponieważ Unixen z założenia jest przeznaczony dla wielu użytkowników, sendmailwyśle ​​wiadomości do innych użytkowników w tym samym pudełku, ale nie na zewnątrz. ssmtpjest MTA, który moim zdaniem jest najprostszy do skonfigurowania dla Gmaila.
SDsolar

1
spędził wieczność próbując ustawić postix, to zadziałało! jedna uwaga dla każdego, kto to czyta, conf ma literówkę, parametrem głównym powinna być gmail.com, a nie gmail.
qodeninja

9

ssmtpjest tylko jednym z wielu opakowań Sendmaila. Wszystkie akceptują komunikat na standardowym wejściu i opcjonalnie listę adresów jako argumenty wiersza poleceń i wszystkie oferują binarne o nazwie, sendmailktóra implementuje (przynajmniej podstawowe funkcje) tradycyjnego interfejsu API wiersza polecenia Sendmail. Ale właściwie mówiąc, ten komunikat musi być poprawnie sformułowanym komunikatem RFC822. Powinien mieć przynajmniej Subject:nagłówek.

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

(Z ssmtp, sendmailto tylko symboliczne łącze do ssmtp. Postfix, Exim i uważam, że każdy inny MTA, który Provides: mail-transport-agentma podobny układ, z wyjątkiem oczywiście sytuacji, w sendmailktórej sendmailplik binarny jest „prawdziwy”.)

Częściej można złożyć prostą wiadomość e-mail z dokumentem tutaj.

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

Here we interpolate the shell variable $result
____HERE

(Opcja Sendmail -tmówi, aby pobrać listę adresatów z nagłówków wiadomości otrzymanej przy standardowym wprowadzaniu. Dokładna ścieżka do Sendmaila będzie się różnić w zależności od platformy).

Inną powszechną odmianą jest łączenie wyniku kilku poleceń. Uważaj, aby między nagłówkami a treścią wiadomości była pusta linia („szyja”).

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

W przypadku czegokolwiek poza bardzo prostymi wiadomościami tekstowymi ASCII musisz zrozumieć, jak skomponować właściwą wiadomość MIME, w którym to momencie zwykle bardziej sensowne jest użycie takiego narzędzia mutt. Niektóre platformy mają maillub, mailxktóry umie wysyłać załączniki i tekst spoza ASCII, ale nie jest to w pełni przenośne.

Wyzwanie polega na tym, aby nie znaleźć klienta, który mógłby odebrać wiadomość e-mail i podjąć próbę jej wysłania, należy ją skonfigurować pod kątem Gmaila, który wymaga od MTA znajomości nazwy użytkownika i hasła, które będą używane dla zdalnego serwera w celu aby móc używać go jako wychodzącego hosta inteligentnego.

Za kulisami większość klientów, takich jak mutt, mailxitp. Zwykle po prostu biegnie sendmailza kulisami, aby usunąć komunikat z systemu.


Nie mam dużo szczęścia w bezpośrednim korzystaniu z sendmaila; stąd przejście do ssmtp. Głosuj za swoją odpowiedzią. Nawiasem mówiąc, aby wysłać obrazy jako załączniki, znalazłem najprostszy możliwy sposób. Nie muszę nawet myśleć o MIME. Po prostu używam mpack, jak opisano tutaj: unix.stackexchange.com/questions/381131/...
SDsolar

8

Dodanie do własnej odpowiedzi PO:

Podczas konfigurowania ssmtpmożesz również zabronić lub zezwolić użytkownikom na zdefiniowanie Od, a także zastąpić domenę; możesz to zrobić z kilku powodów, w tym wiadomości nie mieszczących się w folderze Spam.

Możesz dodać do /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

Należy pamiętać, że chociaż TAK może być używane w malinach domowych, może nie być wskazane w systemie dla wielu użytkowników z punktu widzenia bezpieczeństwa.


Głosuj. Doskonała informacja.
SDsolar

5

Co jest nie tak z „mailem”?

echo „Cześć tam” | mail -s „Ważna poczta” użytkownik@example.com

„mail” to / etc / alternatywny link do / usr / bin / bsd-mailx z pakietu bsd-mailx. Wierzę, że jest tam domyślnie. Świetne narzędzie do wysyłania poczty na przykład ze skryptów cron.

Działa również na Ubuntu i FreeBSD.


3
mailxto tylko interfejs. Wymaga to skonfigurowania MTA, aby faktycznie odebrać komunikat z systemu lokalnego. Istnieje wiele niekompatybilnych wersji w powszechnym użyciu, jednak jeśli twoją platformą docelową jest tylko Debian, możesz polegać na stosunkowo niedawnym zachowaniu BSD.
tripleee

4

Naprawdę nie lubię tego używać 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
Kilka opcji tutaj nie będzie dostępnych w wielu systemach innych niż Debian / BSD. W -aszczególności opcja byłaby cudowna, gdyby była powszechnie obsługiwana, ale wystarczy przejrzeć mailxtutaj pytania, aby przekonać się, że tak nie jest.
tripleee

2

Używam sendEmail do wysyłania prostych automatycznych wiadomości e-mail za pośrednictwem serwera SMTP zewnętrznego dostawcy:

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"

Przekazuję wszystko w jednym wierszu, więc wykonanie tego w wierszu polecenia prawdopodobnie pokaże wszystkie parametry (w tym hasło smtp) wszystkim użytkownikom, jeśli będą działać przez ps -efchwilę, gdy uruchamiam polecenie. Używam go w skrypcie powłoki.


1
To nie jest standardowa instalacja i istnieje wiele klientów o tej nazwie. Chyba masz na myśli en.wikipedia.org/wiki/SendEmail . Czy jest dostępny jako pakiet Debiana?
tripleee

Dobre myślenie o skrypcie powłoki, jak w systemie z wieloma użytkownikami. Podoba mi się, że moje hasło znajduje się w pliku głęboko w brzuchu maszyny. Chciałbym tylko móc przechowywać hasło z haszowaniem zamiast czystego tekstu.
SDsolar

Miałem na myśli ten pakiet: packages.debian.org/search?ke
words=sendemail

1
Nie widzę tej odpowiedzi wykazującej, że działa ona z Gmailem, jak określono w pierwotnym pytaniu.
SDsolar

Działa to z Gmailem, np .: `-s smtp.gmail.com -o tls = tak -xp twoje_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

Mój serwer to CEntOS 7 i ma sendmail, ale nie mailx itp. Zamiast instalować nowy program, który przetestowałem bezpośrednio za pomocą sendmaila, i stwierdziłem, że to działa:

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

Wydaje mi się, że jest to najprostszy sposób wysłania krótkiej wiadomości e-mail, ponieważ nie wymaga uruchamiania ani konfigurowania serwera lub demona i można to zrobić w jednym wierszu polecenia.

Chodzi o to, że wiadomość po prostu ostrzeże mnie, że jakiś program zgłosił błąd, nie ujawniając żadnych potencjalnie poufnych informacji, a następnie prześlę SSH do serwera, aby sprawdzić jego dzienniki. W ten sposób nie musisz zawracać sobie głowy komplikacjami, takimi jak dołączanie plików lub szyfrowanie transportu.

Uwagi:

  • -e mówi echu, aby zinterpretowało „\ n” i inne znaki ucieczki.
  • -t każe sendmailowi ​​uzyskać adresy odbiorców z „Do:” w nagłówku wiadomości.
  • Jeśli wiadomość nie dotrze, użyj, tail /var/log/maillogaby wyświetlić komunikaty o błędach.
  • Jeśli wysyłasz na swój adres Gmail, utwórz filtr w Gmailu, aby trzymać je poza folderem śmieci.
  • Ten sendmail to tak naprawdę „sendmail.postfix” (co może być normalne); tutaj jest strona podręcznika man

1
W twoim systemie musi być zainstalowany MTA, który działa sendmail - ale nie widzę tej odpowiedzi, która pokazuje, że działa z Gmailem, jak określono w pierwotnym pytaniu ...
SDsolar

@SDsolar Masz rację. Postfix działa na moim serwerze i nie wiedziałem. Wydaje się, że jest to standard z instalacją Centos; może skonfigurował to DigitalOcean. Nie nasłuchuje na porcie publicznym. Jeśli chodzi o wysyłanie za pośrednictwem Gmaila, chodzi mi o to, że nie musisz, możesz wysyłać bezpośrednio z własnego serwera, jeśli wysyłasz tylko do siebie. (Mogę zadać własne pytanie i przesunąć tę odpowiedź, jeśli tutaj nie pasuje.)
j77h
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.