Perl错误消息可能您忘记加载

时间:2016-05-01 17:50:24

标签: perl

我有一个使用Mail::Sender的第一个Perl程序:

#!/usr/bin/perl

use warnings;

use Getopt::Long;

use autodie;    # die if problem reading or writing a file

use Mail::Sender;

my $av_tmp_SENDER = Mail::Sender->new( {
    from    => 'absender@absender.de',
    to      => 'empf@empf.de',
    subject => 'Funktionstest',
} );

$av_tmp_SENDER->MailMsg( {
    to      => 'empf@empf.de',
    subject => 'Funktionstest',
    msg     => "noch ein bisschen text"
} );

print "Die e-Mail wurde verschickt";  # The email was sent

然后我收到此错误消息:

Can't locate object method "MailMsg" via package "-1" (perhaps you forgot to load "-1"?) at ./av_perl_02.pl line

有人可以给初学者一个提示吗?!

2 个答案:

答案 0 :(得分:2)

您需要检查返回的Mail::Sender->new是否有效。在这种情况下,它返回-1。然后,当您尝试在值为MailMsg的变量上调用-1时,Perl会将该值解释为类(包)名称,并假定您要调用该类上的方法。

测试构造函数返回值的一种好方法是使用ref函数:

my $av_tmp_SENDER = Mail::Sender->new(...)
if ( ref( $av_tmp_SENDER ) eq 'Mail::Sender' ) {
    # Use the new object
}
else {
    # Print a message
}

当然,该模块的文档可能表示其他检查。例如,它返回-1而不是undef0是什么意思?

答案 1 :(得分:1)

...欢迎使用Stack Overflow和Perl

如果持不同意见者让你失望,我很抱歉,但最终他们是对的 - Stack Overflow是一个英语网站

问题是您在创建Mail::Server对象时未指定SMTP服务器。大多数互联网服务提供商都允许您访问其SMTP服务器作为交易的一部分

如果您不知道SMTP服务器的URL,那么您应该在线检查或致电支持部门以了解它的用途。您可能还需要提供您的用户名和密码

您需要与他们核对并提供服务器的URL到new电话。以下代码假定您拥有Gmail帐户,而Google的SMTP服务器位于smtp.gmail.com

此代码会在调用newMailMsg时报告任何错误。错误代码为负数,您可以在Return codes section of the Mail::Sender documentation

中阅读其含义
#!/usr/bin/perl

use utf8;
use strict;
use warnings 'all';

use Mail::Sender;

my $sender = Mail::Sender->new( {
    smtp    => 'smtp.gmail.com',
    authid  => 'my.email@gmail.com',
    authpwd => 'Herringbone-pattern-1989',
} );

die "Return code $sender" unless ref $sender;

my $status = $sender->MailMsg( {
    to      => 'my.friend@gmail.com',
    from    => 'my.email@gmail.com',
    subject => 'Funktionstest',
    msg     => 'noch ein bisschen text',
} );

die "Return code $status" unless ref $status;

print "Die e-Mail wurde verschickt";