[转帖]如何用Net::SMTP发送邮件

| 2 Comments | 0 TrackBacks | WebBlog Articles

声明: 本文转载自非四(FayLand)的Perl Site -_-bbb

如下代码为用163.com的SMTP来发送邮件。


#!/usr/bin/perl
use Net::SMTP;

my $mailhost = "smtp.163.com"; # the smtp host
my $mailfrom = 'notfour@163.com'; # your email address
my @mailto = ('fayland@gmail.com', 'not_four@hotmail.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的时候,就会输出类似于此连接过程的东西。

引用通告|TrackBacks (0)

本日志的TrackBack URL: http://easun.org/cgi-bin/mtos/tb_mt_41.pl/14.

本文相关评论|Comments (2)

很好
那怎样实现发送带附件的邮件呢?
望指教
谢谢

http://search.cpan.org/~gbarr/libnet-1.19/Net/SMTP.pm

Net::SMTP - Simple Mail Transfer Protocol Client

既然是个 Simple Mail Transfer Protocol Client 故。。似乎不能发附件。 要发附件的话用其他复杂一点的 模块 吧。

发表该文评论|Leave a comment

最近发表|Recent Entries

[八卦]话说修路这件事

建国路貌似又在修。根本没有办法步行。这个让我想起来一个笑话:话说某A国人来北京,在东城区丢了一枚戒指,于是乎找警察,警察告诉他尽可能的帮他找。过了几天,此人发现整个东城的马路都挖开了,于是感叹曰:北京的警察真好。看来这个笑话的地点可以换在朝阳了?是不是某人的戒指又丢了?PS: 城市规划城市规划,年年挖年年修。。。生命不休,挖路不止…

[SiteLog]Blog升级到了 Movable Type Pro 4.25

Thisi is a SiteLog of Easun's WebBlog.今天终于升级到了 Movable Type Pro 4.25 ,貌似一切顺利,也没有发现什么特别大的改动?只是 Community Pack 变成了 1.62, Professional Pack 升级成了1.3 。其他的一切顺利,模版也没有修改,我甚至连重建前台HTML的事情都没有做。。。就这样吧,继续用这个风格,等有时间了再慢慢研究吧。如果非要说有什么修改的话,就是评论的登陆方式又丰富了很多,包括…

IE脚本错误,可以尝试以下办法

IE 脚本错误是个很麻烦的问题,一般定位都是 JS 引擎 和 VB 引擎出错。但是有时间反复注册 jscript.dll 和 vbscript.dll 也不能解决问题。具体表现 部分 js 解析正常,而部分就不行,尤其是基于 Web2.0的网站。不说别的,就连 ie7/ie8 本身第一次运行向导的"保存设置"也出错。其实研究下,貌似都出现在 XML 解释上? 重新注册…