Newsgroup: it.comp.java
Titolo: Email con telnet

Salve ragazzi, sto provando a mandare una email con telnet tramite java, ho 
però un problema, quando il programma comincia a scrivere il data, ovvero 
gli header della email, telnet va in timeout, infatti viene segnalato 
l'errore timeout exceeded, posto qui sotto il codice con la speranza che 
qualcuno mi voglia aiutare.
public void sendMail(String host, String from, String to, String message, 
String oggetto )
   {  try
      {  Socket s = new Socket(host, 25);
         out = new PrintWriter(s.getOutputStream());
         in = new BufferedReader(new InputStreamReader(s.getInputStream()));
         String hostName = InetAddress.getLocalHost().getHostName();
         send(null);
         send("HELO " + hostName);
         send("MAIL FROM: " + from);
         send("RCPT TO: " + to);
         send("DATA");
         send("return-path: " + "<" +to+ ">");
         send("Received: " + "by 
pippo.it
 id AA78428 with SMTP;Sun, 9 Jun 
2005 11:10:20 +0200");
         send("Date: " + "Sun, 9 Jun 2005 11:10:20");
         send("MIME-Version: " + "1.0");
         send("Content-Type: " + "text/plain; charset=iso-8859-1; 
format=flowed");
         send("Content-Transfer-Encoding: " + "quoted-printable");
         send("Message-ID: " + "
121.5...@pippo.com
");
         send("From: " + "Pippo");
         send("To: " + to);
         send("Subject: " + oggetto);
         send(message);
         send(".");
         send("quit");
         s.close();
      }
      catch (IOException exception)
      {  System.out.println("Error: " + exception);
        exception.printStackTrace();
      }
   }
   public void send(String s) throws IOException
   {
     if (s != null)
    {
     System.out.println(s);
          out.println(s);
          out.flush();
       }
      String line;
      if ((line = in.readLine()) != null)
      {
       System.out.println(line);
      }
   } 

         send("Received: " + "by 
pippo.it
 id AA78428 with SMTP;Sun, 9 Jun
Al momento non ricordo a memoria il protocollo SMTP, ma comunque il server 
ti risponde all'invio di ogni tuo comando.
Compatibilmente con il protocollo, dopo ogni send() fai una in.readLine() 
per leggere la risposta del server e verificare eventuali errori.
Ciao
Marco 


Quello che dici tu lo faccio già nell'altro metodo:
if ((line = in.readLine()) != null)
      {
       System.out.println(line);
      }
Ma non penso però che sia questo il problema :-( 

 l'errore timeout exceeded, 
Ti da' l'errore sempre nel medesimo punto ?
Ma "Received:", "Date:", "Message-ID:" non dovrebeo essere aggiunti dal 
mailserver ?
Inoltre, perche' non usi le API di Java per spedire l'Email :) ?
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

> Quello che dici tu lo faccio già nell'altro metodo:
Mi era sfuggito.
Ma hai provato a fare tutto il procedimento a mano?
Ossia un telnet a linea di comando, così vedi se ci sono degli errori.
Ciao
Marco 

> Inoltre, perche' non usi le API di Java per spedire l'Email :) ?
JavaMail?
Non è che sia proprio semplice subito... :-(
Ciao
Marco 

 infatti viene segnalato l'errore timeout exceeded, 
G> Ma "Received:", 
Questi  vengono aggiunti ad  ogni passaggio  (relay, oggi  rari, varie
macchine filtro  anti porcherie assortite) e ne  puoi mettere qualcuno
in partenza per divertirti...
G> "Date:", "Message-ID:" 
Questi credo li possa settare il tuo mailagent in spedizione.
Morale della favola: puoi riscrivere OGNI campo dello header (segreten
di pulcinella).
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione


Effettivamente non e' il massimo della semplicita', infatti esistono 
classi commerciali che semplificano il tutto. Pero' in un paio di righe 
riesci a spedire un'Email:
   String SMTP_SERVER = "server.smtp.del.mio.isp";
   String MAIL_FROM = "
spa...@spamworld.com
";
   String MAIL_TO = "
sfi...@ricevospam.org
";
   String MAIL_SUBJECT = "Buy V!AgR@ N0W!";
   String MAIL_BODY = "Blah blah blah ...";
   Properties props = System.getProperties();
   props.put("mail.smtp.host", SMTP_SERVER);
   Session session = Session.getDefaultInstance(props, null);
   Message msg = new MimeMessage(session);
   msg.setFrom(new InternetAddress(MAIL_FROM);
   msg.setRecipients(
Message.RecipientType.TO
, 
InternetAddress.parse(MAIL_TO, false));
   msg.setSubject(MAIL_SUBJECT);
   msg.setText(MAIL_BODY);
   msg.setHeader("X-Mailer", "Spam generator for it.comp.java");
   msg.setSentDate(new Date());
   Transport.send(msg);


 di pulcinella).
Puoi inserire qualsiasi header, ma poi sono i mailserves che decidono se 
aggiungerne altri (Per esempio il nome della mailinglist nel subject) o 
rimuovere quelli "fastidiosi" ("X-Face" - Solitamente quelli con il 
prefisso "X-" non vengono toccati). Per esempio l'header "Received:" 
normalmente e' presente piu' volte.
Il mio mailserver inserisce l'utilissimo "X-Spam-Level" (Spamassassin) e 
pure thunderbird si diletta ad aggiungere "X-Mozilla-Status" e robaccia 
varia ...
Oh, sto' divagando :) ...


   Transport.send(msg);
In un paio di righe?! :-)
Ciao
Marco 

 sto provando a mandare una email con telnet tramite java
Non per essere oltremodo noioso, ma tu non stai facendo quello che dici.
Tu stai contattando un server SMTP mandando dei comandi "grezzi" (e lo
stai facendo in Java).
telnet è un programme *e* un protocollo. Non stai usando nessuno dei
due. Il fatto che il programma telnet sia flessibile a sufficienza per
essere usato per instaurare connessioni interattive con altri servizi
(tipo SMTP) è un altro discorso.
-- 
non vincono, non vinceranno, non hanno domani
la forza è nel puntello impugnato da oneste fortissime mani

 In un paio di righe?! :-)
Se vuoi puoi mettere tutto anche su una sola riga :D !


 gli header della email, telnet va in timeout
Non vorrei sbagliarmi, ma hai provato a digitare i comandi direttamente
da telnet? mi sembra che dopo il "." e prima di "quit" ci vadano due
invii?