Levél küldése PHP és msmtp segítségével

Probléma: A lehető legegyszerűbb és legbiztonságosabb módon szeretnél levelet küldeni PHP-ból.

Megoldás:

  1. Telepítsd az msmtp szervert, ami Debian alapú rendszerek esetén a sudo apt install msmtp paranccsal megy.
  2. Hozd létre az msmtp konfigurációs állományát. Ez most legyen a /etc/msmtp. Tartalma a használandó SMTP szerver(ek) adatai legyen. Példánkban egy Google-nél tartott levelezés példa datait olvashatod.
    account gmail
    tls on
    tls_certcheck off
    auth on
    host smtp.gmail.com
    port 587
    user <felhasználó@domain.tld>
    from <feladó@domain.tld>
    password <jelszó>

    Ne felejtsük el a biztonsági beállításokat. Bár ajánlatos olyan felhasználóval levelet küldeni, aki nem csinál mást, mint a PHP alkalmazásunk nevében küld levelet, és ha valamilyen baleset folytán kitudódik a jelszava, nem lesz komolyabb kellemetlenség, mégis érdemes ügyelni az olvashatóságra. Esetünkben a PHP-t futtató felhasználó (www-data) fogja hívogatni az msmtp-t, tehát számára és csak és kizárólag számára kell olvashatóvá tennünk az állományt:

    sudo chown www-data:www-data /etc/msmtprc
    sudo chmod -c 400 /etc/msmtprc
  3. Következő lépésben a php.ini állományban rögzítsük és módosítsuk a levelezéshez szükséges adatokat. A következő paramétereket a [mail function] szekcióban találod.
    • Kommenteljük ki az összes SMTP beállítást, mert nem klasszikus szerveren keresztül levelezünk (és mert nem Windows alól ;)).
      [mail function]
      ; For Win32 only.
      ; http://php.net/smtp
      ; SMTP = localhost
       
      ; http://php.net/smtp-port
      ; smtp_port = 25
    • Kicsit lentebb, a sendmail_path változót állítsuk át az msmtp-re /usr/bin/msmtp adjuk meg neki a konfigurációs fájl elérési útját -C /etc/msmtprc, a naplózás helyét /var/log/msmtp.log, mely tartalmazza az SMTP logokat, azaz itt kezdhetjük a hibakeresést, ha nem mennek ki a leveleink (vagy túl sok megy ki, pl. valamilyen alkalmazás spammel), a konfigurációs fájl account paraméternél megadott fióknevet -a gmail végül pedig, hogy bármilyen e-mail címre engedje a levél küldést: -t. Mind együtt:
      ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
      ; http://php.net/sendmail-path
      sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc --logfile /var/log/msmtp.log -a gmail -t"
    • Kicsit lentebb olvasva a PHP konfigurációban még két opciót érdemes aktiválnunk. Az egyik a mail.add_x_header = On, mely megmondja, hogy honnan (e.g. milyen PHP alkalmazásból, pl. Drupal) jött a levél. A mail.log = /var/log/php_mail.log opció pedig PHP szinten naplózza az e-mail küldést. Emberek vagyunk, követünk el hibákat, és a programjaink is lyukasak. Ebből a két kombinációból pedig előbb vagy utóbb előfordulhat nagyobb gond, mint például egy kellemetlen alkalmazás belopakodik a szerverünkre és elkezd leveleket küldeni. Nos, ezen két opció segít megtalálni a kellemetlenkedő (PHP) alkalmazást.
      ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
      mail.add_x_header = On
       
      ; The path to a log file that will log all mail() calls. Log entries include
      ; the full path of the script, line number, To address and headers.
      mail.log = /var/log/php_mail.log
    • Mentsük el és zárjuk be a php.ini állományt.
  4. Utolsó előtti lépésben hozzuk létre és tegyük a PHP-t futtató felhasználóévá (itt www-data) a fentebb említett két naplóállományt:
    sudo touch /var/log/php_mail.log /var/log/msmtp.log
    sudo chown www-data:www-data /var/log/php_mail.log /var/log/msmtp.log
  5. Végül, de nem utolsó sorban indítsuk újra a PHP-t futtató alkalmazást, majd teszteljük le a működést. Ha nem kerülnek kiküldésre a leveleid, akkor a fenti naplóállományokban tájékozódhatsz.