2011-12-23 11 views
8

Ho cercato per giorni di inviare posta dall'applicazione Grails e senza successo. Sto utilizzando:JavaMail con MS Exchange: nessun meccanismo di autenticazione supportato da server e client

  • graal 1.3.7
  • Mail 1.0 del plugin
  • primavera-sicurezza-core 1.2.6 plug
  • Tomcat 7.0.23

Specifficaly Sono provare a inviare posta con Exchange dall'applicazione distribuita sul server Tomcat tramite la porta 25 senza autenticazione, senza SSL.

Ho provato a inviare un messaggio con telnet dalla macchina virtuale VMWare su cui è stata distribuita l'app e ha ottenuto una depressione.

Questa è la mia classe per l'invio di posta elettronica:

public boolean sendMessage(String to, String msgSubject, String msgText) 
{ 
    String host = "mail.mydomain.com"; 
    String username = "[email protected]"; // your authsmtp username 
    String password = "mypassword" // your authsmtp password 
    String from = "[email protected]"; 

    Properties props = System.getProperties(); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.user", username); 
    props.put("mail.smtp.password", password); 
    props.put("mail.smtp.port", "25"); // thish is the port recommended by authsmtp 
    props.put("mail.smtp.auth", "false"); 

    Session session = Session.getDefaultInstance(props, null); 
    MimeMessage message = new MimeMessage(session); 
    message.setFrom(new InternetAddress(from)); 

    InternetAddress to_address = new InternetAddress(to); 
    message.addRecipient(Message.RecipientType.TO, to_address); 

    message.setSubject(msgSubject); 
    message.setText(msgText); 
    Transport transport = session.getTransport("smtp"); 
    transport.connect(host, username, password); 
    transport.sendMessage(message, message.getAllRecipients()); 
    transport.close(); 
    return true; 
} 

Questo è traccia di pila di errore:

javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client 

at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:590) 

at javax.mail.Service.connect(Service.java:291) 

at javax.mail.Service.connect(Service.java:172) 

at javax.mail.Service$connect.call(Unknown Source) 

at org.helpdesk.MymailService.sendMessage(MymailService.groovy:37) 

at org.helpdesk.MymailService$sendMessage.call(Unknown Source) 

at org.helpdesk.RequestController$_closure13.doCall(RequestController.groovy:247) 

at org.helpdesk.RequestController$_closure13.doCall(RequestController.groovy) 

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 

at java.lang.Thread.run(Unknown Source) 

ho letto poche decine di messaggi che considerano i problemi come questo, ma ho ancora havent gestire per risolvere il problema. Qualsiasi aiuto è apprezzato.

* MODIFICA: * È possibile che ci siano dei problemi nell'invio di e-mail utilizzando javaMail con il server SMTP di Exchange quando non c'è l'autenticazione?

+0

È necessario configurare tutte le proprietà come "mail.smtp.host" in 'Config.groovy' –

+0

@Don Ma come dire il mio metodo SendMessage a prendere configurazione della posta elettronica opzioni da Config.groovy? – drago

+0

Devo eseguire alcune configurazioni su Tomcat per abilitare l'invio tramite e-mail? – drago

risposta

17

Se si sta cercando di connettersi al server di posta senza autenticazione, chiamare il metodo di connessione che non prendere un nome utente e una password. Se si passa un nome utente e una password, si pensa che in realtà desidera autenticare e, poiché non riesce a trovare un meccanismo di autenticazione supportato dal server, non riesce.

+0

Grazie è stata la soluzione per la mia applicazione! Modifica: questo è un bugfix dal momento che javamail 1.4.3 vede https://java.net/projects/javamail/lists/dev/archive/2014-01/message/3 –

+0

Grazie, questo mi ha salvato molto, ho combattuto con questo per una settimana ora. Finalmente! –

+0

Grazie.Ha funzionato per me. Ma è molto stupido anche se mail.smtps.auth = false, perché sta cercando di connettere username e password? – Zafer

3

Beh, sembra che abbia avuto pochi problemi. Inizialmente, Exchange non era configurato correttamente. E poi sembra che abbia provato tutte le configurazioni possibili ma quella giusta. Questo funziona:

class MymailService 
{ 
    boolean transactional = false 

