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

Я пытаюсь использовать Bill the Lizard's код для отправки электронной почты с помощью 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;

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


person Sergio del Amo    schedule 22.12.2008    source источник


Ответы (6)


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

Я удалил j2ee.jar из пути к классам и загрузил JavaMail 1.4.1 и поместил в свой путь к классам два банки, smtp.jar и mailapi.jar. Теперь я использую smtps вместо smtp

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

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

person Sergio del Amo    schedule 22.12.2008

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

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"); 
person Rupal K    schedule 21.04.2012
comment
вроде бы толково, но зачем с 25 портом возиться? он в основном всегда блокируется интернет-провайдерами и через несколько строк фактически сбрасывается до 465 ... - person Anton Kraievyi; 23.04.2012

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

Спасибо!

person Cleber    schedule 02.02.2010
comment
У меня была такая же проблема при использовании 1.4.2, обновление до 1.4.3 не было решением. Не уверен, что проблема в версии. - person theGabyRod; 22.06.2018

Я думаю, что это связано с использованием 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();
}
person Zach Scrivena    schedule 22.12.2008
comment
Я получаю следующее исключение при запуске вашего кода: Исключение в потоке main javax.mail.NoSuchProviderException: Нет провайдера для smtps - person Sergio del Amo; 22.12.2008
comment
Похоже, что файлы ресурсов JavaMail отсутствуют или повреждены (см. java. sun.com/products/javamail/javadocs/javax/mail/Session.html). Внутри mail.jar/META-INF есть копии файлов по умолчанию. - person Zach Scrivena; 22.12.2008

Это сводило меня с ума, и я просто хотел добавить то, что сработало для меня. Мне пришлось обновить свою версию 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();
    }
}
person csheets    schedule 04.10.2012

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

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

https://myaccount.google.com/lesssecureapps

person Balchandar Reddy    schedule 25.09.2017