2015-05-27 5 views
5

zu senden Ich habe gelesen und versucht alle Lösung in Stackoverflow und in anderen verschiedenen Websites gegeben, aber immer noch Problem und bekommen Ausnahme.Erhalten von javax.mail.NoSuchProviderException, wenn versuchen, Mail mit Java

Code:

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."); 
} 

} 

Wenn ich Code debuggen, stoppen sie an der Linie arbeiten: Transport Transport = mailSession.getTransport ("smtp");

Ich habe hinzugefügt folgende JAR-Dateien:

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

Volle Ausnahme:

Exception in thread "main" javax.mail.NoSuchProviderException: SMTP- bei javax.mail.Session.getService (Session.java:764) bei javax .mail.Session.getTransport (Session.java:689) bei javax.mail.Session.getTransport (Session.java:632) bei javax.mail.Session.getTransport (Session.java:612) bei javax.mail .Session.getTransport (Session.java:667) bei javax.mail.Transport.send0 (Transport.java:154) bei javax.mail.Transport.send (Transport.java:80) bei JannyaPaid_Device.sendmail.sendEmail (sendmail.java:68) bei JannyaPaid_Device.sendmail.main (sendmail.java:26)

auch ich will, dass die Firewall fragen, kann diese Dinge verhindern Mail zu senden? Da wir eine Firewall installiert haben, kann ich Mail manuell öffnen und versenden.

+0

'Transport.send (emailMessage)' ist genug, um eine Mail zu senden, warum Sie so wollen? – Babel

+0

Aber wenn ich mag 'Transport transport = null; \t \t Transport.send (emailMessage); 'dann auch gleiche Ausnahme. –

+0

Sie setzen Protokoll nicht zu verwenden Ich denke, setzen Sie die untere Zeile 'emailProperties.put (" mail.transport.protocol "," smtp ");' – Babel

Antwort

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

Immer die gleiche Ausnahme :( –

+0

aktualisiert Quellcode ... this funktioniert für mich –

+0

Jetzt bekommen neue Fehler wie 'Ausnahme im Thread" main "java.lang.RuntimeException: javax.mail.SendFailedException: Senden fehlgeschlagen; verschachtelte Ausnahme ist: \t Klasse javax.mail.MessagingException: 530 5.7.0 Muss zuerst einen STARTTLS-Befehl ausgeben bc14sm16722533pac.6 - gsmtp \t bei sendmail.main (sendmail.java:45) verursacht durch: javax.mail.SendFailedException: Senden fehlgeschlagen; verschachtelte Ausnahme: \t Klasse javax.mail.MessagingException: 530 5.7.0 Muss zuerst einen STARTTLS-Befehl ausgeben. bc14sm16722533pac.6 - gsmtp \t bei javax.mail.Transport.send0 (Transport.java:218) \t bei javax.mail.Transport.send (Transport.java:80) \t ' –

2

Für - Muss einen STARTTLS-Befehl ausgeben (Transport Layer Security starten), könnten Sie ein Zertifikat in dem Pfad müssen (in JDK/JRE) und gleichen auf der E-Mail-Server-Seite als auch.

Verwandte Themen