Задача: автоматическая обработка почты и запись данных в mysql базу.
Dovecot и Postfix
Для начала нужно установить Dovecot и Postfix (я ставил версию с mysql)
Установка сервера приема почты это долгое и неблагодарное занятие которое съело у меня 6 часов, поэтому описывать это я не буду, гайдов полно в гугле.
Затем через postfixadmin версии 2.3.6 добавил catch all(т.е. все письма отправленные на любой адрес(даже не существующий) попадающие на наш сервер идут на одну почту) адрес с которого собирается почта на уже другой локальный ящик(тоже созданный в админке)
Сам фильтр добавить не трудно, проблема скорее в разборе письма… Пытался установить mailparse в php, но он отказался компилироваться, пришлось изобретать велосипед.
Добавление фильтра
Идем в /etc/postfix и открываем master.cf
добавляем в конце волшебные строки(перед второй строкой обязательно должно быть 2 пробела)
1 2 |
myhook unix - n n - - pipe flags=F user=www-data argv=/var/www/mailbot.php ${sender} ${size} {recipient} |
myhook — название нажего хука/функции
user — пользователь из под которого будет запускаться скрипт
argv — собственно расположение скрипта
так теперь чтобы он срабатывал надо добавить в этом же файле выше одну строчку
находим
1 |
smtp inet n - - - - smtpd |
и добавляем строку(опять же 2 пробела здесь в начале)
1 |
-o content_filter=myhook:dummy |
в итоге получится
1 2 |
smtp inet n - - - - smtpd -o content_filter=myhook:dummy |
Сохраняем, закрываем и делаем
1 |
postfix reload |
Обработчик php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#!/usr/bin/php -q <?php $sock = fopen ("php://stdin", 'r'); $email = ''; while (!feof($sock)) { $email .= fread($sock, 1024); } fclose($sock); //Тема письма $subject1 = explode ("\nSubject: ", $email); $subject2 = explode ("\n", $subject1[1]); $subject = $subject2[0]; //Кому $to1 = explode ("\nTo: ", $email); $to2 = explode ("\n", $to1[1]); $to = str_replace ('>', '', str_replace('<', '', $to2[0])); $message1 = explode ("\n\n", $email); $start = count ($message1) - 3; if ($start < 1) { $start = 1; } //От кого $from1 = explode ("\nFrom: ", $email); $from2 = explode ("\n", $from1[1]); if(strpos ($from2[0], '<') !== false) { $from3 = explode ('<', $from2[0]); $from4 = explode ('>', $from3[1]); $from = $from4[0]; } else { $from = $from2[0]; } file_put_contents("/var/www/mail.log", $email.PHP_EOL, FILE_APPEND); // на всякий случай записываем все письмо в лог // вытаскием данные из тела письма preg_match("/var1: ([a-zA-Z0-9\.]{1,20})/", $email, $var3); preg_match("/var2: ([a-zA-Z0-9\.]{1,20})/", $email, $var3); preg_match("/var3: ([a-zA-Z0-9\.]{1,20})/", $email, $var3); $var1 = $var1[1]; $var2 = $var2[1]; $var3 = $var3[1]; /*тут ваши произвольные действия с полученными данными*/ /* * Пример письма отправляемого на нашу catch all почту * * $message = ""; // Старт тела письма * $message .= "<p>var1: asdad</p>"; * $message .= "<p>var2: 123123</p>"; * $message .= "<p>var3: asdasd</p>"; * * $massage .= "тут ваш произвольный текст"; * $massage .= "данные из заполненной формы и т.д."; * * * */ ?> |
Собственно все.