Скрипт предназначен для отправки почты по протоколу ESMTP; поддерживает нешифрованную авторизацию (AUTH LOGIN).
Использует только встроенный telnet, дополнительных пакетов не требует.
Протестировано на почтовиках mail.ru и yandex.ru - работает, gmail.com - не работает (т.к. gmail не поддерживает нешифрованную авторизацию).
Ссылка на mail.sh: mail.rar
Пример использования:
Отправляем письмо при подключении роутера к провайдеру.
1. Кладем mail.sh в каталог /tmp/local/sbin, делаем его исполняемым
2. Создаем в том же каталоге файл ip-up-custom с таким содержимым:
Code:
#!/bin/sh
/tmp/ppp/ip-up $*
/tmp/local/sbin/mail.sh -s smtp.mail.ru -f router@mail.ru -t router-owner@gmail.com -l login -p password -m "Interface name: $1\nTty device: $2\nSpeed: $3\nLocal IP: $4\nRemote IP: $5" -j "Router: connected to ISP" -v | logger
так же делаем его исполняемым (то, что выделено курсивом изменить на свои данные).
2a. Если не нужен вывод в системный лог - убрать "| logger"
2b. Если не нужна информация о запросах/ответах сервера - убрать "-v"
4. Сохраняем флэш: flashfs save && flashfs commit && flashfs enable
5. Идем в WEB-морду - IP Config/WAN & LAN, прописываем в "Additional pppd options" такую команду (без кавычек): "ip-up-script /tmp/local/sbin/ip-up-custom"
6. Нажимаем сохранить и перезагрузить
Оригинальный пост (27-01-2010):
Началось все с желания получать уведомление по почте о подключении роутера к провайдеру.
пробовал встроенный mini_sendmail - не подошло, т.к. не поддерживает SMTP авторизацию. Установка других клиентов тоже не подошла - ну не хочется забивать место всякими дополнительными либами для такой тривиальной задачи.
В конце-концов написал небольшой скриптик, для отправки почты telnet'ом (полностью рабочий и опробованный мной на почтовиках yandex.ru и mail.ru; с gmail.com не работает, т.к. тот не поддерживает нешифрованную авторизацию). Сам скрипт см. ниже.
Проблема заключается в том, что после отправки каждой команды надо ждать ответа сервера (в идеале конечно еще и парсить этот ответ на предмет ошибок). Обошел это введением sleep'а в одну секунду, после каждой команды.
пример mail.sh, вызываемого из ip-up, с пятью параметрами:
(отмеченно красным цветом надо заменить на свои параметры; отмеченное курсивом писать не надо - это комментарии; зеленым отмечено тело письма; сконвертить в Base64 можно здесь: http://base64-encoder-online.waraxe.us/)
Code:
#!/bin/sh
echo EHLO smtp.mail.ru <адрес SMTP сервера, как правило соответствует параметру, переданному telnet'у (см. пример вызова)>
sleep 1
echo AUTH LOGIN
sleep 1
echo -e "bG9naW4=" <имя пользователя в кодировке Base64>
sleep 1
echo -e "cGFzc3dvcmQ=" <пароль в кодировке Base64>
sleep 1
echo -e "MAIL FROM: <router@mail.ru>" <адрес, с которого будет послано сообщение>
sleep 1
echo -e "RCPT TO: <router-owner@gmail.com>" <адрес, кому будет послано сообщение>
sleep 1
echo DATA
sleep 1
echo Subject: Router
echo From: router@mail.ru <должно соответствовать MAIL FROM, указанному выше>
echo To: router-owner@gmail.com <должно соответствовать RCPT TO, указанному выше>
echo -e "Interface name: $1"
echo -e "Tty device: $2"
echo -e "Speed: $3"
echo -e "Local IP: $4"
echo -e "Remote IP: $5"
echo -e "."
sleep 1
echo QUIT
echo -e ""
вызывается таким образом:
Code:
mail.sh $* | telnet smtp.mail.ru 25
для того, чтоб вывод попал в системный лог, можно в конце добавить "| logger"
Вроде работает, но хотелось бы сделать по человечески, чтобы следующая команда выполнялась после того, как от сервера получен ответ. Гуру shell'а подскажите, можно как-то завернуть вывод telnet'а обратно на mail.sh? Чтоб скрипт ждал ответа сервера до выполнения следующей команды, вместо sleep 1.
И еще есть в роутере какие-нибудь встроенные средства для конверта в Base64? тогда можно было бы все параметры почты/логина вынести наружу.