PerlCookbook2介绍

作者:凯旋网络来源:凯旋网络
ngDBI”CPAN上DBD::SQLite模块的正式文档。它在SQLite的主页上http://www.hwaci.com/sw/sqlite

 

摘要:发送邮件的时候添加附件

问题:你想要发一封包含附件的邮件,比如包含一份PDF格式的文档

解决:用CPAN上的MIME::Lite模块。

首先,创建包含邮件各种头信息的MIME::Lite对象:
useMIME::Lite;$msg=MIME::Lite->new(From=>''sender@example.com'',To=>''recipient@example.com'',Subject=>''Myphotoforthebrochure'',Type=>''multipart/mixed'');
然后用attach方法添加附件内容:
$msg->attach(Type=>''image/jpeg'',Path=>''/Users/gnat/Photoshopped/nat.jpg'',Filename=>''gnat-face.jpg'');

$msg->attach(Type=>''TEXT'',

Data=>''Ihopeyoucanusethis!'');
 
最后,发送这份邮件,发送它的方法是可选的:
$msg->send();#默认的方法是用sendmail规则发送#指定其它的方法$msg->send(''smtp'',''mailserver.example.com'');

 

讨论:

MIME::Lite模块创建并发送带MIME指定类型附件的邮件。MIME是MultimediaInternetMailExtensions的缩写,而且也是在邮件中附带各种文件文档的标准方式。但是,这个规则并不能从邮件信息中把附件提取出来。如果你想从邮件信息中提取MIME指定类型附件,可以参考这篇文章“ExtractingAttachmentsfromMail”

当你创建MIME::Lite对象,以及向创建的对象中添加内容的时候。后面的参数采用“参数名=>值”的有名对形式。有名对的参数名部分应该暗示它代表的邮件头(如,From,To,Subject)以及其它其它MIME::Lite所特有的东西。如果参数名是邮件头,后面应该加上冒号,如:
$msg=MIME::Lite->new(''X-Song-Playing:''=>''NatchezTrace'');

然而,当参数名代表的邮件头在表18-2中时,后面可以不加冒号。下表中*代表通配符,例如Content-*可以代表Content-Type和Content-ID但是不代表Dis-Content

表18-2:MIME::Lite头

ApprovedEncryptedReceivedSenderBccFromReferencesSubjectCcKeywordsReply-ToToCommentsMessage-IDResent-X-Content-*MIME-VersionReturn-PathDateOrganization

MIME::Lite参数类型的完整列表在表18-3中

表18-3:MIME::Lite参数类型

DataFHReadNowDatestampFilenameTopDispositionIdTypeEncodingLengthFilenamePath

MIME::Lite模块的参数类型决定附件的类型和附件的添加方法:

Path指定作为附件的文件的路径Filename指定接受方保存附件时,附件的默认文件名。如果指定了Path参数,那么默认的文件名就是路径中的名字Data指定附件添加的日期Type指定待添加附件的文件编码类型Disposition它的值只能是inline和attachment。前者指定接受方打开邮件的时候附件内容会跟在邮件正文后显示,而不单独作为一个附加物。后者指定接受方应该指定一个附件的解码方法,并且保存附件,此时会有提示FH指定一个读取附件的开放的文件句柄

这儿有几个有用的附件编码类型:TEXT代表text/plain,为Type的默认值;BINARY是application/octet-stream的缩写;multipart/mixed表明邮件有附件;application/msword表明附件为微软的Word文档;application/vnd.ms-excel表明附件为微软的Excel文档;application/pdf表明附件为PDF文档;image/gif,image/jpeg,image/png分别指定GIF,JPEG,PNG文件;audio/mpeg指定MP3格式文件;video/mpeg指定MPEG格式影片;video/quicktime指定Quicktime格式文件。

发送邮件的唯一两种方法是sendmail和Net::SMTP。调用send方法时,若第一个参数为“smtp”,则用Net::SMTP发送邮件。send的其它参数都传给Net::SMTP。
#timeoutof30seconds$msg->send("smtp","mail.example.com",Timeout=>30);
如果你想创建多个MIME::Lite对象,也就是发送多附件,你可
  • 广告推荐