使用perl模块MIME::Lite发送带附件的邮件

发布时间:2020-02-19编辑:脚本学堂
perl模块 MIME::Lite 发送带附件邮件

使用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