跳转至

使用 Perl 发送电子邮件

原文:https://www.geeksforgeeks.org/sending-an-email-using-perl/

Perl 允许其用户使用 Perl 代码脚本发送邮件。使用 Perl 发送电子邮件有多种方式。这些电子邮件可以是简单的电子邮件、带有附件的电子邮件、HTML 格式的电子邮件、具有多个接收者的电子邮件等..Perl 也提供了一些模块来做同样的事情。在本文中,我们将介绍一些使用 Perl 脚本发送电子邮件的方法。

发送邮件实用程序

首先,我们将讨论 Sendmail 实用程序。你不能指望用它就能获得很高的交货率。有时电子邮件会跳过收件箱。对于 Linux/Unix,Sendmail 设置起来既快捷又简单。对于 Windows 和其他设备,您需要考虑替代方法。

发送简单邮件
#!/usr/bin/perl

# Details for email
$to = 'user1@mail.abc';
$from = 'user2@mail.abc';
$subject = 'Sending mail using perl';
$message = 'Well that was easy!!';

open(MAIL, "|/usr/sbin/sendmail -t");

# Email Header
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n\n";

# Email Body
print MAIL $message;

$result = close(MAIL);
if($result) 
{ 
    print "Email Sent, Bro!\n";
} 
else
{ 
    print "There was a problem, Bro!\n";
}

只需添加您和发件人的电子邮件 id,邮件将成功发送,您将看到快速结果。如果没有,请确保 sendmail 在您的计算机上配置正确,并且收件人的电子邮件服务不会阻止来自您的 IP 地址的电子邮件。

HTML 格式的电子邮件

如果用户想向接收者发送 html 格式的文本怎么办?在这种情况下,只需在 perl 脚本中添加以下代码作为$message 变量:

$message = '<h1>H1 is the main heading</h1><p><img src="image_source_with_extension" /></p>';

上面的代码将按照 html 语法格式化您的邮件。您可以以所需的方式使用 html 的所有标签。

添加抄送和密件抄送字段

您也可以在邮件标题中添加抄送和密件抄送字段。在您的 Perl 脚本中添加以下变量:

$cc = 'user1@mail.abc, user2@mail.abc, user3@mail.abc';
$bcc = 'user4@mail.abc';

添加附件

给邮件添加附件是可能的,但它有点复杂。使用这个模块并添加大文件可能是一个糟糕的主意,但是您可以使用小文件。

注意:在运行下面的代码之前,请确保已经安装了 Mail::Sendmail 模块。

use MIME::QuotedPrint;
use MIME::Base64;
use Mail::Sendmail;
%mail = ( from => 'user1@mail.abc',
          to => 'user2@mail.abc', 
          subject => 'Sending mail using perl');

$boundary = "====" . time() . "====";
$mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";

$message = encode_qp( "Well that was easy!!" );

# This is the perl executable
$file = $^X; 

open (F, $file) or die "Cannot read $file: $!";
binmode F; undef $/;
$mail{body} = encode_base64(<F>);
close F;

$boundary = '--'.$boundary;
$mail{body} = <<END_OF_BODY;
$boundary
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

$message
$boundary
Content-Type: application/octet-stream; name="$^X"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="File_Name.pdf"

$mail{body}
$boundary--
END_OF_BODY

sendmail(%mail) || print "Error: $Mail::Sendmail::error\n";

注意:别忘了配置$message 变量的 %mail 部分和文件名部分。

MIME::Lite

该模块提供了更大的灵活性,也适用于非 Linux/Unix 机器。通过该模块,您可以轻松地将同一封邮件发送给不同的收件人,使用 HTML 标签格式化您的邮件,还可以发送多个附件。**MIME::Lite**旨在作为一个简单、独立的模块来生成 MIME 消息,具体来说,它允许您输出一个简单、体面的包含文本或二进制附件的单部分或多部分消息。它不要求您安装邮件::或 MIME::模块,但如果安装了,将可以使用它们。为了安装只需写:

cpan -i MIME::Lite

也可以直接从这里下载。

简单邮件

下面是发送邮件时需要运行的文件。下面的代码需要用邮件的“收件人的邮件地址”、“发件人的邮件地址”、“主题”和“正文”来指定。

#!/usr/bin/perl
use MIME::Lite;

$to = 'receiver_mail@anything.com';
$cc = 'anyone@anything.com';
$from = 'sender_mail@anything.com';
$subject = 'Sending mail using perl';
$message = 'Well that was easy!!';

$msg = MIME::Lite->new(
                 From     => $from,
                 To       => $to,
                 Cc       => $cc,
                 Subject  => $subject,
                 Data     => $message
                 );

$msg->send;
print "Email Sent Successfully!\n";

现在,为了验证这一点,只需检查收件人的邮件,您将看到如下所示的图像:

HTML 格式的邮件

就像发送邮件实用程序一样,**MIME::Lite**模块也允许用户使用 perl 脚本发送 HTML 格式的邮件。

