使用perl模块MIME::Lite发送带附件的邮件
#!/usr/bin/perl
use strict;
use warnings;
use Net::SMTP;
use Authen::SASL;
use MIME::Lite;
my $host="smtp.163.com";
my $from="test@163.com";
my @to=('test1@163.com','test2@163.com');
my $subject="welcom to homepage";
my $text = "do it now";
my $attach = "/home/jbxue/images/123.jpg";
my $user='test@163.com';
my $pwd="12345670";
my $smtp=Net::SMTP->new($host,Hello=>'localhost',Timeout=>120,Debug=>1);
$smtp->auth($user,$pwd);
my $msg;
my $str;
foreach my $t_mail(@to){
$msg=MIME::Lite->new(
From=>$from,
To=>$t_mail,
Cc=>'test@163.com',
Subject=>$subject,
Data=>$text
);
$msg->attach(
Type=>'auto',
Path=>$attach,
Filename=>'123.jpg',
Disposition=>'attachment'
);
$str=$msg->as_string() or die "$!";
$smtp->mail($from);
$smtp->to($t_mail);
$smtp->data();
$smtp->datasend("$str");
$smtp->dataend();
}
$smtp->quit();
说明如下:
1、 发现发过去的邮件没有主题也不能显示内容
解决办法:在各项后面加结束字符n如From:To:等等
2 、解决中文乱码问题
解决办法:用html格式输入时,增加Content-Type:text/plain;CharSet=utf-8
3 、普通邮件需验证的,需要安装Net::SMTP Net::SMTP_auth
4、 当要带附件时,发现大家建议使用MIME::Lite或Mail::Sender,于是改用MIME::Lite和Mail::Sender
安装模块MIME::Lite时,有对其它模块的依赖关系,所以之前又安装了其它模块Mail::Address,MIME::Types,File::Basename, MIME::Base64,MIME::QuotedPrint,Email::Date::Format,MIME::Types,Mail::Address,Date::Format,Date::Parse,Test::Pod
在使用过程中,发现不太好用,而且可查的资料也少。
最后决定使用Mail::Sender,可以使用认证,还可以带附件,而且调试与出错信息也更确切一些
5、常用附件编码类型
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 格式文件。
附:另一种发送办法
perl模块之MIME::Lite发送有附件的邮件
#!/usr/bin/perl
use strict;
use warnings;
use MIME::Lite; #这个用来组织邮件信息内容
use Pod::Usage;
use Getopt::Long;
use MIME::Base64;
use MIME::Words qw/:all/;
use Authen::SASL;
my $options = {
from => 'bot',
};
GetOptions( $options,
'help|?', # 帮助
'html!', # HTML 邮件支持
'subject=s', # 邮件标题
'from=s', # 发件人
'to=s', # 收件人
'cc=s', # 抄送
'attach|a=s@', # 附件
) or pod2usage();
pod2usage() if $options->{help};
pod2usage() unless $options->{subject} and $options->{to};
my $cc = $options->{cc} || '';
my $lines = <>;
#$lines=encode_base64("$lines",'');
# 邮件服务器的连接信息
MIME::Lite->send("smtp", "smtp.163.com",AuthUser=>‘myusername',AuthPass=>'******',Debug => 0, Timeout => 60);
# 组织邮件信息内容
my $msg = MIME::Lite->new(
From => $options->{from},
To => $options->{to},
cc => $cc,
Subject => encode_mimeword($options->{subject},'b','utf-8'),
#Subject => $options->{subject},
#Subject => '=?utf-8?B?'.encode_base64("$options->{subject}").'?=',
Type => 'multipart/mixed'
);
if (not $options->{html} ){
$msg->attach(
Encoding =>'base64',
Type =>'text/plain;charset=utf-8',
Data => $lines
);
}else{
$msg->attach(
Encoding =>'Base64',
Type =>'text/html; charset=utf-8',
Data => $lines
);
}
### attach: $options->{attach}
for ( 0 .. $#{$options->{attach}} ) {
$msg->attach(
Type =>'auto', #建议设置成auto要不就application/octet-stream
Path => $options->{attach}[$_],
Encoding => 'Base64',
Disposition => 'attachment'
);
}
print STDERR "正在发送.......n";
$msg->send() or die "Couldn't send whole message: $!n";
__END__
=head1 NAME
sendmail - 发送邮件
=head1 SYNOPSIS
sendMail [选项] [正文文件名]
正文文件名省略时,邮件正文来自标准输入
选项:
--help 显示帮助信息
--subject 邮件标题
--from 发件人
--to 收件人
--cc 抄送
--html 发送 HTML 格式邮件
--attach 发送附件
调用方法:
echo "aaaaa你好---"|perl demo.pl --subject hello --from --to --attach /home/a.zip