Poczta

Perl FAQ | RecentChanges | Preferences

1. Jak wysyłać maila?
2. Jak użyć komendy (send)mail do listu?
3. A jak obsłużyć wysyłanie przez SMTP?
4. Co z polskimi literami w poczcie?
5. Jak wysłać plik (binarny) jako załącznik?
6. Jak odczytać pocztę z załącznikami?
7. Jak sprawdzić poprawność adresu e-mail?
8. Jak znaleźć adresy w pliku?
9. Jak odebrać pocztę?

1. Jak wysyłać maila?

Wysłać maila można za pomocą komendy (send)mail [może być dłużej dostarczana, nie trzeba łącza do sieci w danym momencie] lub za pomocą protokłu SMTP [trzeba sprawdzać stan łącza oraz status wykonań, nie trzeba zewnętrznych programów, chociaż można łączyć się z localhost, o ile działa serwer poczty].

Należy przy tym pamiętać, że znak @ odnosi się do wektorów. Adresy należy pisać w formie "osoba\@firma.com" lub 'osoba@firma.com'.

Dla Windows jest Blat for Windows NT(2000) (na 9x też powinien działać, lecz autorzy tego nie gwarantują). http://blat.freeshell.org/

Jest także Sendmail dla Windows http://www.indigostar.com/sendmail.htm

Blat jest freeware. Na 30-dni jest sendmail z Indigo.

smtpsend:

Można próbować modułu Win32::OLE i wysyłać z MS Outlooka, czy innego klienta windowsowego.

2. Jak użyć komendy (send)mail do listu?

Użycie komendy mail (lub mailx) jest prostsze, lecz daje mniejsze możliwości zmian, a także zależne jest od komputera (zaleca się przeczytać mana):

 open(MAIL,"|mail $dokogo");	#uruchomienie programu i potoku do pisania

alternatywnie powyższą linię można zastąpić jedną z dwóch poniższych (uwaga na ścieżkę do programu sendmail):

 open (MAIL, "|/usr/lib/sendmail -f $odkogo -oi -t -- $dokogo") 
   || die "sendmail: $!";
 open (MAIL, "|/usr/lib/sendmail -t -oi") || die "sendmail: $!";

W przypadku stosowania formularza należy stosować tę ostatnią, gdyż do zmiennej $dokogo można dopisać parę innych poleceń, które niekoniecznie chcemy wykonywać. Nadawcę i odbiorcę sendmail ustawia wtedy na podstawie następnych linii, które są:

 print MAIL <<"END" ;
 From: $odkogo
 To: $dokogo
 Subject: $temat

 END
 print MAIL "$tresc\n\n";
 close (MAIL) or warn $! ? "Blad: $!" : "Blad ze statusem $?";

Moduł Mail::Sendmail jest polecany jako zamiennik komendy sendmail.

3. A jak obsłużyć wysyłanie przez SMTP?

Można też skorzystać z modułu Net::SMTP:

 use Net::SMTP;
 $smtp = Net::SMTP->new('mailhost');

 $smtp->mail($ENV{USER});
 $smtp->to('postmaster');

 $smtp->data();
 $smtp->datasend("To: postmaster\n");
 $smtp->datasend("\n");
 $smtp->datasend("A simple test message\n");
 $smtp->dataend();

 $smtp->quit;

Inny moduł do wysyłania to Mail::Sender (patrz niżej).

4. Co z polskimi literami w poczcie?

Do polskich liter w nagłówkach przyda się moduł MIME::Words (patrz rozdział o polkich znakach), a gdy litery są w treści, do nagłówków treba dodać linie:

 Mime-Version: 1.0
 Content-type: text/plain; charset=ISO-8859-2
 Content-transfer-encoding: 8bit

i oczywiście literki kodowane w ISO.

5. Jak wysłać plik (binarny) jako załącznik?

W przypadku wysyłania plików binarnych (np. gif) można się posłużyć modułem MIME z pakietu MIME-tools:

 use MIME::Entity;

 # Przygotowanie:
 $top = build MIME::Entity Type    =>"multipart/mixed",
                           From    => "me\@myhost.com",
                           To      => "you\@yourhost.com",
                           Subject => "Hello, nurse!";

 # Czesc #1: dokument tekstowy: 
 attach $top  Path=>"./testin/short.txt";

 # Czesc #2: plik GIF:
 attach $top  Path        => "./docs/mime-sm.gif",
              Type        => "image/gif",
              Encoding    => "base64";

 # Wysłanie przez sendmail:
 open MAIL, "| /usr/lib/sendmail -t -i" or die "open: $!";
 $top->print(\*MAIL);
 close MAIL or die "sendmail close:$!\n";;

