本文简单的介绍一下使用Perl发送邮件的方法,我们以使用163的SMTP服务器来发送邮件为例,因为需要用户验证,所以前提是我们有163的邮件账户。如果代码中使用到的Perl模块你没有安装,那么执行的时候就会报错,关于Perl模块的安装方法,Perl模块安装。
#!/usr/bin/perl -w use strict; use Net::SMTP_auth; #smtp邮件服务器和端口 my $smtpHost = 'smtp.163.com'; my $smtpPort = '25'; my $sslPort = '465'; #smtp服务器认证用户名密码(就是你登陆邮箱的时候的用户名和密码) my $username = 'user@163.com'; my $passowrd = 'password'; #邮件来自哪儿,要去哪儿,邮件标题 my $from = 'user@163.com'; my $to = 'to@somedomain.com'; my $subject = '[Notice]测试邮件'; #设置邮件header my $header = << "MAILHEADER"; From:$from To:$to Subject:$subject Mime-Version:1.0 Content-Type:text/plain;charset="UTF-8" Content-Trensfer-Encoding:7bit MAILHEADER #设置邮件内容 my $message = << "MAILBODY"; 在这里写邮件的内容。 你好,这是来自$from的测试邮件。 MAILBODY #获得邮件域名部分,用于连接的时候表名身份 my @helo = split /@/,$from; #连接smtp服务器,明文/SSL/TLS三种方式,根据你使用的SMTP支持情况选择一种 #后2种暂时被我注释了,两个=cut之间的就是被注释的 #普通方式,通信过程不加密 my $smtp = Net::SMTP_auth->new( "$smtpHost:$smtpPort", Hello => $helo[1], Timeout => 30 ) or die("Error:连接到$smtpHost失败!"); $smtp->auth('LOGIN',$username,$passowrd) or die("Error:认证失败!"); =cut #tls加密方式,通信过程加密,邮件数据安全,使用正常的smtp端口 use Net::SMTP::TLS; my $smtp = Net::SMTP::TLS->new( "$smtpHost:$smtpPort", User => $username, Password => $passowrd, Hello => $helo[1], Timeout => 30 ) or die "Error:通过TLS连接到$smtpHost失败!"; #纯粹的ssl加密方式,通信过程加密,邮件数据安全 use Net::SMTP::SSL; my $smtp = Net::SMTP::SSL->new( "$smtpHost:$sslPort", Hello => $helo[1], Timeout => 30 ) or die "Error:通过SSL连接到$smtpHost失败!"; $smtp->auth($username,$passowrd) or die("Error:认证失败!"); =cut #发送邮件 $smtp->mail($from); $smtp->to($to); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit(); print "OK"; exit 0;
后话,如果你有不需要验证的SMTP服务器的话,那么上面的代码中关于验证(auth和用户名密码)的部分就不需要了。更详细的用法还是要用perldoc命令或者去官方查看相关模块的帮助文档。
另外,可能有的时候,根据你环境的编码格式,可能导致发邮件有乱码现象,这需要使用Encode来转换你的邮件标题和内容的编码格式,并在header里设置正确的charset。
比如把shiftjis编码格式的邮件标题和内容变成iso-20220-jp编码格式,当然这些转换得根据你实际情况来:
use Encode qw(from_to encode); from_to($subject,'shiftjis','iso-2022-jp'); encode('MIME-Header-ISO_2022_JP',$subject); from_to($message,'shiftjis','iso-2022-jp');