2012-06-07 3 views
2

Ниже я пишу, чтобы отправить электронное письмо с моего почтового хоста на мой индивидуальный адрес электронной почты и ошибку, которую я получаю.как отправить SMTP-адрес электронной почты в perl

Может кто-то пожалуйста, помогите мне, почему мы получаем ошибку:

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

Вы знакомы с тем, как работает Object Oriented Perl?

Для использования объектно-ориентированного модуля Perl вы должны сначала создать объект этого типа класса. Как правило, это делается с помощью метода new:

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

Теперь $smtp является объект класса Net::SMTP. В принципе, это ссылка на глобус, где вы можете хранить свою структуру данных (кто вы отправляете, ваше сообщение и т. Д.). Затем 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; 
Смежные вопросы