Zamiast MIME::Entity niektórzy używają MIME::Lite. Alternatywą dla MIME-tools jest korzystające z SMTP:

 use Mail::Sender;
 $sender = new Mail::Sender {smtp => 'mail.yourdomain.com', 
                             from => 'your@address.com',
                             charset=>'ISO-8859-2'};
 $sender->MailFile({to => 'some@address.com',
                    subject => 'Here is the file',
                    msg => "I'm sending you the list you wanted.",
                    file => 'filename.txt'});

lub

 $sender->MailMsg({ to => "$USER", subject => "$EMAIL_TITLE",
                    msg => "$MESTEXT \n"});

bardziej ambitni mogą chcieć kodować nagłówki i treść samodzielnie, co nie jest polecane:

 "Content-Type: Multipart/Mixed;\n";
 "\tboundary=\"Boundary-=_yGgxxpkLoRellNMPapqfWkHOPkMC\"\n";
 "MIME-Version: 1.0\n";

 "\n\n--Boundary-=_yGgxxpkLoRellNMPapqfWkHOPkMC\n";
 "Content-Type: application/x-msdownload;\n";
 "\tname=\"$Plik\" \n";
 "Content-Transfer-Encoding: base64\n";
 "Content-Disposition: attachment; filename=\"$Plik\" \n";
 "\n\n"; 

 use MIME::Base64 qw(encode_base64);
 while (read($File_Handle,$Bufor,60*57)) {
   encode_base64($Bufor);
 }#while

6. Jak odczytać pocztę z załącznikami?

Należy użyć pakietu MIME::Tools, a w szczególności MIME::Parser;

 use MIME::Parser;
 my $parser = new MIME::Parser;
 $parser->decode_headers(1);		# naglowki zgodnie z RFC-1522
 $parser->output_dir("/tmp");		# plik tymczasowe do /tmp
 $ent = $parser->parse(\*STDIN);	# parsuj pocztę
 $temat=$ent->head->get('subject');	# ustal temat
 $type=$ent->mime_type;                 # ustal typ 
 if($type =~ m|multipart/|i) {		# jesli wieloczesciowa
   $num_parts  = $ent->parts;		# liczba czesci
   for($i=0;$i<$num_parts;$i++) {	# znajdz ktora jest tekstowa
     if(($part = $ent->parts($i))->mime_type =~ m|text/|i) {
       $part->print_body;		# wyswietl tekst
       last;
     }
   }
 } else { $ent->print_body(); }		# wyswietl zwykla poczte
 $parser->filer->purge;			# usun pliki tymczasowe

7. Jak sprawdzić poprawność adresu e-mail?

Metody dającej 100% pewności, poza wysłaniem, nie ma. Można próbować łączyć się na port 25 serwera i korzystać z komendy VRFY.

Moduł Email::Valid sprawdza zgodność formatu z RFC 822 (zawiera wyrażenie regularne z około 6000 znakami), oraz opcjonalnie czy jest wpis MX w DNSie, dla danego adresu.

8. Jak znaleźć adresy w pliku?

Adresy czytane są z otwartego pliku z deskryptora PLIK i umieszczane w tablicy @adresy funkcją push.

 while (<PLIK>) { push @adresy,(m|([\w\d\.]{1,}\@[\w\d\.]{1,})|ig); }

9. Jak odebrać pocztę?

Najłatwiej przy pomocy protokołu POP3. Należy jednak liczyć się z z możliwością przechwycenia hasła.

 use Net::POP3;
 $pop = Net::POP3->new('pop3.host');
 $result = $pop->login ( $USER , $PASS );
 if ($result eq undef) { print "Nie zalogowalem\n"; }
 else { print "liczba postow w skrzynce: $result\n"; }
 $pop->quit();

Alternatywa to moduł Mail::POP3Client (z lub bez ssl).

 $pop = new Mail::POP3Client(USER=>"user", PASSWORD=>"hasło",
                             #USESSL   => true, PORT     => 995
                             HOST=>"poczta.onet.pl");
 $liczba_listow = $pop->Count();

Perl FAQ | RecentChanges | Preferences
This page is read-only | View other revisions (diff)
Search:
Strona znajduje się na serwerze KT AGH.