天天看點

Perl 學習筆記(4)

使用CGI程式發送電子郵件

在本章将要學習:(1) 如何運作internet電子郵件特性 (2) 如何在UNIX和非UNIX系統下發送郵件 (3) 如何建立發送郵件的Web窗體

一、Intenet郵件入門

目前最常用的是使用簡單郵件傳輸協定(SMTP)将郵件發送出去和連接配接的目标端通常使用郵局協定(POP)或Internet郵件通路協定(IMAP)。

若要發送電子郵件,需要兩樣東西,即郵件傳輸代理或SMTP中繼主機。

郵件傳輸代理(MTA) 負責接收電子郵件并正确地将他們轉發。UNIX系統上常用MTA成為sendmail。

$/bin/echo "Subject:Test\n\nHello,world" | sendmail  [email protected]

如果使用windows作業系統,那麼将不具備内置的MTA。不過perl子產品使你能夠直接發送郵件。Net::SMTP子產品可以再沒有介入的MTA的情況下發送郵件,但是你必須知道你的SMTP中繼主機的名字。

正确的SMTP中繼主機名取決于從何處發送你的郵件。如果你從家中發送郵件,那麼你的ISP為你賦予一個SMTP中繼主機名。如果是Web伺服器,那麼就需要該伺服器的中繼主機名。

============================================

二、郵件發送函數

sub send_mail {

      my($to, $from, $subject, @body)=@_;

      my $sendmail="/usr/bin/sendmail -t -oi -odp";

      open(MAIL, "|$sendmail") || die "Can't start sendmail: $!";

      print MAIL <<END;

From: $from

To: $to

Subject: $subject

END

      foreach (@body) {

              print MAIL, "$_\n";

       }

        close(MAIL);

}

若要使用該函數,隻要這樣用:

@body=("Lower mine,please.", "Thank you");

send_mail('[email protected]' , '[email protected]', 'Taxes', @body);

=====================================================

三、用于非UNIX系統的郵件函數

 my($to,$from,$subject,@body)=@_;

 use Net::SMTP;

 my $relay="relayhost.youisp.com";

 my $smtp=Net::SMTP->new($relay);

 die "Could not open connection: $!" if (defined $smtp);

 $smtp->mail($from);

 $smtp->to($to);

 $smtp->data();

 $smtp->datasend("To: $to\n");

 $smtp->datasend("From: $from\n");

 $smtp->datasend("Subject: $subject\n");

 $smtp->datasend("\n");

 foreach  (@body) {

  $smtp->datasend("$_\n");

 }

 $smtp->dataend();

 $smtp->quit;

若要使用該函數

@body=("lower mine,please.","thanks!");

send_mail('[email protected]', '[email protected]','Taxes',@body);

$smtp=Net::SMTP->new($relay)   這行代碼 用于建立一個稱為"對象"的東西。"對象"實際上并不是一個标量,也不是哈希結構或者數組。$smtp中的值現在代表一個到達郵件程式的連接配接,你可以對這個連接配接進行各種操作。

$smtp->mail(addr)    mail函數發送郵件使用的什麼身份

$smtp->to(addr)   to 函數用于郵件發送給誰

$smtp->data()       data函數指明你準備發送郵件的正文

$smtp->datasend(data)  這個函數用于發送郵件的實際文本。你必須輸出你自己的報頭域(TO:   From:  等)。 在報頭與正文之間,還必須輸入一個空行 $smtp->datasend("\n"),  你的郵件正文跟随在這個空行的後面,并且也用$smtp->datasend()來發送。