Często zdarzyć się może, że serwer pod naszą kontrolą wysyła spam (zainfekowana strona, złośliwy plik php, zły plugin do strony).
W bardzo łatwy sposób możemy wychwycić to zachowanie tworząc tzw. 'wrapper’ dla polecenie sendmail, z którego korzysta bardzo dużo skryptów PHP.
1. Tworzymy plik /usr/local/bin/phpsendmail:
vi /usr/local/bin/phpsendmail ### początek ### #!/usr/bin/php <?php /** This script is a sendmail wrapper for php to log calls of the php mail() function. Author: Till Brehm, www.ispconfig.org (Hopefully) secured by David Goodwin <david @ _palepurple_.co.uk> */ $sendmail_bin = '/usr/sbin/sendmail'; $logfile = '/tmp/mail_php.log'; //* Get the email content $logline = ''; $pointer = fopen('php://stdin', 'r'); while ($line = fgets($pointer)) { if(preg_match('/^to:/i', $line) || preg_match('/^from:/i', $line)) { $logline .= trim($line).' '; } $mail .= $line; } //* compose the sendmail command $command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_bin.' -t -i'; for ($i = 1; $i < $_SERVER['argc']; $i++) { $command .= escapeshellarg($_SERVER['argv'][$i]).' '; } //* Write the log file_put_contents($logfile, date('Y-m-d H:i:s') . ' ' . $_ENV['PWD'] . ' ' . $logline, FILE_APPEND); //* Execute the command return shell_exec($command); ?> ### koniec ###
Oczywiście należy dostosować skrypt do lokalizacji sendmaila:
which sendmail
Jeżeli lokalizacja jest inna niż /usr/sbin/sendmail należy go zmienić w skrypcie
Ustawiamy uprawnienia na nasz skrypt:
chmod +x /usr/local/bin/phpsendmail #tworzymy logi touch /var/log/mail.form chmod 777 /var/log/mail.form
2. Następnie edytujemy plik php.ini
vi /etc/php5/apache2/php.ini #zmieńmy ten kod: [mail function] ; For Win32 only. SMTP = localhost smtp_port = 25 ; For Win32 only. ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ;sendmail_path = ## na ten: [mail function] ; For Win32 only. ;SMTP = localhost ;smtp_port = 25 ; For Win32 only. ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). sendmail_path = /usr/local/bin/phpsendmail
Jeżeli używamy PHP jako CGI lub suPHP, należy także edytować plik: /etc/php5/cgi/php.ini
Resetujemy usługę:
service apache2 restart
3. Przetestujmy nasz wrapper
Utwórz plik mailtest.php w katalogu ze stroną np. /var/www/example.com/public_html
<?php mail('yourname@yourdomain.com','This is a test message subject','This is a test message body'); echo 'Mail sent.'; ?>
Otwórzmy stronę w przeglądarce
Sprawdzmy czy plik logu zapisał zdarzenie
cat /var/log/mail.form