Na większości serwerów VPS (czy choćby Raspberry Pi) nie mam zainstalowanego/skonfigurowanego serwera pocztowego – co nie oznacza, że nie ma na nich w ogóle obsługi poczty wychodzącej, a wręcz przeciwnie – korzystam do tego z zewnętrznych serwerów pocztowych, czy to własnych, czy „komercyjnych”, podobnie jak to ma miejsce w przypadku WordPressa, gdzie poczta zazwyczaj wysyłana jest przez zewnętrzną usługę.
Dziś chciałbym przedstawić jeden z prostych sposobów na obsługę poczty wychodzącej (wysyłkę wiadomości e-mail) z serwera VPS (lub Raspberry Pi/dedykowanego) działającego pod kontrolą systemu Linux/Debian, bez potrzeby instalacji i konfiguracji całego/własnego serwera e-mail.
Spis treści w artykule
MSMTP – wysyłaj wiadomości e-mail przez zewnętrzny serwer SMTP
Kiedyś do wysyłki poczty e-mail przez zewnętrzne serwery SMTP korzystałem z SSMTP, ale od kilku lat jego miejsce zajął pakiet MSMTP – choć przyznam, że nie pamiętam, czemu tak się stało… Coś mi się kojarzy, że być może MSMTP wygrał potyczkę ze względu na obsługę wielu kont – ale nie jestem pewien, czy faktycznie SMTP tego nie potrafi. ;-)
W każdym razie – dzięki MSMTP będziecie mogli wysyłać wiadomości e-mail z Waszego systemu, korzystając z zewnętrznego serwera SMTP, czyli np. w ramach konta Gmail, co nie tylko zwalnia Was z obowiązku zarządzania/administrowania kolejną usługą, ale i zmniejsza szansę na wylądowanie Waszych wiadomości w folderze SPAM, w przypadku gdy nie dopilnujecie któregoś z elementów konfiguracji serwera pocztowego – a jest tego trochę…
Instalacja i konfiguracja MSMTP w systemie Linux/Debian
Instalacja w systemie Debian jest banalna, gdyż odpowiednie pakiety znajdują się w oficjalnym repozytorium:
sudo apt-get install msmtp
Konfiguracja konta
Gdy instalacje mamy za sobą – musimy przeprowadzić (relatywnie) prostą konfigurację. Zaczynamy od utworzenia i edycji pliku z podstawową konfiguracją:
sudo nano /etc/msmtprc
/home/nazwa_użytkownika/.msmtprc
Poniżej przykładowa konfiguracja dla konta Gmail:
defaults
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account gmail
host smtp.gmail.com
port 587
auth on
user [NAZWA UŻYTKOWNIKA, NP. ADRES E-MAIL]
password [HASŁO]
from [ADRES E-MAIL/NADAWCA]
account default : gmail
Na koniec warto jeszcze zmodyfikować/ustawić uprawnienia:
sudo chmod 0644 /etc/msmtprc
I na wszelki wypadek plik dla logów:
sudo touch /var/log/msmtp.log
sudo chmod 0777 /var/log/msmtp.log
Ew. można w konfiguracji (/etc/msmtprc) postawić na plik z logami w katalogu danego użytkownika:
logfile ~/.msmtp.log
Co w niektórych sytuacjach (np. dodatkowe zabezpieczenia w systemie) może być najprostszym wyjściem.
W przypadku niektórych usług/dostawców SMTP może podczas próby wysyłania wiadomości pojawić się błąd tego typu:
msmtp: the server did not accept the mail
msmtp: server message: 550 5.6.0 No Sending Domain found in From header
msmtp: could not send mail (account default from /etc/msmtprc)
A w logach MSMTP dodatkowo zobaczycie np.:
Apr 25 19:46:33 host=smtp.sparkpostmail.com tls=on auth=on
user=SMTP_Injection from=jakiś@adres.01 recipients=jakiś@adres.02
smtpstatus=550 smtpmsg='550 5.6.0 No Sending Domain found in From
header' errormsg='the server did not accept the mail'
exitcode=EX_UNAVAILABLE
Rozwiązaniem tego problemu będzie dodanie dodatkowego parametru w konfiguracji danego konta:
add_missing_from_header on
Problem tylko w tym, że w przypadku MSMTP w wersji aktualnie dostępnej w repozytoriach systemu Debian Wheezy/Jessie (wersja MSMTP niższa niż 1.6.x) parametr ten nie jest wspierany, i pozostaje albo wymuszenie aktualizacji MSMTP ze źródeł następnej wersji systemu Debian, lub ręczna kompilacja ze źródeł…
Wysyłanie poczty e-mail za pośrednictwem MSMTP
Na tym etapie pocztę e-mail wysyłamy za pomocą polecenia:
echo -e "Subject: Tu wpisz temat wiadomości\r\n\r\nTu wpisz treść wiadomości" | msmtp -t [ADRESS ODBIORCY]
W powyższym przykładzie wysyłka nastąpi z konta ustawionego jako domyślne, ale nic nie stoi na przeszkodzie, by wybrać inne konto:
echo -e "Subject: Tu wpisz temat wiadomości\r\n\r\nTu wpisz treść wiadomości" | msmtp --account=gmail -t [ADRESS ODBIORCY]
Ew. gdy chcemy wysłać wiadomość z pliku:
cat nazwa.pliku | msmtp [ADRESS ODBIORCY]
Debugowanie, czyli gdy coś nie działa
Warto również wspomnieć jeszcze o parametrze „-d”, dzięki któremu możemy podejrzeć m.in. komunikację z serwerem, co może się przydać w przypadku jakichś problemów:
echo -e "Subject: Tu wpisz temat wiadomości\r\n\r\nTu wpisz treść wiadomości" | msmtp -t [ADRESS ODBIORCY] -d
Dla wygodniejszego przeglądania, czy też, gdy zajdzie potrzeba przesłać te informacje dalej można zapisać wyświetlane informacje do pliku:
echo -e "Subject: Tu wpisz temat wiadomości\r\n\r\nTu wpisz treść wiadomości" | msmtp -t [ADRESS ODBIORCY] -d > msmtp_log
Jednym z chyba popularniejszych błędów może być:
msmtp: account default not found: no configuration file available
Czyli komunikat o tym, że nie ma pliku konfiguracyjnego. Gdy go faktycznie nie ma, to wystarczy utworzyć (patrz wyżej). Ale może się zdarzyć, że plik istnieje, ma prawidłowa zawartość, a komunikat dalej się pojawia. W takim przypadku warto sprawdzić i ew nadać odpowiednie uprawnienia dla tego pliku – musi to być 644:
sudo chmod 644 /ścieżka/do/pliku/msmtprc
Plik może znajdować się w katalogu domowy użytkownika (ma sens, gdy z serwera korzysta więcej osób, i każdy ma swoje konta do wysyłki) lub domyślnie:
sudo chmod 644 /etc/msmtprc
Sendmail, wysyłka ze skryptu
Czasem – np. przy generowaniu wiadomości e-mail w skrypcie – z wiadomości wysyłanej pierwszym poleceniem może „uciec” temat, dlatego zalecam podlinkowanie MSMTP jako Sendmail:
sudo ln -s /usr/bin/msmtp /usr/lib/sendmail
sudo ln -s /usr/bin/msmtp /usr/bin/sendmail
sudo ln -s /usr/bin/msmtp /usr/sbin/sendmail
Może się zdarzyć, że pliki Sendmaila z jakichś przyczyn będą już w systemie i pojawi się błąd przy tej operacji. W tym przypadku pomoże wcześniejsze skasowanie/przeniesienie oryginalnych plików:
sudo rm /usr/lib/sendmail_oryg
sudo rm /usr/bin/sendmail_oryg
sudo rm /usr/sbin/sendmail_oryg
sudo mv /usr/lib/sendmail /usr/lib/sendmail_oryg
sudo mv /usr/bin/sendmail /usr/bin/sendmail_oryg
sudo mv /usr/sbin/sendmail /usr/sbin/sendmail_oryg
Po tej operacji wiadomość e-mail możemy wysłać również korzystając z bardziej „standardowego” polecenia, tj.:
echo 'Tu wpisz treść wiadomości' | mail -s 'Tu wpisz temat wiadomości' 'a_tu_adres_e-mail_odbiorcy'
By ta opcja działała – musi być zdefiniowane domyślne konto w pliku konfiguracyjnym MSMTP (account default).
MSMTP-MTA
Można też w tym celu – zamiast ręcznie ustawiać linkowanie – zainstalować pakiet MSMTP-MTA:
sudo apt-get install msmtp-mta
GNU Mailutils
Może się zdarzyć, że podczas próby otrzymacie błąd w stylu:
mail: command not found
Możecie to „naprawić” (jeśli chcecie korzystać z polecenia „mail”) instalując pakiet Mailutils:
sudo apt-get install mailutils
Wysyłanie wiadomości e-mail z PHP
Jak wspominałem w jednym z pierwszych akapitów – do wysyłki wiadomości z WordPressa korzystam zazwyczaj z odpowiednich wtyczek, o czym kiedyś już pisałem.
W przypadku stron/skryptów w „czystym PHP” często wykorzystuj bibliotekę PHPMailer – to czasem zdarza się, że wysyłkę wiadomości e-mail realizuje bezpośrednio zainstalowany na serwerze MSMTP.
Konfiguracja PHP
Jeśli skonfigurowaliście linki msmtp-> sendmail, to właściwie nie musicie nic robić, wysyłka powinna działać na standardowych ustawieniach. W innym przypadku musicie jeszcze zmodyfikować plik konfiguracyjny PHP:
PHP: sudo nano /etc/php5/apache2/php.ini
PHP-FPM: sudo nano /etc/php5/fpm/php.ini
I ustawić parametr „sendmail_patch” w następujący sposób:
sendmail_path = "/usr/bin/msmtp -t"
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
komentarz dotyczy wpisu:
echo -e „Subject: Tu wpisz temat wiadomości\r\n\r\nTu wpisz treść wiadomości” | msmtp –from=gmail -t [ADRESS ODBIORCY]
wydaje mi się że zamiast: ’ –from=gmail ’
powinno być: ’ –account=gmail’
Tak, masz rację… Już poprawiam.
Nie wiem czemu dałem tam from, może z powodu „walki” z Mandrill/SparkPost, gdzie miałem właśnie błąd związany z nagłówkiem from, i może zostało w myślach… ;-)
Na malince zadziałało, za pierwszym razem, bez buntów i sprzeciwów. Dzięki za wpis, bardzo mi pomógł. Pozdrawiam.
Program MSMTP mimo pewnych wad ma taką zaletę, że właściwie nie ma możliwości by nie działał. No, może poza pewnymi sytuacjami/dostawcami SMTP…