2011-01-13 14 views
11

Estoy tratando de enviar un correo electrónico utilizando el servidor de correo de mi compañía. Pero me estoy haciendo la siguiente excepciónCómo enviar un correo electrónico utilizando el servidor de intercambio MS

Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Client was not authenticated 
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388) 
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583) 
    at javax.mail.Transport.send0(Transport.java:169) 
    at javax.mail.Transport.send(Transport.java:98) 

Aquí está mi código de ejemplo,

Properties props = System.getProperties(); 

// Setup mail server 
props.put("mail.smtp.host", "example.server.com"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.port", "25"); 
// Get session 
//Session session = Session.getDefaultInstance(props, null); 
Session session = Session.getDefaultInstance(props, 
    new javax.mail.Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("username", "password"); 
     } 
    }); 

// Define message 
MimeMessage message = new MimeMessage(session); 

// Set the from address 
message.setFrom(new InternetAddress(from)); 

// Set the to address 
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 

// Set the subject 
message.setSubject("Hello JavaMail"); 

// Set the content 
message.setText("Welcome to JavaMail"); 

// Send message 
Transport.send(message); 

Qué pedazo de código es incorrecto? Como nombre de usuario y contraseña, estoy usando la dirección de correo electrónico y la contraseña de mi empresa.

Respuesta

6

El 5.7.1 es probablemente causado por el intercambio y no su código. Es posible que solo necesite habilitar la retransmisión en el servidor. Ya sea para usuarios anónimos o desde cierta dirección IP. No soy un experto en Exchange pero lo he hecho antes. Esta es la última solución He probado que funciona:

Si se encuentra un error 5.7.1 al intentar enviar un correo electrónico a través de SMTP en un servidor de intercambio cuando el usuario ha sido autenticado ..

Por ref el tema acababas fue causado por una configuración en el servidor de Exchange 2007 - esto normalmente no sería un problema en el servidor

fijo al hacer a continuación ... 2003

puede establecer esta configuración a través de la interfaz gráfica de usuario de autenticación

  • En Configuración del servidor/concentrador de transporte/Defecto <ServerName>
  • clic derecho, propiedades, Grupos de Permisos
  • Verificar "usuarios anónimos" y haga clic en

Obviamente usuarios OK Anon no es demasiado seguro, pero podrías ver si esto resuelve el problema.

+0

es posible que mi administrador de TI puede crear un usuario de prueba en el servidor de intercambio y que puedo usar para enviar correos electrónicos? – user509755

+0

No veo por qué no. Mi aplicación web se ejecuta imitando a un usuario de dominio que es lo que se conecta con el servidor de intercambio. No sé demasiado sobre el intercambio, pero el último sitio en el que se instaló la aplicación tuvo que permitir la retransmisión a través de smtp desde el servidor web. después de esto dejé de obtener errores 5.7.1. si no puedes hacer un solo usuario, entonces deberías poder hacer una sola máquina al menos. Aquí hay información sobre un problema con un único usuario que no puede retransmitir y tiene alguna información interesante http://social.technet.microsoft.com/Forums/en-US/exchangesvrtransport/thread/1a84a06a-f1c8-40b4-ace8 -1e264f218aa1/ – WraithNath

+0

Creo que el área que necesita buscar es 'Recibir conectores' – WraithNath

1

Tuve que usar javamail + exchange. Los mensajes devueltos fueron impotentes. Gracias a la pila, obtuve algunos consejos.

añadir esto a su código

props.put("mail.smtp.starttls.enable","true"); 

Piense en la adición de los certificados de las máquinas utilizadas también. Para encontrarlos, solo vaya a su navegador, expórtelos e importe al archivo de cacerts en uso.

0

favor utilice las siguientes partes de código en lugar de Transport.send(message);

MimeMessage message = new MimeMessage(session); 

message.saveChanges(); 
Transport transport = session.getTransport("smtp"); 
transport.connect(host, "user", "pwd"); 
transport.sendMessage(message, message.getAllRecipients()); 
transport.close(); 

he probado en el local y se está trabajando

+0

