Хитрое уведомление о приходе почты
Есть почтовый ящик. Хочу сделать следующее.
При приходе почты с опроеделенного адреса должно посылаться уведомление на другой адрес.
Но не сходу, а с учетом времени: если письмо пришло после 22:00 никого уведомлять не надо, а
уведомить надо только после 10:00 следующего дня.
Тест уведомления (план-минимум): Содержания сабджекта письма.
Тест уведомления в идеале: Сабджект письма + тест сообщения с заменой переводов строки на "/". Аттачи - отсекаем.
Если текст больше стадартного размера русского SMS - делаем транслитерацию. Если и это не помогло - остальное просто отбрасываем.
ВОПРОС в следующем: как это бестрее и проще реализовать технически ?
- настроечныйм файлом почтового обработчика(.procmailrc) ?
- perl/php скриптом работающем по крону ?
- каким-то софтом под винды (постоянно работающая машина под виндами есть) ?
- другое решение ?
Средствами почтового сервера почта направляется на программу-обработчик, написанную на любом удобном языке.
Пример для sendmail:
в файл /etc/aliases добавляется строка
mymail: "| /usr/bin/mymailhandler", mymail
вся почта, приходящая на mymail@mymail.ru
, кроме того, что сохранится в локальном почтовом ящике mymail, будет попадать на обработку программе /usr/bin/mymailhandler
Программа mymailhandler проверяет адрес отправителя и, если он тот, что нам нужен, обрабатывает письмо (выделяет subject, отсекает вложения, выполняет все нужные преобразования) и, если текущее время с 10:00 до 22:00, отсылает как уведомление результат обработки. Если текущее время больше 22:00 или меньше 10:00, уведомление кладется в очередь, организованную, например, в виде каталога с файлами. В 10:00 каждый день программа mymailhandler запускается через cron с каким-нибудь ключом, заставляющим ее отправить все уведомления, имеющиеся в очереди, с удалением их из очереди после отправки.
Как вариант, функцию обработки письма и функцию отправки можно реализовать в виде отдельных программ.
Спасибо !
А если у меня shared хостинг ?
Существует ли при этом какой либо аналог /etc/aliases ?
Эх... у меня похоже вообще никаких скриптов на тарифном плане нет.
Правда .forward в принципе пашет !
Нельзя ли при таких условиях сделать хотя бы тупую отсылку самджекта или ну хоть всей копии письма (не пересылку !) на другой адрес ?
А если всю почту копировать, то вписать адрес в .forward
myanothermail@mail.ru, mymail
Ну .procmail то доступен.
И даже копирование работает :)
:0: * ^ FROM.*user1@domain1.ru { :0 c !user2@domain2.ru }
Но... мне копию нужно отправлять на на чтото@sms.beemail.ru , а оно не отправляет туда сходу :(
Можно как то сказать .procmail, чтобы он тест письма отправил в качестве копии или просто "пришло письмо" ?
Мало что понял...
Вот так не работает?
:0hc * ^From.*user1@domain1.ru ! user2@domain2.ru
- Так не работает (даже пересылка на обычную почту) - почему не знаю.
- чтото@sms.beemail.ru - адрес мобилы и туда копии сообщений не приходят вообще.
Пока никак...
Оператор мобилы не принимает на адрес по умолчанию мессаджи от роботов.
Нужно заводить адрес для роботов специальный.
http://www.beonline.ru/portal/comm/mem.sms?section=forw2sms
Вроде есть реакция...
.forward - настроечный файл для procmail
позволяет управлять почтой - писать автооответчики, форвардинг, спам-фильтры.
Только пока не пойму как в отсылаемом сообщении заменить пустые строки например на '*'.
А лучше вообще кдалить пустые строки - как это сделать ?
Работающий форвардинг такой:
:0 H c * From.*user@mail\.ru ! user2@mail.ru
настройки для procmail хранятся в .procmailrc, man procmail procmailrc
работать с текстом письма: man formail sed
В принципе я остановился на следующих скриптах.
Форвардит письма пришедшие с адресов adresat1@yandex.ru,
adresat2@rambler.ru, adresat3@mail.ru на адрес myforwardmail@yandex.ru
:0 H c * From.*(adresat1@yandex\.ru|adresat2@rambler\.ru|adresat3@mail\.ru) ! myforwardmail@yandex.ru
Форвардит письма пришедшие с адресов adresat1@yandex.ru
на адрес myforwardmail@yandex.ru удаляя при этом пустые строки
:0 c * H ?? From:.*adresat1@yandex\.ru { :0 fbw | sed -e '/^$/d' :0 ! myforwardmail@yandex.ru }
Форвардит письма пришедшие с адресов adresat1@yandex.ru
на адрес myforwardmail@yandex.ru заменяя при этом пустые строки на символ
подчеркивания.
:0 c * H ?? From:.* adresat1@yandex\.ru { :0 fbw | sed -e 's/^$/_/g' :0 ! myforwardmail @yandex.ru }
Когда будете пересылать по ftp - обязательно в ASCII формате (не в Binary)!
ТЕПЕРЬ ВОПРОС
Хотелось бы добавить еще условие, а имеено:
Если письмо от пользователя adresat1@yandex.ru в кодировке koi8-r, то
в копию перекодируем (средствами sed или formail) и windows1251 , не забывая сменить заголовок charset.
Как это сделать ?
:0 H * ^Context-Type: text/plain; .+charset=.*koi8-r.* { :0 f | rcode -kw | formail -i "Content-Type: text/plain; charset=windows-1251" }повротить для разных context-type
:0 H c * From.*(adresat1@yandex\.ru|adresat2@rambler\.ru|adresat3@mail\.ru) ! myforwardmail@yandex.ru
:0 c * H ?? From:.*adresat1@yandex\.ru { :0 H * ^Context-Type: text/plain; .+charset=.*koi8-r.* { :0 f | rcode -kw | formail -i "Content-Type: text/plain; charset=windows-1251" } :0 ! myforwardmail@yandex.ru }Не конвертит.
:0 H * From: .*test@test.com { LOG="mail from test@test.com " :0 Hf * ^Content-Type: text/plain;.*charset=.?koi8-r.? | iconv -fKOI8-R -tCP1251 | formail -i "Content-Type: text/plain; charset=windows-1251" :0 | sendmail -oi -t }rcode — какая-то приблуда, достаточно надежно перекодирует из koi8-r в cp1251 и обратно.
iconv, к сожалению, иногда валится. но если никак, то можно и его, либо перл с Encode.