Envoi de courrier via SMTP en Perl
Je suis en train d'envoyer des mails via SMTP en Perl.
J'ai écrit un script pour cette.
#!perl
use warnings;
use strict;
use Net::SMTP;
my $smtpserver = 'server';
my $smtpport = 25;
my $smtpuser = 'username';
my $smtppassword = 'password';
my $smtp = Net::SMTP->new($smtpserver, Port=>$smtpport, Timeout => 10, Debug => 1);
die "Could not connect to server!\n" unless $smtp;
$smtp->auth($smtpuser, $smtppassword);
$smtp->to('[email protected]');
$smtp->data();
$smtp->datasend("To: mymail\@gmail.com\n");
$smtp->quit;
Lorsque j'exécute ce script, mon résultat est comme suit:
Net::SMTP>>> Net::SMTP(2.31)
Net::SMTP>>> Net::Cmd(2.29)
Net::SMTP>>> Exporter(5.65)
Net::SMTP>>> IO::Socket::INET(1.31)
Net::SMTP>>> IO::Socket(1.32)
Net::SMTP>>> IO::Handle(1.31)
Net::SMTP=GLOB(0x273faf0)<<< 220 server GMX Mailservices E
Net::SMTP=GLOB(0x273faf0)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x273faf0)<<< 250-server GMX Mailservices
Net::SMTP=GLOB(0x273faf0)<<< 250-8BITMIME
Net::SMTP=GLOB(0x273faf0)<<< 250-ENHANCEDSTATUSCODES
Net::SMTP=GLOB(0x273faf0)<<< 250-SIZE
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH=LOGIN PLAIN
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH LOGIN PLAIN
Net::SMTP=GLOB(0x273faf0)<<< 250 STARTTLS
Net::SMTP=GLOB(0x273faf0)>>> RCPT TO:<mymail@gmail.com>
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> DATA
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> To: mymail@gmail.com
Net::SMTP=GLOB(0x273faf0)>>> .
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> QUIT
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001}
Je n'ai pas assez d'informations sur Perl et SMTP, je ne pouvais pas comprendre cette erreur.
Comment puis-je résoudre ce problème?
source d'informationauteur Selin | 2012-04-04
Vous devez vous connecter pour publier un commentaire.
Vous devez démarrer une session SMTP (après autorisation, si nécessaire) avec un MAIL de commande en donnant l'adresse de l'expéditeur. C'est pourquoi les réponses dites "MAIL en premier" (5xx est une réponse d'erreur). Donc:
Mais si vous n'êtes pas un SMTP expert, pourquoi ne pas utiliser un niveau supérieur de module comme E-Mail::Sender au lieu de le faible niveau Net::SMTP?
Voici une version mise à jour du cjm du script qui fonctionne avec Gmail à l'aide de STARTTLS (pas testé avec d'autres services SMTP)
Il utilise e-Mail::Expéditeur: Transports:: SMTPS au lieu de e-Mail::Expéditeur: Transports:: SMTP
Votre compte gmail va avoir "Accès pour les moins sécurisé à des applications autorisées ("allumé") - où "moins sûrs" ne signifie pas clair, il semble juste de dire n'utilisant pas le protocole OAuth 2.0
Il se plaint de l'absence d'un
MAIL FROM:
commande SMTP.Sans regarder toute la documentation, je pense que ça serait ressembler à quelque chose commeComme @cjm écrit, vous avez besoin$smtp->from('[email protected]')
$smtp->mail('[email protected]');
Accordée, il semble un peu ridicule d'avoir à fournir un nom d'utilisateur juste après authentifié, mais il fait sens à partir d'un historique et de la rétro-compatibilité point de vue (le STARTTLS ESMTP spécification peut simplement indiquer ce que vous devez faire pour s'authentifier, puis le reste de la séance se passe comme régulièrement SMTP après l'authentification se fait). Il serait judicieux pour
Net::SMTP
pour vous protéger de ces détails de mise en œuvre, bien que.Btw - bien qu'un peu en retard, de toute façon pour les futurs lecteurs, Avez-vous fait recv la poste?
Il n'y a pas d'erreurs dans la sortie ci-joint. Vous avez activé le débogage (Debug=>1) dans votre constructeur. Ces messages disparaissent une fois que vous jeu de de 0.
Avantage de l'utilisation de SMTP est qu'il est inclus dans le stock de l'installer. Pas besoin d'ajouter des modules.
Malheureusement, dans la (très) fin 2014, Net::SMTP::SSL échoue à 1 de 1 tests d'installation, ainsi gmail (et les autres) basé sur le web serveur est inaccessible. Sans installer mon propre serveur de mail, la seule façon que je peux trouver pour envoyer des courriels à partir de Perl est-à-OLE pour Outlook. Outlook utilise alors ses connexions pour faire bouger les choses.
J'espère que quelqu'un peut me prouver le contraire.
Pour les services de messagerie qui utilisent STARTTLS, il est préférable d'utiliser la plus récente NET::SMTPS module. Essayez le code suivant: