Сначала необходимо ввести команду STARTTLS. Отправка электронной почты с помощью Java и Google Apps

Я пытаюсь использовать Код Билла Ящерицы для отправки электронной почты с помощью Google Apps. Я получаю эту ошибку:

Exception in thread "main" javax.mail.SendFailedException: Sending failed;
  nested exception is: 
    javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74

    at javax.mail.Transport.send0(Transport.java:219)
    at javax.mail.Transport.send(Transport.java:81)
    at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.java:81)
    at SendMailUsingAuthentication.main(SendMailUsingAuthentication.java:44)

Код Билла содержит следующую строку, которая, похоже, связана с ошибкой:

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

Однако это не помогает.

Это мои операторы импорта:

import java.util.Properties; 
import javax.mail.Authenticator;
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;

Кто-нибудь знает об этой ошибке?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
20
0
93 092
6

Ответы 6

Я думаю, это связано с использованием SMTPS вместо SMTP для почтового транспорта. Вот другая версия, созданная по образцу JavaMail: часто задаваемые вопросы о доступе к Gmail. Обратите внимание, что для ясности я опустил всю обработку исключений более тонкого уровня.

private static void send(
        final String username,
        final String password,
        final String recipients,
        final String subject,
        final String body)
        throws Exception
{
    final Session session = Session.getInstance(System.getProperties(), null);
    final Message msg = new MimeMessage(session);
    final String senderEmail = username.contains("@") ? username : (username + "@gmail.com");
    msg.setFrom(new InternetAddress(senderEmail));

    final Address[] recipientAddresses = InternetAddress.parse(recipients);
    msg.setRecipients(Message.RecipientType.TO, recipientAddresses);

    msg.setSentDate(new Date());
    msg.setSubject(subject);
    msg.setText(body);

    final Transport transport = session.getTransport("smtps");
    transport.connect(GMAIL_SMTP_HOST, GMAIL_SMTP_PORT, username, password);
    transport.sendMessage(msg, recipientAddresses);
    transport.close();
}

Я получаю следующее исключение при выполнении вашего кода: Исключение в потоке "main" javax.mail.NoSuchProviderException: Нет поставщика для smtps

Sergio del Amo 22.12.2008 15:59

Похоже, файлы ресурсов JavaMail отсутствуют или повреждены (см. java.sun.com/products/javamail/javadocs/javax/mail/Session.h‌ tml). Внутри mail.jar / META-INF есть копии файлов по умолчанию.

Zach Scrivena 22.12.2008 16:11

Я нашел проблему. Раньше я использовал j2ee.jar для импорта javax.mail.

Я удалил j2ee.jar из пути к классам, загрузил JavaMail 1.4.1 и поместил в свой путь к классам два jar-файла, smtp.jar и mailapi.jar. Сейчас использую smtps вместо smtp

Transport transport = session.getTransport("smtps");            

Теперь код Билла Ящера работает.

Это версия java mail API. Я столкнулся с этой проблемой и только что обновил API почты Java до версии 1.4.3. Он отлично работает для меня!

Спасибо!

У меня была такая же проблема при использовании 1.4.2, обновление до 1.4.3 не было решением. Не уверен, что проблема в версии.

theGabyRod 22.06.2018 17:23

Установите следующие теги. Это будет работать.

props.put("mail.smtp.user","username"); 
props.put("mail.smtp.host", "smtp.gmail.com"); 
props.put("mail.smtp.port", "25"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.EnableSSL.enable","true");

props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");   
props.setProperty("mail.smtp.socketFactory.fallback", "false");   
props.setProperty("mail.smtp.port", "465");   
props.setProperty("mail.smtp.socketFactory.port", "465"); 

вроде бы разумно, а зачем ты с 25 портом возишься? он в основном всегда блокируется интернет-провайдерами и фактически сбрасывается до 465 несколькими строками позже ...

Anton K 23.04.2012 14:37

Это сводило меня с ума, и я просто хотел добавить то, что сработало для меня. Мне пришлось обновить мою версию JavaMail (1.4.5), чтобы это работало - я не уверен, какая версия использовалась раньше.

Когда я обновился до новой версии JavaMail, у меня сработал следующий код (можно раскомментировать строки отладки, чтобы получить дополнительную информацию об отладке - порт был 587, а хост - smtp.gmail.com):

public void sendMailWithAuth(String host, String user, String password, 
    String port, List<String> toList, String htmlBody, 
        String subject) throws Exception {

    Properties props = System.getProperties();

    props.put("mail.smtp.user",user); 
    props.put("mail.smtp.password", password);
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.port", port); 
    //props.put("mail.debug", "true"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.starttls.enable","true"); 
    props.put("mail.smtp.EnableSSL.enable","true");

    Session session = Session.getInstance(props, null);
    //session.setDebug(true);

    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(user));

    // To get the array of addresses
    for (String to: toList) {
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    }

    message.setSubject(subject);
    message.setContent(htmlBody, "text/html");

    Transport transport = session.getTransport("smtp");
    try {
        transport.connect(host, user, password);
        transport.sendMessage(message, message.getAllRecipients());
    } finally {
        transport.close();
    }
}

попробуй это:

включить: разрешить менее безопасные приложения для вашей учетной записи Gmail

https://myaccount.google.com/lesssecureapps

Другие вопросы по теме