如下代码为用ESMTP来发送邮件。
#!/usr/bin/perl
use Net::SMTP;
my $mailhost = "smtp.domain.com"; # the smtp host
my $mailfrom = 'user@domain.com'; # your email address
my @mailto = ('user@domain.com', 'user@domain.com'); # the recipient list
my $subject = "此为标题";
my $text = "此为正文\n第二行位于此。";
$smtp = Net::SMTP->new($mailhost, Hello => 'localhost', Timeout => 120, Debug => 1);
# anth login, type your user name and password here
$smtp->auth('user','pass');
foreach my $mailto (@mailto) {
	# Send the From and Recipient for the mail servers that require it
	$smtp->mail($mailfrom);
	$smtp->to($mailto);
	# Start the mail
	$smtp->data();
	# Send the header
	$smtp->datasend("To: $mailto\n");
	$smtp->datasend("From: $mailfrom\n");
	$smtp->datasend("Subject: $subject\n");
	$smtp->datasend("\n");
	# Send the message
	$smtp->datasend("$text\n\n");
	# Send the termination string
	$smtp->dataend();
}
$smtp->quit;

TroubleShooting/Code Analysis

  • 为什么要 $stmp->auth('user','pass');
    大部分SMTP服务器为了防止 spam /垃圾邮件,就需要用户验证身份。
    此方法需要另外安装模块:Authen::SASL, 此模块可能系统不自带。
    如果系统为虚拟主机,而此模块无法安装,可使用Socket模块进行最直接的操作。详细的代码可以参考脚本LeoBBS或书籍《Perl网络编程》。
  • Debug => 1
    此段代码用于测试之用,所以开启了Debug,一般测试一次完毕,正式使用的话会关闭它。
  • 需要注意的是发信人和收信人的地址要用单引号,或者用"fayland\@gmail.com"。如果是个变量,需要用正则先将其转换。
    $mailto =~ s/\@/\\\@/;
  • 我想发送附件,该如何做?
    参考《Perl网络编程》。

邮件发送过程的简单介绍

SMTP协议由文档rfc821定义。
在rfc821协议中定义了两个角色,即发送者(用S表示,指发送邮件的程序)和接收者(用R表示,指SMTP服务器)。
  1. 在 S 和 R 通过套接连接后,S应当先向R表明身份,此过程用helo命令完成,helo后连接发送者的域名(可用localhost)。而R的回答是一个表示连接成功的状态码和服务器身份等。例如:
    S: helo 1313s.com
    R: 220 server.com Simple Mail Transfer Service Ready
    在rfc821定义的状态码中,通常以2或3开头的表示成功,以4或5开头的表示传输过程出现了问题。
    如果是需要服务器身份验证的话,还用发送AUTH LOGIN。
  2. 发送头文件。
    S: MAIL FROM: 
    R: 250 OK
    S: RCPT TO: 
    R: 
    这里的recipient的地址如果是在SMTP同一服务器上且服务器找不到此地址,就会回答"550 No such user here"。
  3. 发送正文。以DATA开始。以两个换行结束。
    S: DATA
    R: 354 Start mail input; end with (两个换行)
    S: To: recipient@whereau.com
    S: From: someone@somewhere.com
    S: subject: title
    S: ...
    S: text
    S: etc.
    S:
    S:
    R: 250 OK
  4. 退出连接。
    S: QUIT
    R: 221 server.com Service closing transmission channel

以上就是简易的连接过程。当开启Net::SMTP的debug的时候,就会输出类似于此连接过程的东西。
  1. #!/usr/bin/perl -w  
  2. use Net::SMTP_auth;  
  3. $smtp = Net::SMTP_auth->new('smtp.517sou.net',  
  4. Hello => '517sou.net',  
  5. Debug => 1);  
  6. $smtp->auth('LOGIN', 'user@517sou.net','password');  
  7. $smtp->mail('user@517sou.net');  
  8. $smtp->to('user@517sou.net');  
  9. $smtp->data();  
  10. $smtp->datasend("From:user\@517sou.net \n");  
  11. $smtp->datasend("To: user\@517sou.net \n");  
  12. $smtp->datasend("Subject: Server Status Monitor Mail \n");  
  13. $smtp->datasend("\n");  
  14. $smtp->datasend("这是一封测试邮件 \n");  
  15. $smtp->dataend();  
  16. $smtp->quit; 

注:CPAN安装Net::SMTP_auth

  1. use Net::SMTP;   
  2. use Net::SMTP_auth;   
  3. use MIME::Base64;   
  4. $mail_server = 'smtp.163.com';   
  5. $mail_from = 'me@163.com';   
  6. $mail_to = 'me@163.com';   
  7. $uname='me';   
  8. $passwd='mypasswd';   
  9.  
  10. #开启Debug模式   
  11. $smtp = Net::SMTP->new("$mail_server" , Debug => 1);   
  12. #普通发送模式   
  13. #$smtp = Net::SMTP->new("$mail_server" );   
  14. $smtp->auth("$uname""$passwd");   
  15. $smtp->mail("$mail_from");   
  16. $smtp->to("$mail_to");   
  17. $smtp->data();   
  18. $smtp->datasend("To: $mail_from\n");  
  19. $smtp->datasend("Cc: 'me@163.com', 'me2@gmail.com'\n"); # 可抄送给多个人  
  20. $smtp->datasend("From: $mail_from\n");   
  21. $smtp->datasend("Reply-To: $mail_from\n");   
  22. $smtp->datasend("Return-Path: $mail_from\n");   
  23. $smtp->datasend("Subject: 1 Subject\n");   
  24. #$smtp->datasend("Content-Type: text/plain; ChartSet=gb2312");  
  25. $smtp->datasend("\n"); # 解决了正文没有显示的问题  
  26.  
  27. # Send your email content  
  28. $smtp->datasend("I am a cat!\n");   
  29. $smtp->datasend("\n");   
  30. $smtp->dataend();  
  31. $smtp->quit; 
此文章由 flyinweb 于 2010-07-08 09:53:34 编辑

本日志由 flyinweb 于 2010-06-10 14:33:46 发表,目前已经被浏览 4266 次,评论 0 次;

作者添加了以下标签: Net::SMTPAuthen::SASL

引用通告:http://www.517sou.net/Article/460/Trackback.ashx

评论订阅:http://www.517sou.net/Article/460/Feeds.ashx

评论列表

    暂时没有评论
(必填)
(必填,不会被公开)