在 Windows 7 上用 Perl 发送电子邮件而不安装模块

Sending an email in Perl on Windows 7 without installing modules

我一直在绞尽脑汁想弄清楚如何在 Windows 上从 Perl 发送电子邮件 7. 除了 Active Perl 安装的默认模块之外,我无法安装任何 Perl 模块。 (这意味着 Mime::Lite、Email::Sender 和 Mail::Sendmail 都在 table 之外)

我能找到的唯一电子邮件发送模块似乎是Net::SMTP,但我一直无法弄清楚如何正确使用它。我对 SMTP 服务器是什么不是很熟悉,更不用说它们是如何工作的了。我发现关于发送电子邮件的所有其他 post 建议使用我没有的不同模块。

我看到 another post 建议使用 Net::SMTP::SSL 连接到 gmail,但我没有 SSL 模块。

这是我目前的一些代码,我正在尝试使用 gmail 作为我的 SMTP 服务器:

use Net::SMTP;

$smtp = Net::SMTP->new('smtp.gmail.com'); # connect to an SMTP server

$smtp->mail('fromAddress@gmail.com'); # use the sender's address here
$smtp->to('toAddress@test.com');      # recipient's address
$smtp->data();                        # Start the mail

# Send the header.
$smtp->datasend("To: toAddress\@test.com\n");
$smtp->datasend("From: myAddress\@gmail.com\n");
$smtp->datasend("Subject: Test email\n");
$smtp->datasend("\n");

# Send the body.
$smtp->datasend("Hello, World!\n");
$smtp->dataend();                   # Finish sending the mail
$smtp->quit;                        # Close the SMTP connection

我一直收到错误消息:

Can't call method 'mail' on an undefined value

我假设这意味着无法连接到 SMTP 服务器。我该如何解决这个问题?

还有其他更易于使用的标准 Active Perl 模块吗?

我真的在寻找类似于 Linux SENDMAIL 命令的东西,它非常简单,甚至不需要您连接或验证任何东西。 Linux SENDMAIL 命令似乎甚至允许你随意编造任何你想要的 "from" 地址,这可能真的很危险但很棒!


编辑

另外,我也不需要通过 gmail。这是我第一个想到的。

事实证明,解决方案只是询问我公司的 Windows 管理员使用什么合适的 SMTP 服务器。

获得合适的 SMTP 服务器后,一切都按计划进行!

让它工作后,我写了一个简单的子程序来发送纯文本电子邮件:

#!/usr/bin/perl

use strict;
use warnings;

use Net::SMTP;

sub send_mail
####################################################################################################
#
# SUBROUTINE : send_mail
#
# PURPOSE    : Send an email.
#
# INPUT(S)   : smtp_server - Simple Mail Transfer Protocol server
#              to          - Recipient address
#              from        - Sender address
#              subject     - Subject
#              body        - Reference to an array containing the message body
#
# OUTPUT(S)  : 0 - success
#              1 - failure
#
####################################################################################################
{
    # Unpack input arguments
    my %args = @_;

    # Get required arguments
    my $smtp_server = $args{smtp_server} or die "ERROR: $smtp_server is not defined";
    my $to          = $args{to         } or die "ERROR: $to is not defined";
    my $from        = $args{from       } or die "ERROR: $from is not defined";

    # Get optional arguments
    my $subject = $args{subject} if $args{subject};
    my @body    = @{$args{body}} if $args{body   };

    # Connect to the SMTP server
    my $smtp = Net::SMTP->new($smtp_server);

    # If connection is successful, send mail
    if ($smtp) {

        # Establish to/from
        $smtp->mail($from);
        $smtp->to($to);

        # Start data transfer
        $smtp->data();

        # Send the header
        $smtp->datasend("To: $to\n");
        $smtp->datasend("From: $from\n");
        $smtp->datasend("Subject: $subject\n");
        $smtp->datasend("\n");

        # Send the body
        $smtp->datasend(@body);

        # End data transfer
        $smtp->dataend();

        # Close the SMTP connection
        $smtp->quit();

    # If connection fails return with error
    } else {

        # Print warning
        warn "WARNING: Failed to connect to $smtp_server: $!";

        return 1;
    }

    return 0;
}

# Define the message body
my @message_body = "Hello World!\n";
push @message_body, "Add another line!\n";

# Send the email!
send_mail(
    smtp_server => <smtp_server_name>,
    to          => <to_address>,
    from        => <from_address>,
    subject     => 'This is a subject',
    body        => \@message_body,
);

此脚本只需要 "SMTP server name"、一个 "to address" 和一个 "from address",然后您就可以 运行!


几天前,我在试图弄清楚这是如何工作时绝望地迷失了方向(我什至不知道 SMTP server 是什么)所以我希望这至少能帮助其他人类似情况。

Here is a list of commonly used SMTP servers which may be helpful.

Net::SMTP was my only option since I can't install any modules on this PC that don't come standard with ActivePerl, but if you plan on using something like gmail which has more security and may require authentication you will need to use more than just Net::SMTP to send your messages. If this is the case, you may want to look into Net::SMTP::SSL或其他邮件发送模块。


额外奖励!

此脚本也适用于 Linux ;)