El método 'Transport.send (mensaje)' incluye 'message.saveChanges()', 'transport.connect', ' transport.sendMessage' y 'transporte.close' así que no creo que deba hacerlo otra vez yo mismo. – omerhakanbilici

2

En algunas empresas, el apoyo SMTP del servidor de Exchange es desactivar y no se les puede pedir para habilitarlo. En estos casos, una solución razonable es éste:

http://davmail.sourceforge.net/

1

Simple Java Mail trabajó para mí.La única cosa que tienes que comprobar es la correcta nombre de host, nombre de usuario , puerto y contraseña TransportStrategy.SMTP_TLS:

new Mailer(host, port, username, password, TransportStrategy.SMTP_TLS).sendMail(email); 
+0

@zeddam ¿Es ese código abierto para usar? – Sundhar

2

mail.jar (versión 1.4.0) tiene un problema de compatibilidad con MS Exchange Servidor y arroja 530 5.7.1 Client was not authenticated, incluso cuando el nombre de usuario y la contraseña están configurados.

La actualización de la API de correo a 1.4.4 O 1.4.7 debería resolver el problema. 1.4.7 se puede descargar

de correo API desde la siguiente URL: http://www.oracle.com/technetwork/java/javamail/index.html

1

Cuando voy a utilizar un servidor SMTP MS Exhange para enviar un correo electrónico, que utiliza la dependencia Maven anteriormente.

<dependency> 
    <groupId>com.microsoft.ews-java-api</groupId> 
    <artifactId>ews-java-api</artifactId> 
    <version>2.0</version> 
</dependency> 

Por esa razón, creé una clase que representa un cliente de correo electrónico para servidores MS Exchange. Yo uso log4j para el registro.

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency> 

Por debajo de la clase de cliente MS Exchange (utilizo el Builder para la construcción del objeto para el hilo de seguridad),

import java.net.URI; 
import java.net.URISyntaxException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import microsoft.exchange.webservices.data.core.ExchangeService; 
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; 
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; 
import microsoft.exchange.webservices.data.core.service.item.EmailMessage; 
import microsoft.exchange.webservices.data.credential.ExchangeCredentials; 
import microsoft.exchange.webservices.data.credential.WebCredentials; 
import microsoft.exchange.webservices.data.property.complex.MessageBody; 
import org.apache.log4j.Logger; 

/** 
* A client to connect to a MS Exchange SMTP Server. 
*/ 
public final class ExchangeClient { 

    private static final Logger LOGGER = Logger.getLogger(ExchangeClient.class); 

    private final String hostname; 
    private final ExchangeVersion exchangeVersion; 
    private final String domain; 
    private final String username; 
    private final String password; 
    private final String subject; 
    private final String recipientTo; 
    private final List<String> recipientCc; 
    private final List<String> recipientBcc; 
    private final List<String> attachments; 
    private final String message; 

    private ExchangeClient(ExchangeClientBuilder builder) { 
     this.hostname = builder.hostname; 
     this.exchangeVersion = builder.exchangeVersion; 
     this.domain = builder.domain; 
     this.username = builder.username; 
     this.password = builder.password; 
     this.subject = builder.subject; 
     this.recipientTo = builder.recipientTo; 
     this.recipientCc = builder.recipientCc; 
     this.recipientBcc = builder.recipientBcc; 
     this.attachments = builder.attachments; 
     this.message = builder.message; 
    } 

    public static class ExchangeClientBuilder { 

     private String hostname; 
     private ExchangeVersion exchangeVersion; 
     private String domain; 
     private String username; 
     private String password; 
     private String subject; 
     private String recipientTo; 
     private List<String> recipientCc; 
     private List<String> recipientBcc; 
     private List<String> attachments; 
     private String message; 

     public ExchangeClientBuilder() { 
      this.exchangeVersion = ExchangeVersion.Exchange2010_SP1; 
      this.hostname = ""; 
      this.username = ""; 
      this.password = ""; 
      this.subject = ""; 
      this.recipientTo = ""; 
      this.recipientCc = new ArrayList<>(0); 
      this.recipientBcc = new ArrayList<>(0); 
      this.attachments = new ArrayList<>(0); 
      this.message = ""; 
     } 

