2015-05-27 17 views
5

Przeczytałem i wypróbowałem wszystkie rozwiązania podane w stackoverflow oraz w innych różnych witrynach, ale nadal otrzymuję problem i otrzymuję wyjątek.Uzyskiwanie javax.mail.NoSuchProviderException przy próbie wysyłania poczty za pomocą java

Kod:

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

} 

Kiedy debugowanie kodu, to przestać działać na linii: transport transport = mailSession.getTransport ("SMTP");

I dodano następujące dzbanków:

Mail.jar, pop3.jar, SMTP 1.4.2.jar, activation.jar, additional.jar

Pełny wyjątek:

Wyjątek nici "głównym" javax.mail.NoSuchProviderException: SMTP w javax.mail.Session.getService (Session.java:764) w javax .mail.Session.getTransport (Session.java:689) na javax.mail.Session.getTransport (Session.java:632) na javax.mail.Session.getTransport (Session.java:612) na javax.mail .Session.getTransport (Session.java: 667) na javax.mail.Transport.send0 (Transport.java:154) na javax.mail.Transport.send (Transport.java:80) na JannyaPaid_Device.sendmail.sendEmail (sendmail.java:68) na JannyaPaid_Device.sendmail.main (sendmail.java:26)

również chcę zapytać, czy zapora może zapobiec tej rzeczy do wysyłania poczty? Mamy zainstalowaną zaporę ogniową, ale mogę ręcznie otwierać i wysyłać pocztę Gmaila.

+0

'Transport.send (emailMessage)' wystarczy, aby wysłać wiadomość e-mail, dlaczego chcesz to zrobić? – Babel

+0

Ale jeśli lubię 'Transport transportu = null; \t \t Transport.send (emailMessage); 'następnie również otrzymuje ten sam wyjątek. –

+0

Nie ustawiasz protokołu, który ma być używany Domyślam ustawić poniższy wiersz 'emailProperties.put (" mail.transport.protocol "," smtp ");' – Babel

Odpowiedz

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

Ten sam wyjątek :( –

+0

zaktualizowany kod źródłowy ... działa dla mnie –

+0

Teraz pojawia się nowy błąd typu 'Wyjątek w wątku" główny "java.lang.RuntimeException: javax.mail.SendFailedException: Wysyłanie nie powiodło się; zagnieżdżony wyjątek: \t klasa javax.mail.MessagingException: 530 5.7.0 Najpierw musisz wydać komendę STARTTLS bc14sm16722533pac.6 - gsmtp \t przy sendmail.main (sendmail.java:45) Spowodowany przez: javax.mail.SendFailedException: Wysyłanie nie powiodło się; zagnieżdżony wyjątek: \t klasa javax.mail.MessagingException: 530 5.7.0 Najpierw należy wydać komendę STARTTLS. bc14sm16722533pac.6 - gsmtp \t na javax.mail.Transport.send0 (Transport.java:218) \t na javax.mail.Transport.send (Transport.java:80) \t ' –

2

For - musi wydać polecenie STARTTLS (rozpoczęcie Transport Layer Security), konieczne może być certyfikat w ścieżce (w JDK/JRE) i taka sama po stronie serwera poczty elektronicznej, jak również.

Powiązane problemy