Простой веб-интерфейс для работы с почтовым ящиком POP3.
Автор: Maxxx
Сайт: http://deadman.narod.ru
Рейтинг: N/A из 7
<<НАЗАД
Используя его можно просматривать, удалять и отвечать на сообщения.
Также имеется возможность просматривать или скачивать прикрепленные к письму
файлы. Пока предусмотрена работа с письмами только в кодировках win1251 и
koi8-r. Возможно, в следующих версиях, будет добавлена поддержка других
кодировок. Для работы необходим установленный на сервере sendmail и пакет
библиотек MIMETools. Взять его можно здесь:
http://www.zeegee.com/code/perl/MIME-tools/download/MIME-tools-5.411.tar.gz
Для его установки обратитесь к администратору сервера, либо в службу поддержки
компании, на чьем хостинге вы планируете использовать скрипт.
----------------------------------- ФАЙЛЫ --------------------------------------
Распространяется как zip-архив, содержащий три файла:
----------------------------
readme - этот файл
readme.html - тоже самое, в хтмл варианте
mail.pl - собственно, файл скрипта
---------------------------- УСТАНОВКА И НАСТРОЙКА -----------------------------
Скопируйте файл mail.pl на сервер и установите права доступа как 755
Настройка достаточна проста - откройте файл скрипта в текстовом редакторе и
замените следующие строки:
$mailserver = 'mail.server.ru'; на адрес своего майлсервера
$admail = 'webmaster@server.ru'; на е-майл вашего вебмастера
Затем, в корневой директории вашего веб-сервера создайте каталог "mail", где
будут временно храниться прикрепленные файлы.
Все, от вас больше ничего не требуется, скрипт готов к работе.
------------------------------- РАБОТА С ПОЧТОЙ --------------------------------
Все элементарно! После установки и настройки заходите по адресу
http://www.yourserver.ru/cgi-bin/mail.pl
Вам будет предложено ввести логин и пароль. Введите логин и пароль от вашего
почтового ящика на сервере, имя которого указано в скрипте, как имя майлсервера
и нажмите кнопку "Войти". Увидите список пришедших вам сообщений(если таковые
имеются). Чтобы просмотреть сообщение, щелкните по его теме. Для удаления -
отметьте ненужные сообщения и нажмите кнопку "Удалить".
---------------------------------- ВНИМАНИЕ! -----------------------------------
Возможны некоторые ошибки в плане безопасности - будьте внимательны при ее
использовании. И еще:
данная версия скрипта является бетой и может работать некорректно. Поэтому,
автор не несет никакой ответственности за утерю или порчу какой-либо информации.
Распространяется бесплатно; любые изменения, добавления и исправления
приветствуются(только не забываем извещать автора!).
#!/usr/bin/perl
use Mail::POP3Client;
$ver='MailInterface script v.0.3.22 Beta (от 13.10.2001)';
################################################################################
####### Скрипт создания простого веб-интерфейса для работы с POP3 e-mail #######
####### Для его функционирования необходимы библиотека Mail::POP3Client #######
####### и установленный на сервере пакет MIME-tools. #######
################################################################################
################################################################################
####### Замените mail.server.ru на адрес своего mail-сервера. #######
####### webmaster@server.ru - e-mail адрес Вашего вебмастера. #######
################################################################################
$mailserver = 'mail.ozara.ru';
$admail = 'webmaster@ozara.ru';
################################################################################
####### Далее можете (и желательно) ничего не менять #######
################################################################################
print "Content-type:text/html\n\n";
%FORM=();
($result, $mess)=&GetFormInput;
&Error($mess) if ($result==0);
&passver;
$login = $FORM{login};
$password = $FORM{password};
if ($FORM{'exit'} eq 'ok') {
&userdir;
$login=$FORM{login}='';
$password=$FORM{password}='';
}
$authmode = "PASS";
$pop = new Mail::POP3Client( USER => $login,
PASSWORD => $password,
HOST => $mailserver,
AUTH_MODE => $authmode);
# $FORM{code}='koi' if ($FORM{code} eq '');
$koi="бвчзде_цъйклмнопртуфхжигюыэящшьасБВЧЗДЕ_ЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС";
$win="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
&output;
################################################################################
sub main {
if ($FORM{'send'} ne '') {
&send_mess;
return;
}
$number=$pop->Count();
if ($FORM{'del'} eq 'ok') {
&del_mess;
return;
}
if ($FORM{'view'} ne '') {
&userdir;
&get_body($FORM{'view'});
return;
}
if ($FORM{'login'} eq '') {
print '
Введите пароль: Логин: Пароль: ©2001 Argom Group
';
return;
};
if ($number eq "-1") {
print 'ВЫХОД ';
print " \n";
print 'Извините, но Вы ввели неверный пароль к ящику '.$login; print ', либо ящика с таким именем на нашем сервере не существует ';
return;
}
&userdir;
print "Ваш логин: $login \n";
print " СОЗДАТЬ \n"; print "ВЫХОД \n";
print " Сейчас в Вашем ящике ",$number," сообщений. \n";
print "\n";
print "\n";
print "\n";
if ($number ne "0") {
print "\n";
print " \# Отправитель Тема Удалить? \n";
}
for( $i = 1; $i <= $number; $i++ ) {
print " \n";
print " $i \n";
$subj='';
foreach( $pop->Head($i)) {
/^(From):\s+/i && print " ",$_=&trans4b64($_)," \n";
/^(Subject):\s+/i && { $subj=&trans4b64($_) };
}
if ($subj eq '') {
$subj='Без темы';
}
print "\n ",$subj," \n";
print " \n";
print " \n";
}
if ($number eq "-1" || $number eq "0") {print ''}
else {
print ' ',"\n";
print 'Удалить все отмеченные сообщения?',"\n";
print '',"\n";
}
return;
}
################################################################################
sub get_body {
$numb_mess = shift;
print '';
print " <<<назад \n";
print " выбор кодировки: windows1251\n"; print "koi8-r \n";
print " ВЫХОД \n";
print ' '; print "Письмо \#$numb_mess\n"; foreach ($pop->Head($numb_mess)) { $_=~s/=\?koi8-r\?/=\?KOI8-R\?/; $_=~s/=\?Koi8-r\?/=\?KOI8-R\?/; $FORM{code}='win' if (($_=~/.*charset.*windows-1251/) && $FORM{code} ne 'koi'); $mailer=$_ if ($_=~/^X-Mailer:\s+/); if ($_=~/^From:\s+/) { (@subj)=split(/\s/,$_); foreach (@subj) { $from.=&trans4b64(' '.$_); } $ch=1; next; } if ($ch eq 1) { $from.=&trans4b64($_) if ($_=~/^\s*=\?.+\?.+\?=/); } if ($_=~/^Subject:\s+/) { (@subj)=split(/\s/,$_); foreach (@subj) { $subject.=&trans4b64(' '.$_); } $ch=2; next; } if ($ch eq 2) { $subject.=&trans4b64($_) if ($_=~/^\s*=\?.+\?.+\?=/); } if ($_=~/^To:\s+/) { (@subj)=split(/\s/,$_); foreach (@subj) { $to.=&trans4b64(' '.$_); } $ch=3; next; } if ($ch eq 3) { $to.=&trans4b64($_) if ($_=~/^\s*=\?.+\?.+\?=/); } if ($_=~/^Date:\s+/) { $date=&trans4b64($_); next; } } ($from)=$from=~/^\s*(.*)/; ($to)=$to=~/^\s*(.*)/; ($subject)=$subject=~/^\s*(.*)/; print " ($mailer) \n";
print " Создано: $date \n";
print " От: $from \n";
print " Кому: $to \n";
print " Тема: $subject \n";
print ' Текст письма:'; $t=0; foreach ($pop->HeadAndBody($numb_mess)) { @body_m[$t]=&trans($_)."\n"; $t++; } &mime_op; &viewbody; print ' ';
if (@mass) {
print ''; print 'К письму были приложены файлы:',"\n"; print @mass; print ' ',"\n";
}
&send_mess;
return;
}
################################################################################
sub trans {
if ($_[1] ne 'back') {
$instr= $_[0];
if (($FORM{'code'} eq 'koi') || ($FORM{'code'} eq '')) {
$outstr="";
for ($w=0; $w=0) {
$newsymb=substr($win, $pos, 1);
$outstr.=$newsymb;
}
else {
$outstr.=$symb;
}
}
}
$outstr=$instr if ($FORM{'code'} eq 'win')
}
else {
$instr= $_[0];
$outstr="";
for ($w=0; $w=0) {
$newsymb=substr($koi, $pos, 1);
$outstr.=$newsymb;
}
else {
$outstr.=$symb;
}
}
}
return ($outstr);
}
################################################################################
sub crypt {
{ $instr= $_[0];
$outstr="";
for ($w=0; $w/\>\;/;
$f=~s/\"/\"\;/g;
$f=~s/From://;
$f=~s/Subject://;
$f=~s/To://;
$f=~s/Date://;
$a=$f;
if ($f=~/.+\?.+\?B\?.+\?=.*/) {
($a,$c,$f,$d)=$f=~/^\s*(.+\s*)=\?(.+)\?B\?\s*(.+)\s*\?=(.*)/;
$decoded = decode_base64($f);
$a.=$decoded;
$a.=$d;
}
if ($f=~/.+\?.+\?Q\?.+\?=.*/) {
($a,$c,$f,$d)=$f=~/^\s*(.+\s*)=\?(.+)\?Q\?\s*(.+)\s*\?=(.*)/;
$decoded = decode_qp($f);
$a.=$decoded;
$a.=$d;
};
$a=&trans($a) if ($c!~/win/);
return ($a);
}
################################################################################
sub mime_op {
use MIME::Parser;
my $parser = new MIME::Parser;
$parser->output_dir("$userdir");
$msgs="MIME разбор не выполнен!\n";
$entity = $parser->parse_data(\@body_m) or &Error($msgs);
return;
}
################################################################################
sub viewbody {
@files=<$userdir/*>;
$i=0;
foreach (@files) {
$rw=$_;
if ($rw=~/$userdir\/msg-.*-.*\.txt/) {
open (DATAF,$_);
@msg1=;
close (DATAF);
foreach $k (@msg1) {
$k=~s//\>\;/g;
$k=~s/\"/\"\;/g;
print $k,"\n";
}
}
else {
$_=~s/$userdir\///;
@mass[$i]="$_";
$i++;
}
};
return;
}
################################################################################
sub send_mess {
if ($FORM{'send'} eq 'ok') {
if (!$FORM{'m_to'} or $FORM{'m_to'}=~/^\s+/ or $FORM{'m_to'}!~/@/ ) {
$mess='Некорректный адрес получателя';
&Error($mess);
return;
}
$headmb='Новое сообщение';
use MIME::Entity;
$top= MIME::Entity->build(Type =>"text/plain; charset=koi8-r",
Encoding=> "8bit",
'X-Mailer'=> $ver,
From => $FORM{'login'},
To => &trans($FORM{'m_to'},back),
Subject => &trans($FORM{'m_subject'},back),
Data => &trans($FORM{'m_message'},back));
open MAIL, "| /usr/sbin/sendmail -t -oi -oem" or die "!!!";
$top->print(\*MAIL);
close MAIL;
print "\n"; print "\n"; print "<<<назад Ваше сообщение отослано";
}
else {
if ($FORM{'send'} ne 'new') {
$subject="Re: ".$subject;
$headmb='Ответить';
}
if ($FORM{send} eq 'new') {
$headmb='Новое сообщение';
print '';
print " <<<назад \n";
print " ВЫХОД \n";
print ' ';
}
print <<_END_HTML
$headmb: Кому: Тема: Сообщение: Здравствуйте!
_END_HTML
}
return;
}
################################################################################
sub del_mess {
$i=0;
$count=0;
for ($i; $i<=$number; $i++) {
if ($FORM{$i} eq 'del') { $pop->Delete($i);
$count++;
}
}
print "Удалено $count сообщений \n"; print "<<<назад\n"; print ' ВЫХОД ';
return;
}
################################################################################
sub output {
print '
'; &main; print "$verВнимание! Это тестовая версия программы"; print "Если возникнут проблемы, пишите администратору:$admail \n"; print " ";
$pop->Close();
exit 0;
}
################################################################################
sub userdir {
$userdir="$ENV{DOCUMENT_ROOT}/mail/$login";
if (-d $userdir) {
@files=<$userdir/*>;
foreach (@files) {
unlink ($_);
}
}
else
{
mkdir ("$userdir", 0755) || die "Невозможно создать $userdir: $!";
}
return;
}
################################################################################
sub GetFormInput
{ local($name, $value, $buffer, $err, $pair, @pairs);
$err="Разбор запроса завершен.";
if ($ENV{'REQUEST_METHOD'} eq 'GET')
{ @pairs=split(/&/, $ENV{'QUERY_STRING'});
}
elsif ($ENV{'REQUEST_METHOD'} eq 'POST')
{ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs=split(/&/, $buffer);
}
else
{ $err="Метод запроса не опознан. Используйте GET или POST.";
return(0, $err);
}
foreach $pair (@pairs)
{ ($name, $value)=split(/=/, $pair);
$value=~tr/+/ /;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
$FORM{$name}=$value;
}
return(1, $err);
};
################################################################################
sub Error
{ local($message)=$_[0];
print ""; print "Ошибка \n";
print "$message\n";
print "\n";
print "\n";
}
################################################################################
<<НАЗАД
ОЦЕНИТЬ СТАТЬЮ
ВЕРСИЯ ДЛЯ ПЕЧАТИ>>
Статья прочитана :
раз.
|