    public sendMessage(String to, String cc, String msgSubject, String msgText) 
    { 
     String host = "mail.mailserver.com"; 
     String username = "[email protected]"; 
     String password = "xxx"; 
     String from = "[email protected]"; 
     String port = "25"; 

     Properties props = System.getProperties(); 
     props.put("mail.smtp.host", host); 
     props.put("mail.smtp.port", port); 
     props.put("mail.smtp.auth", "false"); 

     Transport transport = null; 

     try{ 
      Session session = Session.getDefaultInstance(props, null); 
      MimeMessage message = new MimeMessage(session); 
      message.setFrom(new InternetAddress(from)); 

     InternetAddress to_address = new InternetAddress(to); 
     message.addRecipient(Message.RecipientType.TO, to_address); 

     InternetAddress cc_address = new InternetAddress(cc); 
     message.addRecipient(Message.RecipientType.CC, cc_address); 

     message.setSubject(msgSubject); 
     message.setText(msgText); 

     transport = session.getTransport("smtp"); 
     transport.connect(); 
     transport.sendMessage(message, message.getAllRecipients()); 
    } finally { 
     if (transport != null) try { transport.close(); } catch (MessagingException logOrIgnore){} 
    } 
} 
} 

L'ultimo indizio era il post di Bill Shannon. Grazie Bill!

0

Ecco la mia soluzione, forse non è il modo migliore, ma funziona per me ...

nella mail-config.xml:

<bean id="mailSender" class="com.xxx.service.MailSender"> 
    <property name="host" value="${mail.host}" /> 
    <property name="port" value="${mail.port}" /> 
    <property name="protocol" value="${mail.protocol}" /> 
    <property name="defaultEncoding" value="UTF-8" /> 
    <property name="authRequired" value="${mail.auth}" /> 
    <property name="username" value="${mail.username}" /> 
    <property name="password" value="${mail.password}" /> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.smtps.auth">${mail.auth}</prop> 
     </props> 
    </property> 
</bean> 

ed ecco l'impostazione:

mail.from=XXX Team <[email protected]> 
mail.host=exchange.xxx.com 
mail.port=25 
mail.protocol=smtp 
mail.auth=false 
mail.username= 
mail.password= 

e, infine, il codice:

package com.xxx.service; 
import org.springframework.mail.javamail.JavaMailSenderImpl; 

public class MailSender extends JavaMailSenderImpl { 

    private boolean authRequired; 

    @Override 
    public String getUsername() { 
     if (!authRequired) { 
      return null; 
     } 
     return super.getUsername(); 
    } 

    @Override 
    public String getPassword() { 
     if (!authRequired) { 
      return null; 
     } 
     return super.getPassword(); 
    } 

    public boolean isAuthRequired() { 
     return authRequired; 
    } 

    public void setAuthRequired(boolean authRequired) { 
     this.authRequired = authRequired; 
    } 

} 
1
  1. Verificare se il server che si sta colpendo richiede un'autenticazione o no. più su questo nel codice.

  2. Metti una mail.esegui il debug nelle proprietà per sapere cosa accade esattamente tra il tuo codice e il server di posta . più su questo nel codice.

Ecco un semplice codice che funziona bene per me con server di posta della mia azienda:

package com.datereminder.service; 

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 ReminderDaemonService2 { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Properties props = new Properties(); 
     props.put("mail.smtp.host", "mail.mycompany123.com"); 
// this mandates authentication at the mailserver 
     props.put("mail.smtp.auth", "true"); 
// this is for printing debugs 

     props.put("mail.debug", "true"); 

     Session session = Session.getDefaultInstance(props, 
      new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("[email protected]","xxxxxxxxxxx"); 
       } 
      }); 

     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 Friend," + 
        "\n\n This is a Test mail!"); 

      Transport.send(message); 

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

nel mio caso, ho dovuto impostare la proprietà

"mail.smtp.ehlo" 

a "false"

(oltre ad aggiungere all'impostazione della proprietà "mail.smtp.auth" a "false" che però sembra essere l'impostazione predefinita in base alle this link)

Prima di impostare "mail.smtp.ehlo" a "false" ho visto il seguente output di debug (abilitata impostando la proprietà "mail.debug"-"true"):

DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: mechanism LOGIN not supported by server 
DEBUG SMTP: mechanism PLAIN not supported by server 
DEBUG SMTP: mechanism DIGEST-MD5 not supported by server 
DEBUG SMTP: mechanism NTLM not supported by server 

e quindi ottenere lo stesso javax.mail.AuthenticationFailedException.

(in questo caso, il server SMTP è stato un anno di Microsoft)

+1

Fai attenzione: quando si imposta true/false, '" true "' è diverso da 'true'! (Le forme citate sembrano funzionare!). – vektor

+0

mail.smtp.ehlo = false (nessuna necessità di virgolette) ha funzionato per me per StreamSet – Jamby

0

Se ci si vuole l'applicazione che per effettuare il login al server SMTP (Dal momento che si sta fornendo dati di autenticazione). Basta cambiare

props.put("mail.smtp.auth", false); 

a

props.put("mail.smtp.auth", true); 
Problemi correlati