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

时间:2015-02-05 16:47:22

标签: windows perl email activeperl

我一直在试图弄清楚如何在Windows 7上从Perl发送电子邮件。我无法安装任何Perl模块,而不是Active Perl安装的默认模块。 (这意味着Mime :: Lite,Email :: Sender和Mail :: Sendmail都在桌面之外)

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

我看到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

我一直收到错误:

  

无法在未定义的值上调用方法'mail'

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

还有哪些其他模块标配Active Perl更易于使用?

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


修改

也不要求我通过gmail。这是我想到的第一件事。

1 个答案:

答案 0 :(得分:3)

事实证明,解决方案只是向我公司的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,
);

这个脚本需要的只是&#34; SMTP服务器名称&#34;,&#34;地址&#34;和&#34;来自地址&#34;而且你会开始运作!


我无可救药地想要弄清楚几天前它是如何起作用的(我甚至不知道SMTP server是什么样的),所以我希望这至少可以帮助其他人类似的情况。

  

这可能是list of commonly used SMTP servers   有帮助的。

Net::SMTP是我唯一的选择,因为我无法在这台PC上安装任何不符合ActivePerl标准的模块,但是如果你打算使用像gmail那样具有更高安全性的东西,可能需要身份验证,您需要使用的不仅仅是Net::SMTP来发送邮件。如果是这种情况,您可能需要查看Net::SMTP::SSL或其他邮件发送模块。


已加入奖金!

此脚本也适用于Linux;)