     /** 
     * The hostname of the Exchange Web Service. It will be used for 
     * connecting with URI https://hostname/ews/exchange.asmx 
     * 
     * @param hostname the hostname of the MS Exchange Smtp Server. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder hostname(String hostname) { 
      this.hostname = hostname; 
      return this; 
     } 

     /** 
     * The Exchange Web Server version. 
     * 
     * @param exchangeVersion the Exchange Web Server version. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder exchangeVersion(ExchangeVersion exchangeVersion) { 
      this.exchangeVersion = exchangeVersion; 
      return this; 
     } 

     /** 
     * The domain of the MS Exchange Smtp Server. 
     * 
     * @param domain the domain of the Active Directory. The first part of 
     * the username. For example: MYDOMAIN\\username, set the MYDOMAIN. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder domain(String domain) { 
      this.domain = domain; 
      return this; 
     } 

     /** 
     * The username of the MS Exchange Smtp Server. The second part of the 
     * username. For example: MYDOMAIN\\username, set the username. 
     * 
     * @param username the username of the MS Exchange Smtp Server. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder username(String username) { 
      this.username = username; 
      return this; 
     } 

     /** 
     * The password of the MS Exchange Smtp Server. 
     * 
     * @param password the password of the MS Exchange Smtp Server. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder password(String password) { 
      this.password = password; 
      return this; 
     } 

     /** 
     * The subject for this send. 
     * 
     * @param subject the subject for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder subject(String subject) { 
      this.subject = subject; 
      return this; 
     } 

     /** 
     * The recipient for this send. 
     * 
     * @param recipientTo the recipient for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientTo(String recipientTo) { 
      this.recipientTo = recipientTo; 
      return this; 
     } 

     /** 
     * You can specify one or more email address that will be used as cc 
     * recipients. 
     * 
     * @param recipientCc the first cc email address. 
     * @param recipientsCc the other cc email address for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientCc(String recipientCc, String... recipientsCc) { 
      // Prepare the list. 
      List<String> recipients = new ArrayList<>(1 + recipientsCc.length); 
      recipients.add(recipientCc); 
      recipients.addAll(Arrays.asList(recipientsCc)); 
      // Set the list. 
      this.recipientCc = recipients; 
      return this; 
     } 

     /** 
     * You can specify a list with email addresses that will be used as cc 
     * for this email send. 
     * 
     * @param recipientCc the list with email addresses that will be used as 
     * cc for this email send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientCc(List<String> recipientCc) { 
      this.recipientCc = recipientCc; 
      return this; 
     } 

     /** 
     * You can specify one or more email address that will be used as bcc 
     * recipients. 
     * 
     * @param recipientBcc the first bcc email address. 
     * @param recipientsBcc the other bcc email address for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientBcc(String recipientBcc, String... recipientsBcc) { 
      // Prepare the list. 
      List<String> recipients = new ArrayList<>(1 + recipientsBcc.length); 
      recipients.add(recipientBcc); 
      recipients.addAll(Arrays.asList(recipientsBcc)); 
      // Set the list. 
      this.recipientBcc = recipients; 
      return this; 
     } 

     /** 
     * You can specify a list with email addresses that will be used as bcc 
     * for this email send. 
     * 
     * @param recipientBcc the list with email addresses that will be used 
     * as bcc for this email send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientBcc(List<String> recipientBcc) { 
      this.recipientBcc = recipientBcc; 
      return this; 
     } 

     /** 
     * You can specify one or more email address that will be used as cc 
     * recipients. 
     * 
     * @param attachment the first attachment. 
     * @param attachments the other attachments for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder attachments(String attachment, String... attachments) { 
      // Prepare the list. 
      List<String> attachmentsToUse = new ArrayList<>(1 + attachments.length); 
      attachmentsToUse.add(attachment); 
      attachmentsToUse.addAll(Arrays.asList(attachments)); 
      // Set the list. 
      this.attachments = attachmentsToUse; 
      return this; 
     } 

     /** 
     * You can specify a list with email attachments that will be used for 
     * this email send. 
     * 
     * @param attachments the list with email attachments that will be used 
     * for this email send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder attachments(List<String> attachments) { 
      this.attachments = attachments; 
      return this; 
     } 

     /** 
     * The body of the email message. 
     * 
     * @param message the body of the email message. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder message(String message) { 
      this.message = message; 
      return this; 
     } 

     /** 
     * Build a mail. 
     * 
     * @return an EmailApacheUtils object. 
     */ 
     public ExchangeClient build() { 
      return new ExchangeClient(this); 
     } 
    } 

