2011-12-23 45 views
8

He intentado durante días enviar correos desde la aplicación Grails y sin éxito. Estoy usando:JavaMail con MS Exchange: no hay mecanismos de autenticación compatibles con el servidor y el cliente

  • griales 1.3.7
  • electrónico 1.0 del plugin
  • spring-security-core 1.2.6 plugin de
  • Tomcat 7.0.23

Specifficaly estoy tratando de enviar correo con Exchange desde la aplicación implementada en el servidor Tomcat a través del puerto 25 sin autenticación, sin SSL.

He intentado enviar un mensaje con telnet desde la máquina virtual VMWare en la que se implementó la aplicación y se activó.

Esta es mi clase para el envío de correos:

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; 
} 

Esta es seguimiento de la pila de error:

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) 

He leído algunas decenas de mensajes que consideran este tipo de problemas, pero todavía me havent gestionar para resolver el problema. Cualquier ayuda es apreciada.

* EDIT: * ¿Es posible que hay algunos problemas para enviar correos con JavaMail con SMTP del servidor de Exchange cuando no hay autenticación?

+0

Debe configurar todas las propiedades como "mail.smtp.host" en 'Config.groovy' –

+0

@Don Pero cómo saber mi método SendMessage para tomar configuración de correo opciones de Config.groovy? – drago

+0

¿Debo hacer alguna configuración en Tomcat para habilitar el envío de correos electrónicos? – drago

Respuesta

17

Si usted está tratando de conectarse a su servidor de correo sin autenticación, llame al método de conexión que no toman un nombre de usuario y contraseña. Si le pasa un nombre de usuario y una contraseña, cree que realmente desea autenticarse, y dado que no puede encontrar un mecanismo de autenticación que el servidor admita, falla.

+0

¡Gracias esa fue la solución para mi aplicación! Editar: esta es una corrección de error desde javamail 1.4.3 ver https://java.net/projects/javamail/lists/dev/archive/2014-01/message/3 –

+0

Gracias, esto me ahorra mucho, he estado batallando con esto por una semana ahora. ¡Finalmente! –

+0

Gracias.Funcionó para mí Pero es muy estúpido aunque mail.smtps.auth = false, ¿por qué está tratando de conectar el nombre de usuario y la contraseña? – Zafer

3

Bueno, parece que tuve algunos problemas. Al principio, Exchange no estaba configurado correctamente. Y luego parece que he probado todas las configuraciones posibles, pero la correcta. Esto funciona:

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){} 
    } 
} 
} 

La pista final fue la publicación de Bill Shannon. Gracias Bill!

0

aquí está mi solución, tal vez no es la mejor manera, pero funciona para mí ...

en el correo-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> 

y aquí está la configuración:

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

y, finalmente, el código:

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. Compruebe si el servidor al que está accediendo exige una autenticación o no. más sobre esto en el código.

  2. Ponga un correo.depurar en las propiedades para saber qué está pasando exactamente entre su código y el servidor de correo . más sobre esto en el código.

Aquí es un simple código que funciona bien para mí con el servidor de correo de mi empresa:

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

en mi caso, tuve que establecer la propiedad

"mail.smtp.ehlo" 

a "false"

(además de agregar a la configuración de la propiedad "mail.smtp.auth" a "false" que sin embargo parece ser el valor por defecto de acuerdo con this link)

Antes de "mail.smtp.ehlo" a "false" vi la siguiente salida de depuración (habilitado estableciendo la propiedad "mail.debug" a "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 

y luego conseguir el mismo javax.mail.AuthenticationFailedException.

(en este caso, el servidor SMTP fue un año Microsoft)

+1

Tenga cuidado: al configurar el verdadero/falso, '" true "' es diferente de 'true'! (¡Las formas citadas parecen funcionar!). – vektor

+0

mail.smtp.ehlo = falso (no hay necesidad de comillas) funcionó para mí para StreamSets – Jamby

0

Si desea que su aplicación que iniciar sesión en el servidor SMTP (Puesto que usted está proporcionando detalles de autenticación). Sólo cambia

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

a

props.put("mail.smtp.auth", true); 
Cuestiones relacionadas