com.sun.mail.util.MailConnectException: Couldn’t connect to host.
каждый раз или иногда?
подключение к разным ящиками?
клиент статический?
клиент использется каждый раз новый?
В своей практике я сталкивался с ситуацией когда environment закрыт firewall и порты для imaps, pop3 и smtp перекрыты. Я разработал методы работы с Gmail API и с их помощью читаю и посылаю сообщения.
Для этого нужно создать application в gmail account и получить StoredCredential client_secret json.
С их помощью я читаю сообщения в реальном времени.
/** Global instance of the Gmail query. */
private static String DELIVERED_TO_AND_SUBJECT_AND_UNREAD = "deliveredto:%s AND subject:%s AND is:unread";
/** Global instance of the Gmail query. */
private static String DELIVERED_TO_AND_SUBJECT = "deliveredto:%s AND subject:%s";
/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT;
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
/** Application name. */
private static final String APPLICATION_NAME = "Gmail User Password Retraction";
/** Global instance of the CLIENT_ID. */
private static final String CLIENT_ID = "me";
/**
* Build and return an authorized Gmail client service.
* @return an authorized Gmail client service
* @throws IOException
*/
public static Gmail getGmailService() throws IOException {
Credential credential = authorize();
return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
}
/**
* List all Messages of the user's mailbox matching the query.
*
* @param service Authorized Gmail API instance.
* @param userId User's email address. The special value "me" can be used to indicate the authenticated user.
* @param query String used to filter the Messages listed.
* @throws IOException
*/
public static List<Message> listMessagesMatchingQuery(Gmail service, String query) throws IOException {
List<Message> messages = new ArrayList<Message>();
long startTime = System.currentTimeMillis();
long endTime = startTime + SeleniumFrameworkProperties.getMailTimeoutWaitInMillieconds();
while (messages.isEmpty() && System.currentTimeMillis() < endTime) {
ListMessagesResponse response = service.users().messages().list(CLIENT_ID).setQ(query).execute();
while (response.getMessages() != null) {
messages.addAll(response.getMessages());
if (response.getNextPageToken() != null) {
String pageToken = response.getNextPageToken();
response = service.users().messages().list(CLIENT_ID).setQ(query).setPageToken(pageToken).execute();
} else {
break;
}
}
}
if(System.currentTimeMillis() > endTime)
log.info("Message search procces interapted after '{}' milliseconds of timeout",SeleniumFrameworkProperties.getMailTimeoutWaitInMillieconds());
return messages;
}
/**
* Send an email from the user's mailbox to its recipient.
*
* @param service Authorized Gmail API instance.
* @param userId User's email address. The special value "me" can be used to indicate the authenticated user.
* @param emailContent Email to be sent.
* @return The sent message
* @throws MessagingException
* @throws IOException
*/
public static Message sendMessage(MimeMessage emailContent) throws MessagingException, IOException {
// Build a new authorized API client service.
Gmail service = getGmailService();
Message message = createMessageWithEmail(emailContent);
message = service.users().messages().send(CLIENT_ID, message).execute();
log.info("Message id: {}", message.getId());
log.info("JSON {}", message.toPrettyString());
return message;
}
/**
* Create a message from an email.
*
* @param emailContent Email to be set to raw of message
* @return a message containing a base64url encoded email
* @throws IOException
* @throws MessagingException
*/
public static Message createMessageWithEmail(MimeMessage emailContent) throws MessagingException, IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
emailContent.writeTo(buffer);
byte[] bytes = buffer.toByteArray();
String encodedEmail = Base64.encodeBase64URLSafeString(bytes);
Message message = new Message();
message.setRaw(encodedEmail);
return message;
}
Так, погодите, вижу что вы используете gmail и задам может быть глупый вопрос: а вы вообще разрешили внутри настроек gmail подключение к почте сторонних приложений? По умолчанию они выключены и при попытке подключиться из кода gmail вам присылает письмо с уведомлением безопасности. Прямо из этого письма есть возможность отключить эту защиту.
Причем если отдельно запускать тесты, без связки, то все работает. Как только добавляется связка парсера номера заказа с почты и затем уже отправка туда сообщений и ответ клиента на них - все, ошибка соединения