2011-04-12 1 views
1

J'essaie de m'envoyer un email en utilisant l'API javamail. J'ai suivi le code correctement que j'ai trouvé en ligne mais je n'arrive pas à le faire fonctionner. L'erreur que j'obtiens est:Problème d'envoi de courrier avec javamail

Exception in thread "main" javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client 

Cela signifie-t-il que mon ordinateur ne prend pas en charge l'authentification?

public class Emails 
{ 
    public static void main(String[] args) throws MessagingException 
    { 
     Emails e = new Emails(); 
     e.sendMail(); 
    } 

    public void sendMail() throws MessagingException 
    { 
     boolean debug = false; 
     String subject = "Testing"; 
     String message = "Testing Message"; 
     String from = "[email protected]"; 
     String[] recipients = {"[email protected]"}; 

     // create some properties and get the default Session 
     Session session = getSession(); 
     session.setDebug(debug); 

     // create a message 
     Message msg = new MimeMessage(session); 

     // set the from and to address 
     InternetAddress addressFrom = new InternetAddress(from); 
     msg.setFrom(addressFrom); 

     InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
     for (int i = 0; i < recipients.length; i++) 
     { 
      addressTo[i] = new InternetAddress(recipients[i]); 
     } 
     msg.setRecipients(Message.RecipientType.TO, addressTo); 

     // Optional : You can also set your custom headers in the Email if you Want 
     msg.addHeader("MyHeaderName", "myHeaderValue"); 

     // Setting the Subject and Content Type 
     msg.setSubject(subject); 
     msg.setContent(message, "text/plain"); 
     Transport.send(msg); 
    } 

    private Session getSession() 
    { 
     Authenticator authenticator = new Authenticator(); 

     Properties properties = new Properties(); 
     properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName()); 
     properties.setProperty("mail.smtp.auth", "true"); 

     properties.setProperty("mail.smtp.host", "smtp.examplehost.com"); 
     properties.setProperty("mail.smtp.port", "25"); 

     return Session.getInstance(properties, authenticator); 
    } 

    private class Authenticator extends javax.mail.Authenticator 
    { 
     private PasswordAuthentication authentication; 

     public Authenticator() 
     { 
      String username = "myusername"; 
      String password = "mypassword"; 
      authentication = new PasswordAuthentication(username, password); 
     } 

     protected PasswordAuthentication getPasswordAuthentication() 
     { 
      return authentication; 
     } 
    } 
} 

Quand j'envoyer des e-mails de ce serveur, ce que je dois faire est, connectez-vous via ssh sur le serveur (login.server.com etc.), je peux envoyer des e-mails à partir du serveur de messagerie (smtp.server .com etc.). Je dois imiter ce en java

RÉSOLU: Utilisez l'envoyer en fait la classe email SMTPSSLTransport

Répondre

-3

SMTPSSLTransport a résolu le problème

+0

Pourriez-vous montrer votre code pour la résolution? –

+0

Je ne suis pas sûr de savoir ce que "SMTPSSLTransport a résolu le problème" signifie. Comment spécifiez-vous cette classe (par opposition aux autres classes)? Nous avons le même problème, et cela fonctionne quand nous nous connectons à Gmail avec SSL; mais se connecter au serveur MS Exchange, ce n'est pas le cas. – fool4jesus

+1

@JPC Je viens de trouver cela via une recherche Google pour la même erreur que vous receviez à l'origine. Vous devriez vraiment fournir plus de détails lorsque vous trouvez une solution.Si vous pouvez demander de l'aide, vous devez également être prêt à fournir de l'aide. – Greg

1

Assurez-vous que vous avez un serveur smtp (smtp.examplehost.com). Assurez-vous que votre serveur SMTP permet à "[email protected]" d'envoyer des emails.

Voici quelques-unes des vérifications de sécurité mises en place par les serveurs SMTP standards.

+1

Donc, en général, quand je veux envoyer un e-mail de cette serveur, je dois me connecter via SSH (login.server.com). Une fois connecté, le serveur sortant est un serveur smtp.server.com. Je pense que je dois imiter cela dans Java – JPC

1

Il s'agit probablement d'un mauvais port. Je suppose que vous utilisez protocole IMAP: Pour IMAP sur SSL, vous devez vous connecter à Port 993

+0

Afin d'envoyer un e-mail à partir du serveur, je dois me connecter via SSH (login.server.com). Une fois que je suis connecté, le serveur sortant est un smtp.server.com sur le port 25. Comment puis-je imiter cela dans Java? – JPC

2

J'ai eu le même problème et pour une fois n'a pas trouvé la réponse sur StackOverflow. La réponse de JPC @ fournit cependant une (très petite) idée. À partir de javamail 1.4.3 (? Voir les références), javamail refusera d'envoyer des informations d'identification en texte brut sur un canal non crypté. L'activation du transport TLS est donc une solution. Une autre solution consiste à essayer une autre méthode d'authentification, si elle est prise en charge par le serveur, telle que NTLM ou SASL. Une autre solution est de revenir à JavaMail 1.4.1, qui n'a aucun problème à envoyer des informations d'identification en clair. L'avantage de ceci est que votre code ne doit pas changer. Le code dans la question fonctionnerait sans problème. L'inconvénient est évidemment que vous envoyez des informations d'identification en clair, mais si votre administrateur Exchange le permet ... Dans mon cas, le serveur de messagerie ne supporte pas TLS, donc je n'avais pas d'autre choix.

Références:

Questions connexes