2016-05-01 11 views
0

Ich habe ein erstes Perl-Programm zu laden, die Mail::Sender verwendet:Perl Fehlermeldung vielleicht vergessen haben

#!/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 => '[email protected]', 
    to  => '[email protected]', 
    subject => 'Funktionstest', 
}); 

$av_tmp_SENDER->MailMsg({ 
    to  => '[email protected]', 
    subject => 'Funktionstest', 
    msg  => "noch ein bisschen text" 
}); 

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

Dann hat ich diese Fehlermeldung:

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

Kann jemand bitte einem Anfänger einen Tipp geben ?!

+5

** 1 ** Bitte benutzen Sie Englisch lesen. ** 2 ** * Immer * 'verwenden streng'! – Biffen

+0

@Biffen 's/Bitte/Immer /' – andlrc

+3

@andlrc: Ich glaube nicht, dass irgendein Schaden von einer kleinen Höflichkeit kommt, besonders wenn "bitte" verwendet wird, wie Biffen tat, ohne irgendeinen Sinn der Anständigkeit überhaupt. Es ist auch wichtig, mit einer Perl-Frage zu unterscheiden * bitte schreibe deine Beiträge in der englischen Sprache * von * bitte 'benutze Englisch' * dass IMO eine schreckliche Sache ist, nur um' Diagnosen zu verwenden ' – Borodin

Antwort

2

Sie müssen überprüfen, dass das zurückgegebene Mail::Sender->new gültig ist. In diesem Fall gibt es -1 zurück. Wenn Sie dann versuchen, MailMsg für die Variable aufzurufen, die den Wert -1 hat, interpretiert Perl den Wert als einen Klassennamen (Paket) und nimmt an, dass Sie beabsichtigen, die Methode für diese Klasse aufzurufen.

Ein guter Weg, um den Rückgabewert von einem Konstruktor zu testen, ist mit der ref Funktion:

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

Natürlich kann die Dokumentation für das Modul andere Kontrollen zeigen. Zum Beispiel, was bedeutet es, dass es -1 eher als undef oder 0 zurückgegeben hat?

1

... und begrüßen zu Stack-Überlauf und Perl

Es tut mir leid, wenn die Abweichler abschrecken, aber am Ende sind sie rechts Stack-Überlauf ist ein englischer Sprache Ort

Die Problem ist, dass Sie beim Erstellen des Objekts Mail::Server keinen SMTP-Server angegeben haben. Die meisten Internet Service Provider geben Ihnen Zugriff auf ihren SMTP-Server als Teil des Geschäfts

Wenn Sie die URL für Ihren SMTP-Server nicht kennen, dann sollten Sie online oder rufen Sie Unterstützung, um herauszufinden, was es ist. Sie werden wahrscheinlich auch Ihren Benutzernamen und Ihr Passwort eingeben müssen.

Sie müssen mit ihnen überprüfen und die URL für den Server an die new Anruf. Der folgende Code geht davon aus, dass Sie über ein Google Mail-Konto verfügen und der Google-SMTP-Server lautet smtp.gmail.com

Dieser Code meldet alle Fehler, entweder im Anruf an new oder an MailMsg. Fehlercode sind negative Zahlen, und Sie können ihre Bedeutung in der 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 => '[email protected]', 
    authpwd => 'Herringbone-pattern-1989', 
}); 

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

my $status = $sender->MailMsg({ 
    to  => '[email protected]', 
    from => '[email protected]', 
    subject => 'Funktionstest', 
    msg  => 'noch ein bisschen text', 
}); 

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

print "Die e-Mail wurde verschickt"; 
+0

O.K. - Danke für den Hinweis - wie gesagt, ich bin ein totaler Neuling. In diesem Beispiel möchte ich einfach eine E-Mail senden, wie ich normalerweise mit Shell-Befehl mailx, da meine Ubuntu-Maschine eine Postfix-Installation ausgeführt hat. Ich suchte nach Beispielen im Netz und stieß auf dieses. Aber es muss einen Weg geben, die Post einfach wegzuschicken und den bestehenden Postfix behandeln zu lassen. Übrigens: Postfix ist nur für die Annahme von Mails aus dem lokalen Netzwerk konfiguriert. Danke Karl-Heinz – averlon

Verwandte Themen