[Raspbian][Python][CLI] - Wysyłanie maila: tytuł + treść + załącznik - z poziomu CLI lub używając Pythona

Linux jako system PC i Embedded
Regulamin forum
Aby łatwiej poruszać się w zagadnieniach to prosimy aby w temacie, na samym początku, w nawiasach prostokątnych umieszczać hasło wiodące dla opisywanego problemu np. [Debian], [System embedded], [Linux Mint] itp.
Awatar użytkownika
j23
Expert
Expert
Posty: 506
Rejestracja: czwartek 08 paź 2015, 18:40

[Raspbian][Python][CLI] - Wysyłanie maila: tytuł + treść + załącznik - z poziomu CLI lub używając Pythona

Postautor: j23 » sobota 11 lis 2017, 00:20

Raspberry Pi z systemem Raspbian można w dość sprytny sposób wykorzystać jako narzędzie do wysyłania e-maili. Prezentuję sposób użyty przeze mnie:
1. Założenia:
1.1. Możliwie najprostsza bezproblemowa konfiguracja.
1.2. Możliwość wykorzystania skrzynki Gmail.
1.3. Mozliwość wysyłania: tytułu, treści maila oraz/lub załącznika.
1.4. Możliwość korzystania z w/w sposobu w programowaniu w języku Python.
1.5. Chcemy wysłać email z: konta Gmail na: TO SAMO konto Gmail (można na inne, ale należy taką skrzynkę przygotować - patrz punkt 2.4.)

2. Instalacja niezbędnych składników (pakietów):

2.1. Wchodzimy na konto root'a żeby po milion razy nie wklepywać sudo.
W linii komend Raspbiana wpisujemy:[ENTER] i podajemy hasło do root'a i znowu [ENTER]

2.2. Instalujemy pakiety: ssmtp, mailutils i mpack.
W linii komend Raspbiana wpisujemy:

Kod: Zaznacz cały

apt-get install ssmtp
i [ENTER]

Kod: Zaznacz cały

apt-get install mailutils
i [ENTER]

Kod: Zaznacz cały

apt-get install mpack
i [ENTER]

3. Teraz trzeba odpowiednio skonfigurować SSMTP - edytujemy plik: ssmtp.conf
W linii komend Raspbiana wpisujemy:

Kod: Zaznacz cały

nano /etc/ssmtp/ssmtp.conf
i [ENTER]

W pliku ssmtp dodajemy odpowiednie linie:

Kod: Zaznacz cały

root=postmaster
mailhub=smtp.gmail.com:587
AuthUser=<login>@gmail.com
AuthPass=<hasło>
UseSTARTTLS=YES
hostname=<login_użytkownika_w_raspbian>
FromLineOverride=YES


Zapisujemy plik i wychodzimy z niego.

Jeszcze taka drobna uwaga - w poniższych będą użyte następujące ustawienia:

Kod: Zaznacz cały

AuthUser=adres_mailowy@gmail.com"
AuthPass=haslo123supertajne
hostname=pi


4. Konfiguracja skrzynki Gmail:
Zanim puścimy maila z naszego Raspberry trzeba zrobić jeszcze jeden krok mianowicie w odpowiedni sposób przygotować skrzynkę Gmail, żeby nie stroiła fochów typu, że email został nie wysłany, bo to za bardzo niebezpieczne.
4.1. Logujemy się na konto Gmail, z którego i na które będziemy wysyłać maile.
4.2. Następnie klikamy w "trybik":
Gmail_config1.JPG


4.3. Następnie klikamy w "Ustawienia":
Gmail_config2.JPG


4.4. Następnie klikamy w "Inne ustawienia konta Google":
Gmail_config3.JPG


4.5. Następnie klikamy w "Logowanie się w Google":
Gmail_config4.JPG


4.6. Następnie klikamy w wajchę tak, żeby było "Zezwalaj na mniej bezpieczne aplikacje: WŁĄCZONE":
Gmail_config5.JPG


4.7. Na upewniamy się że protokół IMAP jest na koncie Gmail włączony:
Gmail_config6.JPG



5. Wysyłanie maila - w końcu! :)
Wszędzie poniżej podany jest przykład wysyłania maila z tego samego konta Google (Gmail) na to samo konto Gmail. Niemniej można wysyłać maila na inne konto/konta, ale należy upewnić się co do ustawień kont (IMAP, autoryzacja, etc).

5.1. Wysyłanie maila z linii komend (CLI) - (tytuł + tekst - bez załącznika):
W linii komend Raspbiana wklepujemy:

Kod: Zaznacz cały

echo "Tresc (zawartosc) maila, ktory nie ma zalacznika" | mail -s "Temat maila" adres_mailowy@gmail.com
i [ENTER]
Na naszym koncie powinniśmy otrzymać dopiero co wysłany email (bez załącznika jeszcze tym razem).

