2012-06-07 15 views
2

以下是我写邮件从我的邮件主机发送到我的个人电子邮件地址和我得到的错误。如何在perl发送SMTP电子邮件

可能有人请帮助我,为什么我们得到的错误:

Can't call method "mail" on an undefined value at cmm_ping.pl line 2.

use Net::SMTP; 
$smtp->mail("[email protected]"); 
$smtp->recipient("[email protected]"); 
$smtp->datasend("From: [email protected]"); 
$smtp->datasend("To: [email protected]"); 
$smtp->datasend("Subject: This is a test"); 
$smtp->datasend("\n"); 
$smtp->datasend("This is a test"); 
$smtp->dataend; 
$smtp->quit; 
+0

@flo,有没有必要添加'**编辑为formatting'给你编辑的职位。但是,你必须做其他事情。如果可能的话,修复一篇文章的错误。 – Ben

+0

请考虑使用[Email :: Sender]等高级模块(http://search.cpan.org/perldoc?Email::Sender)发送电子邮件。 [以下是一个示例](http://stackoverflow.com/a/10008814/8355)。 – cjm

+1

也用严格;使用警告; – Bruce

回答

3

变量$smtp尚未确定。看看usage examples of Net::SMTP。这个例子几乎可以代替你的代码:

use Net::SMTP; 

$smtp = Net::SMTP->new('mailhost'); 

$smtp->mail($ENV{USER}); 
$smtp->to('postmaster'); 

$smtp->data(); 
$smtp->datasend("To: postmaster\n"); 
$smtp->datasend("\n"); 
$smtp->datasend("A simple test message\n"); 
$smtp->dataend(); 

$smtp->quit; 
3

你是否熟悉面向对象Perl的工作原理?

为了使用面向对象的Perl模块,您必须首先创建该类类型的对象。通常情况下,这是通过new方法来完成:

my $smtp = Net::SMTP->new($mailhost); 

现在,$smtpNet::SMTP类的对象。基本上,它是对可以存储数据结构的glob的引用(您要发送给谁,您的消息等)。然后,Perl可以在方法调用期间使用这些信息(这些子程序只是Net :: SMTP包的一部分)。

下面是一个程序我写了一个例子:

use Net::SMTP; 

my $smtp = Net::SMTP->new(
    Host => $watch->Smtp_Host, 
    Debug => $debug_level, 
); 

if (not defined $smtp) { 
    croak qq(Unable to connect to mailhost "@{[$watch->Smtp_Host]}"); 
} 

if ($smtp_user) { 
    $smtp->auth($watch->Smtp_User, $watch->Smtp_Password) 
     or croak 
     qq(Unable to connect to mailhost "@{[$watch->Smtp_Host]}") 
     . qq(as user "@{[$watch->Smtp_User]}"); 
} 

if (not $smtp->mail($watch->Sender)) { 
    carp qq(Cannot send as user "@{[$watch->Sender]}") 
     . qq(on mailhost "@{[$watch->Smtp_Host]}"); 
    next; 
} 
if (not $smtp->to($email)) { 
    $smtp->reset; 
    next; #Can't send email to this address. Skip it 
} 

# 
# Prepare Message 
# 
# In Net::SMTP, the Subject and the To fields are actually part 
# of the message with a separate blank line separating the 
# actual message from the header. 
# 
my $message = $watch->Munge_Message($watcher, $email); 
my $subject = 
    $watch->Munge_Message($watcher, $email, $watch->Subject); 

$message = "To: $email\n" . "Subject: $subject\n\n" . $message; 

$smtp->data; 
$smtp->datasend("$message"); 
$smtp->dataend; 
$smtp->quit;