2013-03-24 15 views
14

Qual è il problema con questo codice? In qualche modo si sta facendo in un ciclo infinito alla linea linea Transport.send(message);, nessun messaggio di errore, non fa eccezione, proprio ciclo forse infinita (non so perché non mi aspettare più di 5-10 minuti)Invio di e-mail tramite server smtp in JAVA

final String username = "<mail_name>"; 
final String password = "<password>"; 

Properties props = new Properties(); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.host", "smtp.gmail.com"); 
props.put("mail.smtp.port", "465"); 

Session session = Session.getInstance(props, 
     new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
     }); 

try { 

    Message message = new MimeMessage(session); 
    message.setFrom(new InternetAddress("<mail_from>@gmail.com")); 
    message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse("<mail_to>@gmail.com")); 
    message.setSubject("Test Subject"); 
    message.setText("Test"); 

    Transport.send(message); 

    System.out.println("Done"); 

} catch (MessagingException e) { 
    throw new RuntimeException(e); 
} 
+0

Suggerirei di aggiungere un 'catch (Exception e) {}' dopo 'MessagingException', per vedere se viene lanciato qualche altro tipo di eccezione. Aggiungi anche un blocco 'finally'. Si potrebbe anche aggiungere 'log4j.xml' e impostare la classe' javax.mail' su 'DEBUG' per vedere cos'altro potrebbe succedere. – Bizmarck

+0

buoni consigli, grazie! lo testerà – czupe

+0

Sfortunatamente ancora in attesa sulla riga Transport.send (messaggio) ... Qualcuno può convalidare questa correttezza del codice? – czupe

risposta

18

Qui mi sto dando alcuni cambiamenti, che funzionano bene per me:

Session session = Session.getInstance(props,null); 

si crea un'istanza di oggetto messaggio come hai fatto tu. E infine:

Transport transport = session.getTransport("smtp"); 
String mfrom = "[email protected]"// example laabidiraissi 
transport.connect("smtp.gmail.com", mfrom, "thepassword"); 
transport.sendMessage(message, message.getAllRecipients()); 

Edit, sarebbe prego di darmi un favore e copia/incolla e provare questo esempio e mostrare ciò che viene visualizzato:

package com.test; 

import java.util.Properties; 

import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import org.junit.Test; 

public class EmailService { 

@Test 
public void test(){ 
    Properties props = System.getProperties(); 
    props.put("mail.smtp.starttls.enable", true); // added this line 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.user", "username"); 
    props.put("mail.smtp.password", "password"); 
    props.put("mail.smtp.port", "587"); 
    props.put("mail.smtp.auth", true); 



    Session session = Session.getInstance(props,null); 
    MimeMessage message = new MimeMessage(session); 

    System.out.println("Port: "+session.getProperty("mail.smtp.port")); 

    // Create the email addresses involved 
    try { 
     InternetAddress from = new InternetAddress("username"); 
     message.setSubject("Yes we can"); 
     message.setFrom(from); 
     message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail")); 

     // Create a multi-part to combine the parts 
     Multipart multipart = new MimeMultipart("alternative"); 

     // Create your text message part 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText("some text to send"); 

     // Add the text part to the multipart 
     multipart.addBodyPart(messageBodyPart); 

     // Create the html part 
     messageBodyPart = new MimeBodyPart(); 
     String htmlMessage = "Our html text"; 
     messageBodyPart.setContent(htmlMessage, "text/html"); 


     // Add html part to multi part 
     multipart.addBodyPart(messageBodyPart); 

     // Associate multi-part with message 
     message.setContent(multipart); 

     // Send message 
     Transport transport = session.getTransport("smtp"); 
     transport.connect("smtp.gmail.com", "username", "password"); 
     System.out.println("Transport: "+transport.toString()); 
     transport.sendMessage(message, message.getAllRecipients()); 


    } catch (AddressException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MessagingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 
+0

grazie, ma la proprietà mail.smtp.auth è già lì ... E ho provato anche con l'altra porta. – czupe

+0

ah scusa per la proprietà auth, è colpa mia, non l'ho vista. –

+0

se provate con 25 o 587 porte, comunque controllate la vostra soluzione ... Eccezione nel thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Impossibile connettersi all'host SMTP: smtp.gmail.com, porta: 25; l'eccezione nidificata è: \t java.net.ConnectException: Connessione rifiutata: collegare – czupe

1

ho potuto riprodurre il comportamento descritto nella domanda e aggiustalo.

Il metodo send si blocca a

SMTPTransport(Service).connect(String, int, String, String) line: 308 

La connessione non riuscirà perché si ha la porta sbagliata per l'host SMTP di Gmail: 465

cambiamento a 587

props.put("mail.smtp.port", "587"); 

e funzionerà.

+0

yeah , non so perché ho guidato la porta 465, ma comunque, non funziona ancora: ( – czupe

+0

quale eccezione/errore stai ottenendo ora? il tuo java.exe è permesso attraverso il firewall? – A4L

+0

Questo: java.lang.RuntimeException: javax.mail.MessagingException: Impossibile connettersi all'host SMTP: smtp.gmail.com, porta: 25; l'eccezione annidata è: java.net.ConnectException: Connessione rifiutata: connect Ho bloccato l'intero firewall di Windows .. – czupe

3

Ok. E 'un po' più complessa di quanto ho insegnato per la prima volta ... Per summorize quello che ho ottenuto:

  • C'è un comando molto utile: session.setDebug(true);. Se si imposta true, ogni processo importante verrà sottoposto a debug sulla console. Raccomando di usarlo.
  • Il secondo computer può funzionare solo con l'opzione sicura, è possibile cambiare questo con: Transport transport = session.getTransport("smtps"); anziché lo smtp non sicuro ... L'oggetto di trasporto dell'API JavaMail si occuperà anche delle porte (rispettivamente smtp: 587, smtps : 465)
  • È possibile utilizzare anche il metodo statico della classe Transport per l'invio del messaggio e (salvandolo prima, il metodo sendMessage non statico non salverà il messaggio), ma questa volta è necessario utilizzare javax.mail .Autenticatore alla creazione della sessione, come questo:

    Session session = Session.getInstance(props,   new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication("login", "password"); 
        } 
    

    });

1.4.2 JavaMailApi ha un'altra eccezione che 1.4.7 versione per questo problema ...

Se non si usa, non è possibile autenticato con il metodo statico. Se si utilizza il metodo di istanza, è possibile.

  • Un computer è esperto e ha ottenuto la versione 1.4.2 dell'API JavaMail. Il secondo computer ha una libreria scaricata, con la versione 1.4.7, che indovino anche pasticciare con le cose
  • Primo comp Netbeans, secondo comp Intellij ... +1) Ci sono molti vecchi e cattivi codici di esempio su Internet, il che rende più difficile l'uso corretto di questa API.

Così abbastanza incasinato, ma ci sono stati alcuni concetti di base che dovrebbe essere messo a fuoco ...

1

Utilizzando Simple Java Mail dovrebbe essere semplice:

Email email = new Email(); 

email.setFromAddress("lollypop", "[email protected]"); 
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO); 
email.setText("We should meet up!"); 
email.setTextHTML("<b>We should meet up!</b>"); 
email.setSubject("hey"); 

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email); 

Se avete due fattori login trasformato on, devi generare un application specific password dal tuo account Google.