5.2. Wysyłanie maila z linii komend (CLI) - (tytuł + załącznik - ALE bez tekstu):
W linii komend Raspbiana wpisujemy:

Kod: Zaznacz cały

mpack -s "Tytul maila" /folder_gdzie_mamy_plik/plik_np_graficzny.jpg adres_mailowy@gmail.com
i [ENTER]
Na naszym koncie powinniśmy otrzymać dopiero co wysłany email (z załącznikiem i tytułem maila, ale bez tekstu, bo... tak działa mpack...).

5.3. Wysyłanie maila z linii komend (CLI) - (tytuł + tekst + załącznik):
5.3.1. Przygotowujemy plik tekstowy, np.
Piszemy w linii komend:

Kod: Zaznacz cały

echo "To jest treść maila, który będzie także zawierał załącznik" > tekst_tmp.txt
i [ENTER]

5.3.2. Zakładając, że dysponujemy już odpowiednim załącznikiem np. plik_graficzny.jpg w linii komend wklepujemy:

Kod: Zaznacz cały

mpack -s "Tytul maila: Mail + tekst + zalacznik" -d "tekst_tmp.txt" "plik_graficzny.jpg" adres_mailowy@gmail.com
i [ENTER]
Tym razem na naszym koncie powinniśmy otrzymać dopiero co wysłany email, ale już z tytułem, treścią i załącznikiem - czyli wszystko elegancko. :)

To tyle jeśli chodzi o wklepywanie z linii komend - w sumie mało przydatne, ale to miał być wstęp do tego jak wykorzystać to z poziomu języka Python, gdzie jak wiadomo wówczas różne sprawy możemy sprytnie zautomatyzować, np. wysłać maila wtedy kiedy na odpowiednim pinie GPIO Raspberry pojawi się stan wysoki lub niski.

Tymczasem pokazuję jak wysłać maila z poziomu skryptu języka Python... :)
5.3.3 - Wysyłanie maila z poziomu języka Python (Tytuł, treść + załącznik):
5.3.3.1. - Uruchamiamy ulubiony edytor tekstu (w moim przypadku stosuję połączenie Midnight Commander i jego wbudowany edytor, bo dość prosto można w nim operować opcjami zaznaczania, kopiowania i innych możliwości z tekstem), ale można używać oczywiście innych edytorów jak np. nano, vi, emacs.. etc.
5.3.3.2. - Tworzymy skrypt Pythona (plik) nazwany np. wyslij_email.py i następnie wewnątrz niego wklepujemy co następuje:

Kod: Zaznacz cały

import time
from subprocess import PIPE, Popen

# funkcja typu "cmd()" - czyli uruchamiajaca rozkaz tak jakby pisalo sie wprost z linii komend
def j23cmd2os(cmdline):
   process = Popen(
      args = cmdline,
      stdout = PIPE,
      shell = True
   )

# tworzenie tymczasowego pliku z trescia maila (zawartoscia/content)
j23cmd2os('echo "To jest tresc maila" > tekst_tmp2.txt')

# tworzenie przykladowego, tymczasowego zalacznika - ta linia nie jest konieczna jesli taki zalacznik jest juz wczesniej przygotowany
j23cmd2os('echo "zawartosc zalacznika" > attachement_temp.txt')

# wysylanie maila
j23cmd2os('mpack -s "Tytul maila: Mail + tekst + zalacznik" -d "tekst_tmp2.txt" "attachement_temp.txt" adres_mailowy@gmail.com')

# kasowanie wczesniej utworzonych, tymczasowych plikow: tekst_tmp2.txt i attachement_temp.txt
j23cmd2os('rm -f tekst_tmp2.txt attachement_temp.txt')


