Perl 提供了多种方式来发送电子邮件,适用于简单的文本邮件到复杂的带附件的HTML邮件。本文将介绍Perl中发送邮件的常见方法,包括使用内置工具和外部模块。


目录

  1. 发送邮件概述
  2. 使用 sendmail 发送邮件
  3. 使用 MIME::Lite 模块
  4. 使用 Email::Sender 发送邮件
  5. 邮件调试与测试
  6. 参考资料

1. 发送邮件概述

Perl 发送邮件的方式包括:

  • sendmail:适用于Linux/Unix系统,直接调用系统邮件工具。
  • 模块:如 MIME::Lite(简单但已不推荐)、Email::Sender(现代推荐)等。
  • SMTP:通过邮件服务器发送,支持跨平台。

选择方法取决于操作系统、邮件复杂度及维护需求。


2. 使用 sendmail 发送邮件

在Linux/Unix系统中,可以直接使用 sendmail 命令发送邮件。

基本示例

use strict;
use warnings;

my $to = 'recipient@example.com';
my $from = 'sender@example.com';
my $subject = '测试邮件';
my $message = '这是一封来自Perl的测试邮件';

open(my $mail, "|/usr/sbin/sendmail -t") or die "无法打开sendmail: $!";
print $mail "To: $to\n";
print $mail "From: $from\n";
print $mail "Subject: $subject\n\n";
print $mail "$message\n";
close($mail) or warn "关闭sendmail失败: $!";
print "邮件已发送\n";

HTML邮件

添加 Content-type: text/html

my $message = "<h1>你好</h1><p>这是一封HTML邮件</p>";
open(my $mail, "|/usr/sbin/sendmail -t") or die "无法打开: $!";
print $mail "To: $to\n";
print $mail "From: $from\n";
print $mail "Subject: $subject\n";
print $mail "Content-type: text/html\n\n";
print $mail "$message\n";
close($mail);

限制:依赖本地sendmail配置,Windows不可用。


3. 使用 MIME::Lite 模块

MIME::Lite 支持带附件和HTML的邮件,但当前维护者不推荐使用。

安装

cpan MIME::Lite

基本文本邮件

use strict;
use warnings;
use MIME::Lite;

my $to = 'recipient@example.com';
my $from = 'sender@example.com';
my $subject = '测试邮件';
my $message = '这是一封测试邮件';

my $msg = MIME::Lite->new(
    From    => $from,
    To      => $to,
    Subject => $subject,
    Data    => $message
);
$msg->send or die "发送失败";
print "邮件已发送\n";

HTML邮件带附件

use MIME::Lite;

my $msg = MIME::Lite->new(
    From    => 'sender@example.com',
    To      => 'recipient@example.com',
    Subject => '带附件的HTML邮件',
    Type    => 'multipart/mixed'
);
$msg->attach(
    Type => 'text/html',
    Data => '<h1>你好</h1><p>这是一个测试</p>'
);
$msg->attach(
    Type     => 'application/pdf',
    Path     => 'test.pdf',
    Filename => 'test.pdf'
);
$msg->send;
print "邮件已发送\n";

注意:需配置SMTP服务器或本地sendmail。


4. 使用 Email::Sender 发送邮件

Email::Sender 是现代推荐的模块,支持灵活的邮件发送。

安装

cpan Email::Sender::Simple Email::MIME

基本示例

use strict;
use warnings;
use Email::MIME;
use Email::Sender::Simple qw(sendmail);

my $email = Email::MIME->create(
    header_str => [
        From    => 'sender@example.com',
        To      => 'recipient@example.com',
        Subject => '测试邮件',
    ],
    attributes => {
        encoding => 'quoted-printable',
        charset  => 'UTF-8',
    },
    body_str => "这是一封测试邮件\n",
);
sendmail($email);
print "邮件已发送\n";

使用SMTP

use Email::Sender::Transport::SMTP;

my $transport = Email::Sender::Transport::SMTP->new({
    host => 'smtp.example.com',
    port => 587,
    sasl_username => 'username',
    sasl_password => 'password',
});
sendmail($email, { transport => $transport });

5. 邮件调试与测试

检查错误

使用 $!$@ 查看错误:

eval { sendmail($email) };
if ($@) { print "发送失败: $@\n"; }

测试工具

  • Mailtrap:捕获测试邮件,避免真实发送。
  • 本地SMTP服务器:如Postfix,用于调试。

6. 参考资料

站内链接

出站链接


这篇指南介绍了Perl发送邮件的多种方法,从简单到复杂均有覆盖。如果需要更具体的内容(比如Gmail SMTP配置或多收件人处理),请告诉我!