$message = '<h1>H1 is the main heading</h1><p><img src="image_source_with_extension" /></p>';

上面的代码将按照 HTML 语法格式化您的邮件。您可以以所需的方式使用 HTML 的所有标签。

向不同的接收者发送相同的电子邮件

现在的问题是如果你有多个接收器。在这种情况下,您什么也不用做,只需将$配置为变量:

$to = 'receiver1_mail@anything.com, receiver2_mail@anything.com, receiver3_mail@anything.com';

注意:确保用逗号(,)分隔每个邮件地址

发送附件

附件可以是任何东西,如文档、pdf 或图像。您可以在附件中添加一条短信。这个模块的一个优点是它使发送附件变得容易。您可以使用 attach()方法在一封电子邮件中包含多个文件。为了发送附件,只需写:

# Add text message.
$msg->attach(Type => 'text', 
             Filename => 'filename.extension', 
             Data => $message);

# Specify your file as attachment.
$msg->attach(Type => 'image/gif',
             Path => 'Provide_Full_Path',
             Filename => 'Filename.extension',
             Disposition => 'attachment');     
最后一档

因此,经过上述配置(如添加多个接收者、使用 HTML 格式化邮件和添加附件)后的最终代码如下所示:

#!/usr/bin/perl
use MIME::Lite;

$to = 'receiver1_mail@anything.com, receiver2_mail@anything.com, receiver3_mail@anything.com';
$cc = 'anyone@anything.com';
$from = 'sender_mail@anything.com';
$subject = 'Sending mail using perl';
$message = 'Well that was easy!!';

$msg = MIME::Lite->new(From     => $from,
                       To     => $to,
                       Cc     => $cc,
                       Subject => $subject,
                       Data     => $message);

# Add text message.
$msg->attach(Type     => 'text', 
             Filename => 'filename.extension', 
             Data     => $message);

# Specify your file as attachment.
$msg->attach(Type     => 'image/gif',
             Path     => 'Provide_Full_Path',
             Filename => 'Filename.extension',
             Disposition => 'attachment'); 

$msg->send;
print "Email Sent Successfully!\n";

mime::lite:html

这是 MIME::Lite 的变体,它增加了它的受欢迎程度。它类似于 MIME::Lite,但不同之处在于使用模板而不是硬编码消息内容的能力。

为了安装该模块:

cpan -i MIME::Lite::TT::HTML

现在首先你需要创建一个发送邮件的模板。

文件名:notice.txt.tt

This is from notice.txt

文件名:notice.html.tt

<p>This is from</p> <p>notice.html</p>

现在使用模板配置的源代码如下所示。

#!/usr/bin/perl

use strict;
use warnings;
use MIME::Lite::TT::HTML;

my %params;

$params{first_name} = 'Piotr';
$params{client_name} = 'Jane';

my %options;
$options{INCLUDE_PATH} = '/path/to/templates';

my $msg = MIME::Lite::TT::HTML->new(
    From => 'user1@mail.abc',
    To => 'user2@mail.abc',
    Subject => 'Sending mail',
    Template => {text => 'notice.txt.tt',
                 html => 'notice.html.tt',},
    TmplOptions => \%options,
    TmplParams => \%params,
);

$msg->send;
发送附件

对于发送附件,只需在$msg 变量后添加下面的代码。

$msg->attr("content-type" => "multipart/mixed");

$msg->attach(Type => 'application/pdf',
             Path => '/path/to/prison_map.pdf',
             Filename => 'prison_map.pdf',
             Disposition => 'attachment');

注意:给出完整路径和完整扩展名添加文件。

现在完整的源代码如下所示:

#!/usr/bin/perl

use strict;
use warnings;
use MIME::Lite::TT::HTML;

my %params;

$params{first_name} = 'Piotr';
$params{client_name} = 'Jane';

my %options;
$options{INCLUDE_PATH} = '/path/to/templates';

my $msg = MIME::Lite::TT::HTML->new(
    From => 'user1@mail.abc',
    To => 'user2@mail.abc',
    Subject => 'Sending mail',
    Template => {text => 'notice.txt.tt',
                 html => 'notice.html.tt',},
    TmplOptions => \%options,
    TmplParams => \%params,
);

$msg->attr("content-type" => "multipart/mixed");
$msg->attach(Type => 'application/pdf',
             Path => '/path/to/prison_map.pdf',
             Filename => 'prison_map.pdf',
             Disposition => 'attachment');

$msg->send;

使用 SMTP

默认情况下,上述方法使用 localhost 发送电子邮件,本地设置服务器不保证邮件会被发送。一旦您选择了提供商或决定自行设置 SMTP 服务器,请调整 MIME 模块中的代码,并在send()方法中提供 SMTP 凭据:

$msg->send('smtp', "smtp.example.com", AuthUser=>"your_id", AuthPass=>"your_password" );


回到顶部