Материал просмотрен 3,031 раз(а)

Скрипт для отправки почты

(автор antherios)

собственно говоря скрипт был написан для целей оповещения админа о результате выполнения резервного копирования (сам бэкап снимался скриптом на bash).

Данная реализация не претендует на универсальное решение, но при желании его легко можно модифицировать под нужную задачу.

Собственно сам текст скрипта (писался под Debian, но будет работать и под другими ОС после правок, в зависимости от дистрибутива).

#!/usr/bin/env perl
use Net::SMTP;
$subj_text = "резервное копирование";
$smtp_mail_from = "ящик\@домен.ru";
$smtp_addr = "почтовик";
$email = "имя\@домен";
#$email2 = "test\@mail.ru";
$serv = "srv_name";
system("tree -a -h -D /путь/где_архив > outfile01");
open(OF, "outfile01") || die "Ошибка при открытии outfile01: $1";
@DIR001=<OF>;
close(OF);
system("tree -a -h -D /arc/site_backup > outfile02");
open(OF, "outfile02") || die "Ошибка при открытии outfile02: $1";
@DIR002=<OF>;
close(OF);
print("Отправка письма...\n");
$smtp = Net::SMTP->new($smtp_addr);
$smtp->auth('login', 'pass');
$smtp->mail($smtp_mail_from);
$smtp->to($email);
$smtp->data();
$smtp->datasend("From: $smtp_mail_from \n");
$smtp->datasend("To: $email \n");
$smtp->datasend("X-Mailer: Exim 4");
$smtp->datasend("Reply-To: $smtp_mail_from \n");
$smtp->datasend("Content-Type: text/plain; charset=UTF-8\n");
$smtp->datasend("Content-Transfer-Encoding: quoted-printable\n");
$smtp->datasend("Subject: $subj_text\n");
$smtp->datasend("Мониторинг свободного пространства на @serv \n");
$smtp->datasend(@DIR001);
$smtp->datasend("\n");
$smtp->datasend(@DIR002);
$smtp->datasend("\n");
$smtp->dataend();
$smtp->quit;
system("rm outfile0*");
print("Письмо отправлено!");

а теперь подробнее рассмотрим работу скрипта:

#!/usr/bin/env perl — указываем путь к интерпретатору Perl (идет по умолчанию в большинстве дистрибутивов), директива  env — заставит систему искать бинарник самостоятельно 🙂

use Net::SMTP; – указываем библиотеку которую будем юзать, в нашем случае данный компонент придется доустановить через CPAN (http://www.opennet.ru/base/dev/perl_cpan_inst.txt.html)

$subj_text = "резервное копирование"; –  тема письма (как настроите)

$smtp_mail_from = "ящик\@домен.ru";  ящик/алиас от которого отправляем (можно указать любое имя/домен, при условии соблюдения синтаксиса записи!). Само собой 25 порт должен быть открыт (правила для iptables приведены в конце заметки)

$smtp_addr = "почтовик"; – адрес почтового сервера, варианты: ip или dns
$email = "имя\@домен"; – адрес кому шлем письмо, если несколько то
$email2 = "имя\@домен"; второй получатель – при необходимости можно нарисовать еще 🙂
$serv = "srv_name"; – вписать имя сервера с которого шлем письмо
system("tree -a -h -D /путь/где_архив > outfile01"); – сюда вбить адрес папки которую нужно смотреть (данная команда сделает вывод содержимого папки в виде дерева — требует компонент tree), легко меняется на свой вариант

этот блок править только если внесли изменения в параметр  outfile01 (см. выше)

open(OF, "outfile01") || die "Ошибка при открытии outfile01: $1";
@DIR001=<OF>;
close(OF);

ниже идет формирование и отправка письма, если требуется авторизация — вносим логин/пароль в соответствующую строку и при необходимости добавляем/меняем параметры.

Важное замечание: Perl требует наличия ; в конце строки с командой, иначе будет сообщение об ошибке.

$smtp = Net::SMTP->new($smtp_addr);
$smtp->auth('login', 'pass'); # авторизация на почтовом сервере
$smtp->mail($smtp_mail_from);
$smtp->to($email);
–  если больше одного адресата – добавить переменные
$smtp->data();
$smtp->datasend("From: $smtp_mail_from \n");
$smtp->datasend("To: $email \n");
  –  если больше одного адресата – добавить переменные
$smtp->datasend("X-Mailer: Exim 4");
$smtp->datasend("Reply-To: $smtp_mail_from \n");
$smtp->datasend("Content-Type: text/plain; charset=UTF-8\n");
$smtp->datasend("Content-Transfer-Encoding: quoted-printable\n");
$smtp->datasend("Subject: $subj_text\n");
$smtp->datasend("Мониторинг свободного пространства на @serv \n");
$smtp->datasend(@DIR001);
  –  убрать/добавить если менялось количество директорий для просмотра
$smtp->datasend("\n");
$smtp->datasend(@DIR002);
$smtp->datasend("\n");
$smtp->dataend();
$smtp->quit;

для открытия порта (25) выполнить

iptables -A FORWARD -o eth1 -m state --state NEW -p tcp --dport 25 -j ACCEPT