JavaMail: MessagingException: получил плохое приветствие с хоста SMTP – Код ошибки 250

Вопрос: Требования: - Разрешено только 1 подключение к почтовому серверу (ограничение от моего клиента). Не закрывайте соединение после отправки почты, повторно отправляйте письма по существующему соединению (более высокая производительность, так как для каждой почты не требуется transport.connect()). - Отправлять все письма по этому соединению - Если соединение не удается, повторно подключите, отправьте почту - Java

Вопрос:

Требования:
– Разрешено только 1 подключение к почтовому серверу (ограничение от моего клиента). Не закрывайте соединение после отправки почты, повторно отправляйте письма по существующему соединению (более высокая производительность, так как для каждой почты не требуется transport.connect()).
– Отправлять все письма по этому соединению
– Если соединение не удается, повторно подключите, отправьте почту
– Java 1.6

Мой код работает хорошо, но иногда я получаю javax.mail.MessagingException с кодом ошибки 250: Got bad greeting from SMTP host. Вложенным исключением является java.net.SocketException: Socket closed:

Вот мой код клиента, строка отмечена, где выбрано исключение:

// the mail service is a singleton and has one property to store the transport // object that gets initialized when the singleton instance gets created: private Transport transport = null; // props, authU, authP and msg are all passed as a parameter to the sending method: if (transport == null) { Session session = Session.getInstance(props, null); transport = session.getTransport(«smtp»); } if(!transport.isConnected()) { transport.connect(authU, authP); // <<<<< This line throws the exception ! } transport.sendMessage(msg, msg.getAllRecipients());

Очевидно, transport.isConnected() обнаруживает никакого соединения, но connection() не открывает или не воссоздает сокет. Мое предположение заключалось в том, что он сделает все необходимое для меня.

Есть ли подходящее клиентское решение, чтобы убедиться, что исключение не выбрасывается? Обходным путем было бы поймать исключение и отправить почту, но мне не нравятся обходные пути…

Лучший ответ:

То, что вы описываете как обходной путь, на самом деле является правильным путем.

Там ничего не мешает серверу отбрасывать соединение между моментом, когда вы вызываете метод isConnected, и временем, когда вы вызываете метод sendMessage, поэтому в худшем случае вы всегда должны быть готовы обработать исключение.

Ответ №1Try this public static void mail(Reporter report) { if(!sendEmail.trim().equalsIgnoreCase(«true»)){ return; } Properties props = new Properties(); props.put(«mail.smtp.auth», «true»); props.put(«mail.smtp.starttls.enable», «true»); props.put(«mail.smtp.host», «smtp.gmail.com»); props.put(«mail.smtp.port», «587»); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress(«from-email@gmail.com»)); if(!bccEmail.trim().isEmpty()){ message.addRecipient(Message.RecipientType.CC, new InternetAddress(bccEmail)); } message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); message.setSubject(» Testing «); message.setText(«automatic email ,»+report); Transport.send(message); System.out.println(«Email Done»); } catch (MessagingException e) { throw new RuntimeException(e); } } }

Оцените статью
Добавить комментарий