2017-02-14 13 views
0

Я подготовил приложение, которое может отправлять почту через smtp.gmail.com, и это хорошо работает, но когда я запускаю его с помощью докера, я получаю сообщение об ошибке - поскольку он не может подключиться к smtp.gmail.com. Функция отправки почты является:отправка почты используя внешний smtp из контейнера

public void sendEmal(String body, String mailRecipient){ 
    Properties props = new Properties(); 
    props.put("mail.transport.protocol", "smtp"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.port", "465"); 
    try{ 
     Authenticator auth = new SMTPAuthenticator(); 
     Session mailSession = Session.getDefaultInstance(props, auth); 
     mailSession.setDebug(true); 
     Transport transport = mailSession.getTransport(); 

     MimeMessage message = new MimeMessage(mailSession); 
     message.setContent(body, "text/plain"); 
     message.addRecipient(Message.RecipientType.TO, 
     new InternetAddress("mailRecipient")); 

     transport.connect(); 
     transport.sendMessage(message, 
     message.getRecipients(Message.RecipientType.TO)); 
     transport.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 
} 

Это ошибка:

myapp_thirdInst | DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL false

myapp_thirdInst | javax.mail.MessagingException: Unknown SMTP host: smtp.gmail.com;

myapp_thirdInst | nested exception is:

myapp_thirdInst | java.net.UnknownHostException: smtp.gmail.com

myapp_thirdInst | error sending mail

Это первый раз, когда я играю с грузчиком, и после некоторых попыток, он продолжает терпеть неудачу. Я потерялся - может ли кто-нибудь дать мне подсказку, чтобы решить эту проблему?

+0

Можете ли вы разместить свое изображение на карте контейнера? Я видел сверхмалые в прошлом, которые были построены на вершине контейнера с uclibc в качестве библиотеки распознавателей, и это было полностью ошибочно, оно не получило бы 90 из 100 запросов DNS, но работало беспорядочно – Chunko

ответ

0

Первое, что вам нужно сделать, это заставить DNS работать! Сначала проверьте контейнер DNS с помощью оболочки, получите эту работу, а затем ваш SMTP-код может работать.

Возможно, вы можете обновить свой вопрос, указав информацию о вашей настройке DNS.

+0

точно, спасибо !!! Я добавил хост dns к моему докер-компиляции, и он начал работать :). Теперь я изучаю способ динамического получения динамических данных хоста, поскольку я хочу запускать это приложение на разных хостах без необходимости устанавливать ip вручную ... Наверное, это должно быть возможно ?? –

+0

Обычно docker создает конфигурацию DNS (resol.conf) в подкаталоге в/var/lib/docker для каждого контейнера и создает сопоставление томов для сопоставления этого файла с /etc/resolve.conf внутри контейнера. Не уверен, почему это не сработает, но вы можете сделать это вручную, добавив флаги докеров '-v /etc/resolv.conf:/etc/resolve.conf', которые, как я полагаю, вы можете добавить в файл компоновки в «объемы». Это может помочь: https://github.com/docker/docker/issues/23910 – Chunko

+0

Спасибо Чунко, очень интересный пост! Прочитав это, конклуссия, похоже, «вы можете сделать это таким образом, но это не идеальное решение, и ему нужны ручные вещи». Тогда, если я хочу, чтобы мое приложение полностью не содержало ручной настройки, я должен реализовать собственный DNS-сервер в отдельном контейнере? Я предполагаю, что таким образом мне не нужны хосты dns, и тогда вся конфигурация не понадобится при каждом запуске контейнера. –