    public boolean sendExchange() { 
     // The Exchange Server Version. 
     ExchangeService exchangeService = new ExchangeService(exchangeVersion); 

     // Credentials to sign in the MS Exchange Server. 
     ExchangeCredentials exchangeCredentials = new WebCredentials(username, password, domain); 
     exchangeService.setCredentials(exchangeCredentials); 

     // URL of exchange web service for the mailbox. 
     try { 
      exchangeService.setUrl(new URI("https://" + hostname + "/ews/Exchange.asmx")); 
     } catch (URISyntaxException ex) { 
      LOGGER.error("An exception occured while creating the uri for exchange service.", ex); 
      return false; 
     } 

     // The email. 
     EmailMessage emailMessage; 
     try { 
      emailMessage = new EmailMessage(exchangeService); 
      emailMessage.setSubject(subject); 
      emailMessage.setBody(MessageBody.getMessageBodyFromText(message)); 
     } catch (Exception ex) { 
      LOGGER.error("An exception occured while setting the email message.", ex); 
      return false; 
     } 

     // TO recipient. 
     try { 
      emailMessage.getToRecipients().add(recipientTo); 
     } catch (ServiceLocalException ex) { 
      LOGGER.error("An exception occured while sstting the TO recipient(" + recipientTo + ").", ex); 
      return false; 
     } 

     // CC recipient. 
     for (String recipient : recipientCc) { 
      try { 
       emailMessage.getCcRecipients().add(recipient); 
      } catch (ServiceLocalException ex) { 
       LOGGER.error("An exception occured while sstting the CC recipient(" + recipient + ").", ex); 
       return false; 
      } 
     } 

     // BCC recipient 
     for (String recipient : recipientBcc) { 
      try { 
       emailMessage.getBccRecipients().add(recipient); 
      } catch (ServiceLocalException ex) { 
       LOGGER.error("An exception occured while sstting the BCC recipient(" + recipient + ").", ex); 
       return false; 
      } 
     } 

     // Attachements. 
     for (String attachmentPath : attachments) { 
      try { 
       emailMessage.getAttachments().addFileAttachment(attachmentPath); 
      } catch (ServiceLocalException ex) { 
       LOGGER.error("An exception occured while setting the attachment.", ex); 
       return false; 
      } 
     } 

     try { 
      emailMessage.send(); 
      LOGGER.debug("An email is send."); 
     } catch (Exception ex) { 
      LOGGER.error("An exception occured while sending an email.", ex); 
      return false; 
     } 

     return true; 
    } 

} 

Un ejemplo de trabajo,

// import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; 
ExchangeClient client = new ExchangeClient.ExchangeClientBuilder() 
     .hostname("webmail.domainOfWeb.com") 
     .exchangeVersion(ExchangeVersion.Exchange2010) 
     .domain("ActiveDirectoryDomain") 
     .username("ActiveDirectoryUsername") 
     .password("ActiveDirectoryPassword") 
     .recipientTo("[email protected]") 
     .recipientCc("[email protected]") // Ignore it in case you will not use Cc recipients. 
     .recipientBcc("[email protected]") // Ignore it in case you will not use Bcc recipients. 
     .attachments("/home/username/image.png") // Ignore it in case you will not use attachements. 
     .subject("Test Subject") 
     .message("Test Message") 
     .build(); 
client.sendExchange(); 
Cuestiones relacionadas