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.

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
W sytuacji, gdy z Waszego serwera korzystają inne osoby, możecie zapisać własną/prywatną konfigurację programu MSMTP w pliku:

/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]

raspberry-pi_app_msmtp02

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"
(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk