Como enviar um email usando o servidor MS Exchange

Estou tentando enviar um email usando o servidor de email da minha empresa. Mas estou recebendo a seguinte exceção

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)

Aqui está o meu código de exemplo,

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

Que parte do código está errada? Como nome de usuário e senha, estou usando o endereço de e-mail e a senha da minha empresa.

Resposta 1

O 5.7.1 provavelmente é causado por troca e não pelo seu código. Pode ser necessário ativar a retransmissão no servidor. Para usuários anônimos ou de um determinado endereço IP. Não sou especialista em Exchange, mas já trabalhei antes. Aqui está a última solução que testei que funciona:

Se um erro 5.7.1 for encontrado ao tentar enviar um email via SMTP em um servidor Exchange quando o usuário tiver sido autenticado.

Para ref, o problema que você acabou de ter foi causado por uma configuração no servidor Exchange 2007 - isso normalmente não seria um problema no servidor 2003

Corrigido fazendo abaixo ...

Você pode definir esta configuração de autenticação através da GUI

  • Em Configuração do servidor / Transporte de Hub / Padrão <ServerName>
  • Clique com o botão direito, propriedades, Grupos de Permissões
  • Marque "Usuários anônimos" e clique em OK

Obviamente, os usuários anon não são muito seguros, mas você pode ver se isso resolve o problema.

Resposta: 2

O Mail.jar (versão 1.4.0) tem um problema de compatibilidade com o MS Exchange Server e lança 530 5.7.1 Client was not authenticated, mesmo quando o nome de usuário e a senha estão configurados.

A atualização da API de email para 1.4.4 OU 1.4.7 deve resolver o problema.

A API da Mail 1.4.7 pode ser baixada no seguinte URL: http://www.oracle.com/technetwork/java/javamail/index.html

Resposta: 3

Em algumas empresas, o suporte SMTP do servidor Exchange está desabilitado e você não pode solicitar que eles o habilitem. Nesses casos, uma solução razoável é esta:

http://davmail.sourceforge.net/

Resposta: 4

Eu tive que usar javamail + exchange. As mensagens retornadas foram impotentes. Graças à pilha, recebi algumas dicas.

Adicione isto ao seu código

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

Pense em adicionar os certificados das máquinas usadas também. Para encontrá-los, basta ir ao seu navegador, exportá-los e importar para o arquivo cacerts em uso.

Resposta: 5

Estou tentando depurar o aplicativo java no Visual Studio Code e obtendo o seguinte erro: "Erro: spawn jdb ENOENT". O código Vs está sugerindo a atualização do meu launch.json, que possui o seguinte: {"...

Possível duplicado: escapando dos arquivos de propriedades do sinal de igual Em um arquivo .properties, posso usar o caractere '=' após o primeiro? Assim: url = http: //www.example.org/test= É permitido ...

Estou precisando de um contêiner que possa manipular chaves duplicadas como o multimap C ++. Embora exista uma implementação conhecida no Guava, eu gostaria de algo da API Java padrão. Obrigado em ...

O código a seguir usa o método replace () da classe String em Java. String a = "abc / xyz"; System.out.println (a.replace ("/", "\\")); / na String fornecida a está sendo substituída por \. O mesmo ...