
Czasem zdarza się, że trzeba wysłać masowo n maili zawierających w zasadzie to samo, ale np różniących się nazwą użytkownika i hasłem w treści, jaki problem odczytać pętlą while plik z danymi do wstawienia i wygenerowanie odpowiedniej ilości par user:hasło? No żaden. Ale pasowało by je teraz wysłać do odbiorców z konkretnego adresu e-mail.
Z pomocą przychodzi ssmtp, gdzie w prosty sposób można wysłać wiadomości za pomocą konkretnego konta na konkretnym serwerze z poziomu cmd – w tym przypadku AGH.
Na szybciora odpalam czystego centosa w dockerze:
docker run -ti --rm centos:7
Instaluję wymagane paczki (ssmtp znajduje się w repo EPEL):
yum -y install epel-release && yum -u install ssmtp vim
I teraz podstawowa konfiguracja:
# cat /etc/ssmtp/ssmtp.conf
mailhub=poczta.agh.edu.pl:465
UseTLS=YES
AuthUser=MOJ_USER@agh.edu.pl
AuthPass=MOJE_HASLO
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt
RewriteDomain=agh.edu.pl
FromLineOverride=YES
- mailhub – serwer pocztowy wraz z portem
- useTLS – chyba nie trzeba tłumacyć
- AuthUser – użytkownik jakim logujemy się do serwera SMTP
- AuthPass – hasło
- RewriteDomain – jak nie ustawimy, to spróbuje wysłać z domeną widoczną pod hostname maszyny lokalnej
- FromLineOverride – podobnie jak wyżej dla FROM
Dodatkowo trzeba jeszcze ustawić revaliases:
# cat /etc/ssmtp/revaliases
# sSMTP aliases
#
# Format: local_account:outgoing_address:mailhub
#
# Example: root:your_login@your.domain:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.
root:MOJ_USER
gdyż w przeciwnym wypadku serwer AGH rzuci nam w twarz komunikat mówiący o tym, że jesteśmy brzydcy i źli:
553 5.7.1 <root@15e42675c6fd>: Sender address rejected: not owned by user MOJ_USER@agh.edu.pl
Gdy już wszystko jest, to szybki skrypcik, który pobierze dane z przygotowanego pliku w formacie:
user1 pass1 mail@1
user2 pass2 mail@2
...
i wyśle go dalej:
#!/bin/bash
SUBJECT="Temat wiadomości"
FROM="OTO JA WŁAŚNIE CAŁY NA BIAŁO<MOJ_MAIL@agh.edu.pl>"
while read line
do
USER=$(echo $line | awk '{print $1}')
PASS=$(echo $line | awk '{print $2}')
MAIL=$(echo $line | awk '{print $3}')
MESSAGE="From: $FROM\nSubject: $SUBJECT\nUser: $USER\nPass: $PASS"
echo -e $MESSAGE|ssmtp -vvv $MAIL
done<lista
Po uruchomieniu skryptu:
chmod +x wyslij; ./wyslij
można obserwować jak ładnie maile idą w świat.
Przy okazji gdyby ktoś chciał sobie powtórzyć jak wygląda komunikacja protokołem SMTP, to widać jak na dłoni zapytania i odpowiedzi, wysłanie tego samego telnetem też by zadziałało.
[<-] 220 poczta.agh.edu.pl ESMTP Postfix
[->] EHLO 15e42675c6fd
[<-] 250 DSN
[->] AUTH LOGIN
[<-] 334 yzEYqD85dUemGcu2
[->] ea1443a64738a7cd4306720fb944a7f5==
[<-] 334 Z5RLkBRXk0
[<-] 235 2.7.0 Authentication successful
[->] MAIL FROM:<MOJ_MAIL@agh.edu.pl>
[<-] 250 2.1.0 Ok
[->] RCPT TO:<ODBIORCA@student.agh.edu.pl>
[<-] 250 2.1.5 Ok
[->] DATA
[<-] 354 End data with <CR><LF>.<CR><LF>
[->] Received: by 15e42675c6fd (sSMTP sendmail emulation); Mon, 02 Nov 2020 21:57:03 +0000
[->] Date: Mon, 02 Nov 2020 21:57:03 +0000
[->] From: OTO JA WŁAŚNIE CAŁY NA BIAŁO<MOJ_MAIL@agh.edu.pl>
[->] Subject: Temat wiadomości
[->] User: super.tajny.user
[->] Pass: tu.wpisz.dowolny.ciag.znakow
[->]
[->] .
[<-] 250 2.0.0 Ok: queued as 1639383C5A
[->] QUIT
[<-] 221 2.0.0 Bye
Syćko.