Na koniec zwracam uwagę na trzy sprawy:
- w linii komend lepiej nie stosować polskich znaków diakrytycznych typu ą, ę, ł, etc.
- w języku Python lepiej nie stosować polskich znaków diakrytycznych typu ą, ę, ł, etc.
Nie wiem czemu, ale czasem taki tekst z polskimi ogonkami udaje się wysłać, a czasem Python sygnalizuje, że błąd, że nie uprzedzono o tym jaki podzbiór językowy będzie użyty w pliku etc.
- tworzone pliki np. tekst_temp.txt są tworzone w tym samym katalogu, z którego jest uruchamiany skrypt Pythona (żeby to zmienić, czyli wysyłać pliki z odpowiednich ścieżek należałoby podać te ścieżki (np. /home/pi/tekst_tmp2.txt).

Korzystałem z następujących źródeł:
http://www.raspberry-projects.com/pi/so ... end-emails
http://www.algissalys.com/network-secur ... mmand-line

Pozdrawiam! J23 Jarek
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Internet łączy ludzi, którzy dzielą się swoimi zainteresowaniami, pomysłami i potrzebami, bez względu na geograficzne (przeciwności).
BOB TAYLOR, PARC

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [Raspbian][Python][CLI] - Wysyłanie maila: tytuł + treść + załącznik - z poziomu CLI lub używając Pythona

Postautor: tasza » sobota 11 lis 2017, 06:36

No super.

Ja tylko pragnę dodać dwa słowa, aby nie pracować w takim przypadku na swoim własnym,osobistym koncie pocztowym, ale na okazję takiej komunikacji z urządzeniem założyc mu osobne, techniczne konto (my to nazywamy konto aplikacyjne) ponieważ:

* jak zmienimy hasło na koncie swym, to kolejne logowania Maliny się nie udadzą, to oczywiste, ale system mejlowy może potraktować błędne logowania RPI jako intruza i nam zablokować konto, jeżeli nie mamy ad-hoc dostępu do Maliny aby ją znieczulić to odblokowanie konta niewiele da, bo zaraz będzie to samo...

* jak nam się Malina zgubi lub zostanie kolokwialnie ujmując - buchnięta, powstaje ryzyko wycieku hasła do poczty, przecież jest otwartym tekstem, a system plików na karcie można oglądnąć w byle czytniku z Biedronki, zakładanie tu, że pan kradziej jest idiotą i sprzeda zdobycz za browar nie zobaczywszy co i jak - jest w/g mnie poważnym błędem

Większość webowej poczty potrafi dociągnąć zewnętrzne skrzynki przez POP3 lub IMAP, żaden kłopot to sobie poukładać aby nowa zabawka nie obniżała bezpieczeństwa naszej poczty,
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
j23
Expert
Expert
Posty: 506
Rejestracja: czwartek 08 paź 2015, 18:40

Re: [Raspbian][Python][CLI] - Wysyłanie maila: tytuł + treść + załącznik - z poziomu CLI lub używając Pythona

Postautor: j23 » sobota 11 lis 2017, 12:52

Dziękuję Tasza za miłe słowa. :) :like:

Temat, który słusznie poruszyłaś chciałem dać w innym wątku (tym lub podobnym, który pisałem nt.sterownika 5V/220V), ale w takim wypadku może i nawet lepiej że już tutaj jest o tym napomknięte.

tasza pisze:(...)założyc mu osobne, techniczne konto (my to nazywamy konto aplikacyjne) (...)
Dokładnie tak już jest zrobione, system działa na skrzynce nazwijmy ją - alternatywnej.

tasza pisze:(...)jak nam się Malina zgubi lub zostanie kolokwialnie ujmując - buchnięta, powstaje ryzyko wycieku hasła do poczty, przecież jest otwartym tekstem, a system plików (...)
System także i na taką ewentualność jest przemyślany i potwierdzam fakt, że bardziej mogłyby tutaj ucierpieć raczej prywatne, newralgiczne dane niż jakieś materialne rzeczy,których w moim przypadku nie ma wiele, są przestarzałe i przypuszczam, że potencjalny złodziej narobiłby sobie więcej kłopotów (z tym działającym systemem obrony) niż to jest warte.
System ma JEDNO zadanie: przekazać zdalnie do netu TYLE danych nt. złodzieja na ile dadzą radę moje czujniki (na tyle szybko i wydajnie na ile to możliwe), które są rozsiane w taki sposób, że nie sposób je wyłączyć w konwencjonalny sposób (a które zbierają dane z wieeelu bodźców, no szkoda że próbek DNA nie pobierają... kusi mnie ta opcja ;) ), druga sprawa że z przyczyn bezpieczeństwa, czyli prewencyjnie każdy traktowany jest jako złodziej. Innymi słowy nawet i ja "włamuję" się do własnego lokum. ;)
Przy okazji wspomnę o fakcie alternatywnego zasilania, które jeszcze jest do dopracowania, ale już i tak działa pięknie - to na wypadek cwaniaczków odcinających prąd w celu wyeliminowania z użycia czegokolwiek co prąd pobiera. A tak się składa, że kochany RPi + czujniki + nie żrą prądu dużo... :)
Temat jeszcze postaram się rozwinąć w innym wątku. :like:

Dziękuję za konstruktywną odpowiedź Tasza :) :like:

Pozdrawiam! j23 Jarek
Internet łączy ludzi, którzy dzielą się swoimi zainteresowaniami, pomysłami i potrzebami, bez względu na geograficzne (przeciwności).
BOB TAYLOR, PARC


Wróć do „GNU/Linux”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości