Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Почтовые формы (поддержка Attach files) на perl

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Benedict



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Господа, кто может сказать как организровать отправку аттача с веб формы при помощи одного из этих скриптов Formmail (http://www.scriptarchive.com/formmail.html), bnbform.  
Или посоветуйте скрипт, поддерживающей отправку файлов на e-mail.

Всего записей: 129 | Зарегистр. 08-12-2001 | Отправлено: 10:39 20-01-2003
BookMaster



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
 
use MIME::Lite;
 
   my $msg = MIME::Lite->new
   (
 
   From => $from,
   To => $to,
   Subject =>'сабж',
   Type =>'multipart/related' ,
    );
 
   $msg->attach(Type => 'text/html',
   Data => $lettertext); # тело письма  
 
    $msg->attach(Type => 'image/gif',
   Id => 'index_01.jpg',
   Path => 'files/index_01.jpg',
   ); # приаттаченый файлик
   
     
  $msg->send();
 
 

 
примерно так....

Всего записей: 159 | Зарегистр. 13-10-2002 | Отправлено: 12:09 20-01-2003
Benedict



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Я так понимаю, это ПХП.... У меня же реч идет о perl
скрипт приблизительно такой... Как его доработать?
 
#!/usr/local/bin/perl
use Socket;
############## SPECIAL FORM VARIABLES ############################
#required:    comma delimited list of required entry fields
#data_order:  comma delimited list indicating what fields to actually
#             print and in what order.
#outputfile:  the name of the file to save the data in if using a file.
#             the file will automatically be named ending with .bout
#emailfile:   the name of the file to hold only the sender e-mail address
#             the file will automatically be named ending with .bemf
#ok_url:      URL to go to if successful
#not_ok_url   URL to go to if unsuccessful
#submit_to:   email address of person to input receive data by mail
#             this can be a comma seperated list of e-mail addresses
#cc_to:       email address of Cc Recipient
#             this can be a comma seperated list of e-mail addresses
#submit_by:   email address of person completing form
#autorespond: NO LONGER USED AS OF JAN 31, 2000
#automessage: text to print for autoconfirmation e-mail
#             the file will automatically be named ending with .baut
#form_id:     name of form for e-mail subject
#countfile:   name of file for serial number counter
#             the file will automatically be named ending with .bcnt
#okaydomains: prevents calling the script from other sites,
#             without restricting e-mail addresses.
#             replaces $SECURE_NAME from earlier versions.
#             use only lower case letters.
#SMTP_SERVER: the full host name of the server providing e-mail
#             gateway service
##################################################################
 
 
## MAIN ##########################################################
 
# uncomment the line below, and change bignosebird to your domain
# name if you wish to make is so the script can only be called
# from your site.
 
#@okaydomains=("http://mydomain.com", "http://www.mydomain.com");      
 
#SMTP_SERVER: indicates the name of the host acting as the e-mail
#             gateway. "localhost" should work on most systems.
 
#$SMTP_SERVER="localhost";
 
#OR IF SMTP IS UNAVAILABLE TO YOU, USE SEND_MAIL-
# BUT NOT BOTH!
 
$SEND_MAIL="/usr/sbin/sendmail -t";
 
$lockfile="/tmp/bnbform.lck";
 
   $SD=&sys_date;
   $ST=&sys_time;
 
   &decode_vars;
 
   &valid_page;
 
   if ($fields{'countfile'} ne "") { &get_number; }
 
   &valid_data;
 
   &write_data;
 
   if ($fields{'automessage'} ne "") { &answer_back; }
 
   if ($fields{'ok_url'} ne ""){
     print "Location: $fields{'ok_url'}\n\n"; exit;
   }
     else { &thank_you; }
 
##################################################################
sub write_data
{
 
   if ($fields{'submit_by'} ne "") {
       if (&valid_address == 0) {
          &bad_email;
          exit;
       }
   }
   
   if ($fields{'submit_by'} ne "" && $fields{'emailfile'} ne "") {
      open (EMF,">>$fields{'emailfile'}");
      print EMF "$fields{'submit_by'}\n";
      close (EMF);
   }
 
   if ($fields{'submit_to'} ne "") {
     $msgtext="";
     $msgtext .= "On $SD at $ST,\n";
     $msgtext .=  "Тут вам письмо один хмырь выслал... Почитайте, плиз:\n";
     $msgtext .=  "From Host: $ENV{'REMOTE_ADDR'}\n\n";
   }
 
   if ($fields{'outputfile'} ne "") {  
      &get_the_lock;  
      open(OUT_FILE,">>$fields{'outputfile'}");  
   }
 
   foreach $to_print (@sortlist) {
      if ($fields{'outputfile'} ne "")
       { print OUT_FILE "$fields{$to_print}\|"; }
      if ($fields{'submit_to'} ne "")
       { $msgtext .= "$to_print = $fields{$to_print}\n"; }
   }
   if ($fields{'outputfile'} ne "") {
     print OUT_FILE "$SD\|$ST\|\n";
     close(OUT_FILE);
     &drop_the_lock;
   }
 
   foreach $to_get (@recipients) {
      $mailresult=&sendmail($fields{submit_by}, $fields{submit_by}, $to_get, $SMTP_SERVER, $fields{form_id}, $msgtext);
      if ($mailresult ne "1") {
       print "Content-type: text/html\n\n";
       print "MAIL NOT SENT. SMTP ERROR: $mailcodes{'$mailresult'}\n";
       exit
      }
    }
   foreach $to_cc (@cc_tos) {
      $mailresult=&sendmail($fields{submit_by}, $fields{submit_by}, $to_cc, $SMTP_SERVER, $fields{form_id}, $msgtext);
      if ($mailresult ne "1") {
       print "Content-type: text/html\n\n";
       print "MAIL NOT SENT. SMTP ERROR: $mailcodes{'$mailresult'}\n";
       exit
      }
    }
 
}
 
##################################################################
sub decode_vars
 {
  $i=0;
  read(STDIN,$temp,$ENV{'CONTENT_LENGTH'});
  @pairs=split(/&/,$temp);
  foreach $item(@pairs) {
    ($key,$content)=split(/=/,$item,2);
    $content=~tr/+/ /;
    $content=~s/%(..)/pack("c",hex($1))/ge;
    $content=~s/\t/ /g;
    $fields{$key}=$content;
    if ($key eq "data_order") {
       $content=~s/\012//g;
       $content=~s/\015//g;
       $content=~s/ //g;
       $content=~s/ //g;
       @sortlist=split(/,/,$content);
    }
    if ($key eq "required") {
       $content=~s/\012//g;
       $content=~s/\015//g;
       $content=~s/ //g;
       @mandatory=split(/,/,$content);
    }
    if ($key eq "submit_to") {
       $content=~s/\012//g;
       $content=~s/\015//g;
       $content=~s/ //g;
       @recipients=split(/,/,$content);
    }
    if ($key eq "cc_to") {
       $content=~s/\012//g;
       $content=~s/\015//g;
       $content=~s/ //g;
       @cc_tos=split(/,/,$content);
    }
 
   }
    if  (
     ( ($fields{automessage}=~ /^([-\/\w.]+)$/ || $fields{automessage} eq "") &&
      ($fields{countfile}=~ /^([-\/\w.]+)$/ || $fields{countfile} eq "") &&
      ($fields{emailfile}=~ /^([-\/\w.]+)$/ || $fields{emailfile} eq "") &&
      ($fields{outputfile}=~ /^([-\/\w.]+)$/ || $fields{outputfile} eq "") )
    ) {$donothing=0;}
    else {
       print "Content-type: text/html\n\n sorry, invalid characters...\n";
       exit;
    }
   if ($fields{automessage} ne "") {$fields{automessage} .= ".baut";}
   if ($fields{countfile} ne "") {$fields{countfile} .= ".bcnt";}
   if ($fields{emailfile} ne "") {$fields{emailfile} .= ".bemf";}
   if ($fields{outputfile} ne "") {$fields{outputfile} .= ".bout";}
}
 
##################################################################
sub valid_data
  {
   if ($fields{'data_order'} eq "")    #make sure we have work to do!
    {
      print "Content-Type: multipart/mixed; boundary=\"----------AC1CB2310F4276\"\n\n";  
#      print "Content-type: text/html\n\n";  
      print <<__W1__;
 
      <H1>NO data_order list SPECIFIED!</H1>
 
__W1__
      exit;
    }
 
   foreach $to_check (@mandatory) #test all required fields, bail on 1st bad
    {                              
      if ($fields{$to_check} eq "") {
          if ($fields{'not_ok_url'} ne "") {  
              print "Location: $fields{'not_ok_url'}\n\n";
              exit;
          }
             else { &try_again; }
      }
   }
 
  }
 
##################################################################
sub thank_you
  {
 print "Content-type: text/html\n\n";  
 print <<__W2__;
   <BODY BGCOLOR="#FFFFFF">
   <CENTER>
   <TABLE WIDTH=550 BORDER=1>
    <TR>
     <TD>
      <H1>Thank you!</H1>
      Your information has been sent and I will be in touch
      with you as soon as I can
      <P>
      Here is the information you provided:
      <P>
__W2__
 
  foreach $itm (@sortlist) {
   print <<__W2A__;
   $itm: $fields{$itm}
   <BR>
__W2A__
  }
 
 print <<__W2B__;
  </TD>
  </TR>
 </TABLE>
 
__W2B__
 
      exit;
  }
 
##################################################################
sub try_again
  {
      print "Content-type: text/html\n\n";  
      print <<__W3__;
 
      <H1>Missing Data!</H1>
      <B>Please press the back button and fill in
      all required fields!<P></B>
 
__W3__
      exit;
  }
 
##################################################################
sub answer_back
 {
 
   $subject = "Thank you";
   $msgtext="";
  if ($fields{'automessage'} ne "") {
    open (AM,"< $fields{'automessage'}");
    while (<AM>) {
      chop $_;
      $msgtext .= "$_\n";
    }  
    close(AM);
  }
    else {
      $msgtext =<<__W4__;
 
Thank you for your submission. I will be
getting in touch with you soon.
 
__W4__
    }
  $replyaddr=$recipients[0];
  $mailresult=&sendmail($replyaddr, $replyaddr, $fields{submit_by}, $SMTP_SERVER, $subject, $msgtext);
 }
 
##################################################################
 
sub get_number
 {
   $newnum=0;
   open(COUNTER,"<$fields{'countfile'}");
   while($thisnum=<COUNTER>) {
      if ($thisnum eq "") { $thisnum = 0;}
      $newnum = $thisnum + 1;
   }
   close(COUNTER);
   open(COUNTER,">$fields{'countfile'}");
   print COUNTER "$newnum";
   close (COUNTER);
   $fields{'counter'}=$newnum
 }
 
##################################################################
sub valid_address  
 {
  $testmail = $fields{'submit_by'};
  if ($testmail =~/ /)
   { return 0; }
  if ($testmail =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||
  $testmail !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/)
   { return 0; }
   else { return 1; }
}
 
##################################################################
sub bad_email
{
print <<__STOP_OF_BADMAIL__;
Content-type: text/html
 
<FONT SIZE="+1">
<B>
Вы ввели неверный e-mail адрес. Нажминте кнопку back вашго
броузера и отредактируйте адрес.
</B>
</FONT>
__STOP_OF_BADMAIL__
}
 
sub get_the_lock
{
  local ($endtime);                                    
  $endtime = 60;                                      
  $endtime = time + $endtime;                          
  while (-e $lockfile && time < $endtime)  
   {
    # Do Nothing                                    
   }                                                    
   open(LOCK_FILE, ">$lockfile");                      
}
 
sub drop_the_lock
{
  close($lockfile);
  unlink($lockfile);
}
 
 
##################################################################
sub valid_page
 {
  if (@okaydomains == 0)
     {return;}
  $DOMAIN_OK=0;
  $RF=$ENV{'HTTP_REFERER'};
  $RF=~tr/A-Z/a-z/;
  foreach $ts (@okaydomains) {
     if ($RF =~ /$ts/)
      { $DOMAIN_OK=1; }
  }
  if ( $DOMAIN_OK == 0) {
      print "Content-type: text/html\n\n Sorry....Cant run from here!";    
      exit;
  }
 }
 
 
###################################################################
#Sendmail.pm routine below by Milivoj Ivkovic (modified by bnb)
###################################################################
sub sendmail  {
 
# error codes below for those who bother to check result codes <gr>
 
# 1 success
# -1 $smtphost unknown
# -2 socket() failed
# -3 connect() failed
# -4 service not available
# -5 unspecified communication error
# -6 local user $to unknown on host $smtp
# -7 transmission of message failed
# -8 argument $to empty
#
#  Sample call:
#
# &sendmail($from, $reply, $to, $smtp, $subject, $message );
#
#  Note that there are several commands for cleaning up possible bad inputs - if you
#  are hard coding things from a library file, so of those are unnecesssary
#
 
    my ($fromaddr, $replyaddr, $to, $smtp, $subject, $message) = @_;
 
    $to =~ s/[ \t]+/, /g; # pack spaces and add comma
    $fromaddr =~ s/.*<([^\s]*?)>/$1/; # get from email address
    $replyaddr =~ s/.*<([^\s]*?)>/$1/; # get reply email address
    $replyaddr =~ s/^([^\s]+).*/$1/; # use first address
    $message =~ s/^\./\.\./gm; # handle . as first character
    $message =~ s/\r\n/\n/g; # handle line ending
    $message =~ s/\n/\r\n/g;
    $smtp =~ s/^\s+//g; # remove spaces around $smtp
    $smtp =~ s/\s+$//g;
 
    if (!$to)
    {
return(-8);
    }
 
 if ($SMTP_SERVER ne "")
  {
    my($proto) = (getprotobyname('tcp'))[2];
    my($port) = (getservbyname('smtp', 'tcp'))[2];
 
    my($smtpaddr) = ($smtp =~
    /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)
? pack('C4',$1,$2,$3,$4)
   : (gethostbyname($smtp))[4];
 
    if (!defined($smtpaddr))
    {
return(-1);
    }
 
    if (!socket(MAIL, AF_INET, SOCK_STREAM, $proto))
    {
return(-2);
    }
 
    if (!connect(MAIL, pack('Sna4x8', AF_INET, $port, $smtpaddr)))
    {
return(-3);
    }
 
    my($oldfh) = select(MAIL);
    $| = 1;
    select($oldfh);
 
    $_ = <MAIL>;
    if (/^[45]/)
    {
close(MAIL);
return(-4);
    }
 
    print MAIL "helo $SMTP_SERVER\r\n";
    $_ = <MAIL>;
    if (/^[45]/)
    {
close(MAIL);
return(-5);
    }
 
    print MAIL "mail from: <$fromaddr>\r\n";
    $_ = <MAIL>;
    if (/^[45]/)
    {
close(MAIL);
return(-5);
    }
 
    foreach (split(/, /, $to))
    {
print MAIL "rcpt to: <$_>\r\n";
$_ = <MAIL>;
if (/^[45]/)
{
   close(MAIL);
   return(-6);
}
    }
 
    print MAIL "data\r\n";
    $_ = <MAIL>;
    if (/^[45]/)
    {
close MAIL;
return(-5);
    }
 
   }
 
  if ($SEND_MAIL ne "")
   {
     open (MAIL,"| $SEND_MAIL");
   }
 
    print MAIL "To: $to\n";
    print MAIL "From: $fromaddr\n";
    print MAIL "Reply-to: $replyaddr\n" if $replyaddr;
    print MAIL "X-Mailer: Benedict`s Pages Mailer\n";
    print MAIL "Subject: $subject\n\n";
    print MAIL "$message";
    print MAIL "\n.\n";
 
 if ($SMTP_SERVER ne "")
  {
    $_ = <MAIL>;
    if (/^[45]/)
    {
close(MAIL);
return(-7);
    }
 
    print MAIL "quit\r\n";
    $_ = <MAIL>;
  }
 
    close(MAIL);
    return(1);
}
 
sub sys_date
{
 %mn = ('Jan','01', 'Feb','02', 'Mar','03', 'Apr','04',
        'May','05', 'Jun','06', 'Jul','07', 'Aug','08',
        'Sep','09', 'Oct','10', 'Nov','11', 'Dec','12' );
 $sydate=localtime(time);
 ($day, $month, $num, $time, $year) = split(/\s+/,$sydate);
    $zl=length($num);
    if ($zl == 1)
      { $num = "0$num";}
 $yyyymmdd="$year\-$mn{$month}\-$num";
 return $yyyymmdd;
}
 
 
sub sys_time
{
 $sydate=localtime(time);
 ($day, $month, $num, $time, $year) = split(/\s+/,$sydate);
 return $time;
}

Всего записей: 129 | Зарегистр. 08-12-2001 | Отправлено: 12:36 20-01-2003
VolxV

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Я так понимаю, это ПХП

Судя по типу комментариев и "use MIME::Lite" - самый натуральный перл.

Всего записей: 898 | Зарегистр. 01-06-2001 | Отправлено: 12:44 20-01-2003
russkiy



Запрет на пост
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Benedict
 
ой как наворочено!!

----------
Мне хочется, чтобы была и абсолютная правда, и окончательная справедливость, чтобы было добро и зло. Но есть только свет и тьма. И они существуют сами по себе.

Всего записей: 593 | Зарегистр. 17-07-2002 | Отправлено: 14:25 20-01-2003
Benedict



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
russkiy
И как с этой навороченостью быть?

Всего записей: 129 | Зарегистр. 08-12-2001 | Отправлено: 14:36 20-01-2003
russkiy



Запрет на пост
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Benedict
 
а тебе оно надо? просто тут отрабатывается все, и ошибочные адреса и черт в ступе... короче готовый движок

----------
Мне хочется, чтобы была и абсолютная правда, и окончательная справедливость, чтобы было добро и зло. Но есть только свет и тьма. И они существуют сами по себе.

Всего записей: 593 | Зарегистр. 17-07-2002 | Отправлено: 14:53 20-01-2003
Benedict



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Мне очень нужно, что бы обрабатывался аттач файла. ОЧ нужно отсылать файлы + данные из формы, с сайта на мыло.

Всего записей: 129 | Зарегистр. 08-12-2001 | Отправлено: 15:09 20-01-2003
BookMaster



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Мне очень нужно, что бы обрабатывался аттач файла. ОЧ нужно отсылать файлы + данные из формы, с сайта на мыло

 
Это оно как раз и есть. И код мой, все-таки на перле, а не на ПХП написан )))

Всего записей: 159 | Зарегистр. 13-10-2002 | Отправлено: 15:29 20-01-2003
Benedict



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
BookMaster
russkiy
Уважаемые монстры перлописания. Не будете ли вы столь любезны объяснить лаймерроватому юзеру куда именно в тело скрипта вставлять (подгонять, исправлять, переписывать, изменять) код, приведенный BookMaster-ом?
 
Былбы ОЧЕНЬ благодарен за вставляние такового в скрипт. :о(

Всего записей: 129 | Зарегистр. 08-12-2001 | Отправлено: 15:37 20-01-2003
BookMaster



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2Benedict

Код:
 
 
use MIME::Lite;  
use CGI qw (:standard);    
 
my $to = param ('from');   # мыльце (кому) из формы  
my $from = "vasya\@pupkin.ru";    
my $file = param ('file');   # файлик из формы  
my $lettertext = param ('lettertext');   # еще - что-то из формы  
 
# здесь можно проверить размер файла, его сигнатуру и все такео..
...
#  
 
   open OUT, (">tmp.file");
   binmode(OUT);
        while(<$file>)
        {print OUT $_;}  
   close(OUT);  
 
 
   
   my $msg = MIME::Lite->new  
   (  
 
   From => $from,  
   To => $to,  
   Subject =>'''тот файлик прислан вам дядей васей из веб-формы',  
   Type =>'multipart/related' ,  
    );  
   
   $msg->attach(Type => 'text/html',  
   Data => $lettertext); # тело письма  
   
    $msg->attach(Type => 'multipart/mixed',  
 
# не уверен, кстати, что 'multipart/mixed', поправьте, если ошибаюсь
 
 
   Id => 'tmp.file',  
   Path => 'tmp.file',  
   ); # приаттаченый файлик  
       
  $msg->send();  
 
   unlink "tmp.file";
 
 

 
что-то в таком роде, с точностью до смысла...

Всего записей: 159 | Зарегистр. 13-10-2002 | Отправлено: 16:37 20-01-2003 | Исправлено: BookMaster, 16:39 20-01-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Почтовые формы (поддержка Attach files) на perl


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru