Pergunta

Eu encontrei várias outras perguntas sobre SO sobre o JavaMail API e enviar e-mails através de um servidor SMTP, mas nenhum deles discutido usando a segurança TLS. Eu estou tentando usar JavaMail para enviar atualizações de status para me através do meu servidor de correio SMTP trabalho, mas requer TLS, e não consigo encontrar qualquer exemplos on-line de como usar JavaMail para acessar um servidor SMTP que requer encriptação TLS. Alguém pode ajudar com isso?

Foi útil?

Solução

Na verdade, temos um código de notificação em nosso produto que usa TLS para enviar e-mail se ele estiver disponível.

Você precisará definir as propriedades Java Mail. Você só precisa do TLS, mas você pode precisar SSL se o seu servidor SMTP usa SSL.

Properties props = new Properties();
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.auth", "true");  // If you need to authenticate
// Use the following if you need SSL
props.put("mail.smtp.socketFactory.port", d_port);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

Você pode então passar isso para uma sessão JavaMail ou qualquer outro reprodutor de sessão como Session.getDefaultInstance(props).

Outras dicas

Boa post, a linha

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

é obrigatória se os usos do servidor SMTP SSL Autenticação , como o servidor SMTP do Gmail faz. No entanto, se o servidor usa autenticação de texto simples sobre TLS , ele não deve estar presente, porque Java correio vai reclamar sobre a conexão sendo texto plano inicial.

Também certifique-se que você está usando a última versão do Java Mail. Recentemente eu usei alguns antigos frascos Java mail de um projeto anterior e não poderia fazer o trabalho de código, porque o processo de login estava falhando. Depois de eu ter atualizado para a última versão do Java Mail, a razão do erro ficou claro: era um javax.net.ssl.SSLHandshakeException, o que não foi jogada na versão antiga do lib

.

As configurações do exemplo acima não funcionaram para o servidor que eu estava usando ( authsmtp.com ) . Eu continuei recebendo este erro:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Eu removi as configurações mail.smtp.socketFactory e tudo funcionou. As definições finais foram este (auth SMTP não foi usado e eu definir a outra parte da porta):

java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");

Basta usar o código a seguir. É realmente útil para enviar e-mail através de Java, e ele funciona:

import java.util.*;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.Provider;
import javax.mail.internet.*;

public class Main {

    public static void main(String[] args) {
            final String username="your@gmail.com";
            final String password="password";
            Properties prop=new Properties();
            prop.put("mail.smtp.auth", "true");
            prop.put("mail.smtp.host", "smtp.gmail.com");
            prop.put("mail.smtp.port", "587");
            prop.put("mail.smtp.starttls.enable", "true");

            Session session = Session.getDefaultInstance(prop,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
          }
        });
          try {
                 String body="Dear Renish Khunt Welcome";
                 String htmlBody = "<strong>This is an HTML Message</strong>";
                 String textBody = "This is a Text Message.";
         Message message = new MimeMessage(session);
         message.setFrom(new InternetAddress("your@gmail.com"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
        message.setSubject("Testing Subject");
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
            message.setText(htmlBody);
                        message.setContent(textBody, "text/html");
            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

}

Com simples Java Correio 5.0.0 (simplejavamail.org) é muito simples e a biblioteca vai cuidar de todas as propriedades de sessão para você.

Aqui está um exemplo usando servidores SMTP do Google:

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .withSubject("hey")
        .withPlainText("We should meet up!")
        .withHTMLText("<b>We should meet up!</b>")
        .buildEmail();

MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS)
        .buildMailer()
        .sendMail(email);

MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS)
        .buildMailer()
        .sendMail(email);

MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL)
        .buildMailer()
        .sendMail(email);

Se tiver de dois fatores de login ligado, você precisa gerar um href="https://security.google.com/settings/security/apppasswords" rel="nofollow noreferrer"> senha específica do aplicativo da sua conta Google.

scroll top