2015-05-27 14 views
5

Ho letto e provato tutte le soluzioni fornite in stackoverflow e in altri vari siti, ma continuano ad avere problemi e ad ottenere delle eccezioni.Ottenere javax.mail.NoSuchProviderException quando provo a inviare la posta usando java

Codice:

import java.util.Properties; 

import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class sendmail { 

Properties emailProperties; 
Session mailSession; 
MimeMessage emailMessage; 

public static void main(String args[]) throws AddressException, 
     MessagingException { 

    sendmail javaEmail = new sendmail(); 

    javaEmail.setMailServerProperties(); 
    javaEmail.createEmailMessage(); 
    javaEmail.sendEmail(); 
} 

public void setMailServerProperties() { 

    String emailPort = "587";//gmail's smtp port 

    emailProperties = System.getProperties(); 
    emailProperties.put("mail.smtp.port", emailPort); 
    emailProperties.put("mail.smtp.auth", "true"); 
    emailProperties.put("mail.smtp.starttls.enable", "true"); 

} 

public void createEmailMessage() throws AddressException, 
     MessagingException { 
    String[] toEmails = { "[email protected]" }; 
    String emailSubject = "Java Email"; 
    String emailBody = "This is an email sent by JavaMail api."; 

    mailSession = Session.getDefaultInstance(emailProperties, null); 
    emailMessage = new MimeMessage(mailSession); 

    for (int i = 0; i < toEmails.length; i++) { 
     emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i])); 
    } 

    emailMessage.setSubject(emailSubject); 
    emailMessage.setContent(emailBody, "text/html");//for a html email 
    //emailMessage.setText(emailBody);// for a text email 

} 

public void sendEmail() throws AddressException, MessagingException { 

    String emailHost = "smtp.gmail.com"; 
    String fromUser = "emailid";//just the id alone without @gmail.com 
    String fromUserEmailPassword = "test"; 

    Transport transport = mailSession.getTransport("smtp"); 

    transport.connect(emailHost, fromUser, fromUserEmailPassword); 
    transport.sendMessage(emailMessage, emailMessage.getAllRecipients()); 
    transport.close(); 
    System.out.println("Email sent successfully."); 
} 

} 

Quando il debug del codice, è smettere di lavorare alla riga: trasporto Trasporti = mailSession.getTransport ("smtp");

ho aggiunto seguenti JAR:

mail.jar, pop3.jar, smtp-1.4.2.jar, activation.jar, additional.jar

eccezione completa:

Exception in thread "main" javax.mail.NoSuchProviderException: smtp a javax.mail.Session.getService (Session.java:764) a javax .mail.Session.getTransport (Session.java:689) all'indirizzo javax.mail.Session.getTransport (Session.java:632) all'indirizzo javax.mail.Session.getTransport (Session.java:612) su javax.mail .Session.getTransport (Session.java:667) all'indirizzo javax.mail.Transport.send0 (Transport.java:154) all'indirizzo javax.mail.Transport.send (Transport.java:80) su JannyaPaid_Device.sendmail.sendEmail (sendmail.java:68) a JannyaPaid_Device.sendmail.main (sendmail.java:26)

anche io voglio chiedere che il firewall può impedire queste cose per inviare la posta? Dato che abbiamo installato qualche firewall, ma sono in grado di aprire e inviare mail thrugh gmail manualmente.

+0

'Transport.send (emailMessage)' è sufficiente per inviare la posta perché si desidera fare in questo modo? – Babel

+0

Ma se mi piace 'Transport transport = null; \t \t Transport.send (emailMessage); 'inoltre ottiene la stessa eccezione. –

+0

Non si sta impostando il protocollo da utilizzare, suppongo di aver impostato la seguente riga 'emailProperties.put (" mail.transport.protocol "," smtp ");' – Babel

risposta

5
import java.util.Properties; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class SendMailTLS { 

public static void main(String[] args) { 

    final String username = "[email protected]"; 
    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", "587"); 

    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("[email protected]")); 
     message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse("[email protected]")); 
     message.setSubject("Testing Subject"); 
     message.setText("Dear Mail Crawler," 
      + "\n\n No spam to my email, please!"); 

     Transport.send(message); 

     System.out.println("Done"); 

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

}

+0

Ottenere la stessa eccezione :( –

+0

codice sorgente aggiornato ... questo sta funzionando per me –

+0

Ora ricevo un nuovo errore come "eccezione nel thread" principale "java.lang.RuntimeException: javax.mail.SendFailedException: invio non riuscito; l'eccezione nidificata è: \t classe javax.mail.MessagingException: 530 5.7.0 È necessario prima emettere un comando STARTTLS. Bc14sm16722533pac.6 - gsmtp \t all'indirizzo sendmail.main (sendmail.java:45) causato da: javax.mail.SendFailedException: invio fallito; eccezione nidificata: \t classe javax.mail.MessagingException: 530 5.7.0 È necessario prima emettere un comando STARTTLS. bc14sm16722533pac.6 - gsmtp \t a javax.mail.Transport.send0 (Transport.java:218) \t a javax.mail.Transport.send (Transport.java:80) \t ' –

2

Per - deve emettere un comando STARTTLS (inizio Transport Layer Security), potrebbe essere necessario un certificato nel percorso (in JDK/JRE) e lo stesso sul lato server e-mail pure.