Newsgroup: it.comp.lang.perl
Titolo: Tornando a parlare di mail...

Rieccomi qui! :)
leggendo il thread relativo all'invio di email da win2k/XP, mi sono
incuriosito e ho voluto provare a realizzare qualcosina cercando di
contattare il server Exchange per inviare mail... ma non ci sono riuscito!
:(
lo script usato è quello "istituzionale" trovato in rete nei vari
repository... ho solo fatto qualche modifichetta ma di poco conto.
Eccolo...
# START
 
 print "mandamail v0.01\n\n";
 print "Inserisci la tua login:\n";
 chomp($login = <STDIN>);
 
 print "Inserisci la password:\n";
 chomp($password = <STDIN>);
 
 print "Inserisci indirizzo del destinatario:\n";
 chomp($email = <STDIN>);
 
 print "Inserisci soggetto del messaggio:\n";
 chomp($soggetto = <STDIN>);
 
 print "Scrivi messaggio:\n";
 chomp($messaggio = <STDIN>);
 
# utilizzo di Net::SMTP per inviare una email
 
 use Net::SMTP; 
 
 my $smtp_server	= '
exchangeserver.fooo.it
';
 my $to			= $email;			#destinatario
 my $from		= '
pi...@fooo.it
';		#mittente
 my $subject		= $soggetto;
 my $msg		= $messaggio;
 
# costruisco un oggetto che si attacca al mio smtp server
 	$smtp = Net::SMTP->new(Hello => '$smtp_server',
 			auth =>('$login','$password'),
 			Timeout => 50,
 			Debug => 1,);    
# indica chi invia e chi riceve 
 	$smtp->mail("$from");
 	$smtp->to("$to");        
 
# inizia la sessione di invio dati
 	$smtp->data();
 
# invia dati
 	$smtp->datasend("To: $to\n");
 	$smtp->datasend("From: $from\n");
 	$smtp->datasend("Subject: $subject\n");
 	$smtp->datasend("X-Mailer: E-Mail sender\n");
 	$smtp->datasend("\n");
 	$smtp->datasend("$msg");
 
# chiude la sessione di invio dati
 	$smtp->dataend();    
 
# chiude la sessione con l'smtp server
 	$smtp->quit;
# FINE
eseguendolo e rispondendo alle varie richieste del prompt...
tutto ciò che ottengo è: 
"Can't call method "mail" on an undefined value at 
mail.pl
 line 39,
<STDIN> line 5."
Non riesco a comprendere cosa c'è di sbagliato...
Considerando che il server richiede l'autenticazione con login e password,
è corretto ciò che ho inserito nello script basandomi sulla documentazione
di Net::SMTP?
ringrazio ancora per la Vs attenzione...
mario.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

di Net::SMTP?
Sono gli argomenti corretti del metodo auth ma, ripeto, non mi risulta che
si possano dare come opzione direttamente nel costruttore. Tra l'altro, se
metti le variabili tra apici singoli, non sono sicuro che le espanda (e in
ogni caso non capisco che bisogno ci sia di apici, singoli o doppi). Chiama
il metodo successivamente alla creazione dell'oggetto:
    $smtp->auth($login, $password);
anche per capire meglio che cosa succede, se c'è un problema di connessione
o di autenticazione.
Ciao.

 o di autenticazione.
ho modificato il tutto in base alle tue indicazioni.
Ho tolto "Hello", ho eliminato apici e virgolette varie, ho chiamato il
metodo successivamente alla creazione dell'oggetto...
Ma, nonostante tutto, il messaggio di errore è lo stesso; cambiano solo i
riferimenti alle linee in cui si verificano gli errori:
 "Can't call method "auth" on an undefined value at 
mail2.pl
 line 37,
<STDIN> line 5."
:-((
help!


 riuscito!
Modificato così a me funziona tranquillamente. 
Prova a settare Debug => 1 così vedi cosa fa il prog.
Suggerisco inoltre di usare SEMPRE strict e warnings, così da essere
quasi sicuri che non ci siano errori di sintassi.
Quando poi crei l'oggetto Net::SMTP, suggerisco di usare sempre un " or
die " finale così sai se è riuscito a creare l'oggetto $smtp e quindi a
collegarsi.
Allego il codice funzionante qui sotto.
Ciao,
-- 
+--------+ ASCII ribbon campaign ( )
|  kral  |  - against HTML email  X 
+--------+              & vCards / \
<CODE>
use strict;
use warnings;
use Net::SMTP;
# START
print "mandamail v0.01\n\n";
print "Inserisci la tua login:\n";
chomp( my $login = <STDIN> );
print "Inserisci la password:\n";
chomp( my $password = <STDIN> );
print "Inserisci indirizzo del destinatario:\n";
chomp( my $email = <STDIN> );
print "Inserisci soggetto del messaggio:\n";
chomp( my $soggetto = <STDIN> );
print "Scrivi messaggio:\n";
chomp( my $messaggio = <STDIN> );
# utilizzo di Net::SMTP per inviare una email
my $smtp_server = '
smtp.email.it
';
my $to          = $email;                  #destinatario
my $from        = '
esse...@email.it
';    #mittente
my $subject     = $soggetto;
my $msg         = $messaggio;
# costruisco un oggetto che si attacca al mio smtp server
my $smtp = Net::SMTP->new( $smtp_server, Timeout => 30, Debug => 0 ) or
die "Impossibile accedere a $smtp_server\n";
$smtp->auth( $login, $password );
# indica chi invia e chi riceve
$smtp->mail("$from");
$smtp->to("$to");
# inizia la sessione di invio dati
$smtp->data();
# invia dati
$smtp->datasend("To: $to\n");
$smtp->datasend("From: $from\n");
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("X-Mailer: E-Mail sender\n");
$smtp->datasend("\n");
$smtp->datasend("$msg");
# chiude la sessione di invio dati
$smtp->dataend();
# chiude la sessione con l'smtp server
$smtp->quit;
# FINE
</CODE>

<STDIN> line 5."
O c'è qualche problema nella configurazione di Windows, o è banalmente
sbagliato l'indirizzo del server.
Aggiungi l'opzione Debug e un die:
      $smtp = Net::SMTP->new($smtp_server,
                             Debug => 1) or die;
e vedi che cosa ti dice.
Di Windows XP non so nulla, ma in Windows 2000 (e Windows NT) non ho
problemi a spedire la posta con Net::SMTP.
Ciao.

 problemi a spedire la posta con Net::SMTP.
il mio caso ricade in Windows 2000.
buona giornata


il mio caso ricade in Windows 2000.
Lo script a questo punto dovrebbe essere a posto, quanto meno è uguale a
quelli che utilizzo io normalmente senza problemi in Windows NT e Windows
2000 (e Linux, Net::SMTP funziona benissimo anche lì). Di più, da qui, non
so dirti.
Ciao.

      telnet indirizzo.server pop3
Vabbe':
      telnet indirizzo.server smtp
volevo dire, naturalmente. QUIT per uscire.
Ciao.

 volevo dire, naturalmente. QUIT per uscire.
il telnet va a buon fine...
č tutto il resto che non pare funzionare...
boh!


è tutto il resto che non pare funzionare...
Più che dirti che a me, tal quale, funziona, non so. Riassumo, per
chiarezza, la versione a cui dovremmo essere arrivati (ho sostituito il
server con quello di 
tin.it
):
# START
 
 print "mandamail v0.01\n\n";
 print "Inserisci la tua login:\n";
 chomp($login = <STDIN>);
 
 print "Inserisci la password:\n";
 chomp($password = <STDIN>);
 
 print "Inserisci indirizzo del destinatario:\n";
 chomp($email = <STDIN>);
 
 print "Inserisci soggetto del messaggio:\n";
 chomp($soggetto = <STDIN>);
 
 print "Scrivi messaggio:\n";
 chomp($messaggio = <STDIN>);
 
# utilizzo di Net::SMTP per inviare una email
 
 use Net::SMTP; 
 
 my $smtp_server	= '
mail.tin.it
';
 my $to			= $email;			#destinatario
 my $from		= '
pi...@fooo.it
';		#mittente
 my $subject		= $soggetto;
 my $msg		= $messaggio;
 
# costruisco un oggetto che si attacca al mio smtp server
 	$smtp = Net::SMTP->new($smtp_server,
			       Hello => '
tin.it
',
 			Timeout => 120,
 			Debug => 1,);
 
	$smtp->auth($login, $password);
# indica chi invia e chi riceve 
 	$smtp->mail($from);
 	$smtp->to($to);        
 
# inizia la sessione di invio dati
 	$smtp->data();
 
# invia dati
 	$smtp->datasend("To: $to\n");
 	$smtp->datasend("From: $from\n");
 	$smtp->datasend("Subject: $subject\n");
 	$smtp->datasend("X-Mailer: E-Mail sender\n");
 	$smtp->datasend("\n");
 	$smtp->datasend($msg);
 
# chiude la sessione di invio dati
 	$smtp->dataend();    
 
# chiude la sessione con l'smtp server
 	$smtp->quit;
# FINE
A me così funziona. Hai controllato, ovviamente, di avere il modulo
Authen::SASL (ma dovrebbe darti un altro errore, se fosse questo il
problema)?
Che non sia a questo punto un problema del server: hai provato con un altro
server smtp? Io incontrai un problema di autenticazione con Mercury: un
conflitto tra il modulo Authen::SASL e il server in questione, per cui al
login o alla password veniva aggiunto un carattere "\n", e naturalmente
l'autenticazione non andava a buon fine. Questo però in ogni caso dopo la
connessione.
Ciao.

 	$smtp->datasend($msg);
Naturalmente, qui dovrebbe esserci come minimo un campo Date: e un
Massage-ID: e il Return-Path: dovrebbe essere indirizzo valido e
possibilmente reale, ma prima di tutto questo bisognerebbe riuscire a
connettersi.
Ciao.

 connessione.
tutto quello che posso dire è che il server della mail è un "ottuso"
MS-Exchange... purtroppo non ho possibilità di provare con altri server...
Il codice, esattamente come quello che hai postato tu ma con server
diverso (of course), mi risponde picche... Ovvero:
"Net::SMTP: Timeout      ...propagated at 
mail2.pl
 line 31, <STDIN> line
5."
sto quasi per gettare la spugna... ;(


5."
Aumenta spropositatamente il timeout (giusto per non dire di non avere
provato anche questa). In telnet che tempi di risposta hai?
Il server (non ho capito bene) è in locale (non che cambi nulla)?
Installa un (altro) server smtp in locale (Hamster, per esempio) e vedi che
succede.
Ciao.

 succede.
anche se ciò funzionasse... non potrei utilizzarlo in seguito per lo scopo
finale... purtroppo!
mario.


finale... purtroppo!
Certo, ma potrebbe servire a capire qual è il problema. Non è un granché, lo
so, ma tutti gli altri percorsi diagnostici a me noti li abbiamo già
tentati.
Sempre a scopo diagnostico, potresti provare qualcuno degli altri moduli
LibNet, come Net::POP3 o Net::HTTP. Dato che utilizzano tutti lo stesso
meccanismo per creare la connessione, che falliscano tutti o che qualcuno
abbia successo potrebbe fornire delle informazioni. Quali, in dettaglio, non
saprei dire per la verità, ma a questo punto....
Potresti provare anche qualcuno degli altri numerosi moduli per spedire
posta, indipendenti da Net::SMTP, come Mail::Sender. Questo sia a scopo
diagnostico che, hai visto mai, per aggirare qualche incompatibilità di
Net::SMTP con la tua rete.
Ciao.

Giovanni Zezza ha scritto:




Purtroppo non ho tutta questa libertà di azione in fatto di moduli...
Mi rtrovo ad agire in un ambiente "pseudo-Perl" inglobato all'interno di
un applicativo della Rational (ClearQuest, per intenderci).
Tale applicativo offre la possibilità, attraverso le proprie API, di poter
interfacciare degli script esterni alle sue funzioni. Il tutto in ambiente
Windows... sigh!
Sinceramente non saprei proprio come fare ad aggiungere moduli
supplementari a quei pochi già esistenti. Ho provato a dare un'occhiata ma
non è il massimo della trasparenza e la documentazione fornita a corredo
non si spreca a dare spiegazioni in merito...


Rieccomi qua con una "buona" notizia (almeno per me...)!
Non accettando la "sconfitta" da parte di un semplice script ho continuato
a "ravanare" e a provare e, alla fine, ce l'ho fatta a scoprire l'inghippo!
Il colpevole, che doveva essere di "facile" deduzione, era il maledetto
server o... I maledetti server!!!
Tradito dalla configurazione di MS-Outlook, il quale indica solo un server
come incaricato di tutto il processo di invio e ricezione della posta, il
processo di spedizione tramite script, così come era fino all'ultima
versione postata anche da Giovanni, non andava a buon fine perchè risulta
esserci un secondo server che fa questo mestiere.
Spulciando qua e la in varie configurazioni di altri programmi di posta
elettronica (Eudora, Incredimail, etc.) sono venuto a capo del nome del
secondo server... ho provato a sostituirlo nello script e... et voilà!
tutto funge (o quasi).
Unica cosa che ho dovuto eliminare dallo script incriminato per farlo
funzionare al 100%, è l'autenticazione tramite login e password... infatti
ricevo una segnalazione di sistema e sembra non essere supportata. Boh,
valli a capire 'sti programmi! ;-)))
Per dovere di cronaca, oltre a ringraziare la paziente assistenza di
Giovanni Zezza, riporto l'URL relativo ad un breve articolo-guida che
potrà essere d'aiuto e di riferimento a chi avesse necessità simili a
quella avuta dal sottoscritto: "inviare mail in Perl".
L'articolo lo si trova (in inglese) al link:
http://perl.about.com/library/nosearch/P022000.htm
ringrazio per la pazienza e la sopportazione.
