2013-05-31 5 views
8

Я пытаюсь настроить свой проект Java, чтобы иметь возможность отправлять электронную почту (через g-mail, если это имеет значение), и я получаю «javax.mail.NoSuchProviderException : Нет провайдера для smtps "каждый раз, когда я пытаюсь запустить следующую строку (которая копирует/вставляет из их примера).javax.mail.NoSuchProviderException: Нет провайдера для smtps

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

Я огляделся и обнаружил, что это, как правило, выбрасывается, потому что не имеет mail.jar включены в пути к классам, но я на самом деле имею mail.jar включены. Поскольку я запускаю JDK 1.6, мне не нужно включать activ.jar в соответствии с FAQ здесь (http://www.oracle.com/technetwork/java/javamail/faq-135477.html#classpath). Кроме того, активация.jar, похоже, не присутствует в версии 1.4.7 javamail.

На всякий случай что-то испортилось, я повторно загрузил весь почтовый индекс с сайта oracle, извлек его и добавил банку свежие (после удаления старой банки), и я все равно получаю ту же ошибку. Какие-нибудь мысли о том, что может быть на данный момент?

EDIT: Вот полный стек трассировки, печатается:

javax.mail.NoSuchProviderException: No provider for smtps 
    at javax.mail.Session.getProvider(Session.java:433) 
    at javax.mail.Session.getTransport(Session.java:627) 
    at javax.mail.Session.getTransport(Session.java:608) 
... my code that calls getTransport() ... 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
... more of my code ... 
    at java.lang.Thread.run(Thread.java:662) 

ответ

7

Таким образом, выясняется, что проблема заключалась в том, что устаревшая версия mail.jar была включена в проект, на который я ссылался, и после обновления этой копии mail.jar проблема была решена.

Для дальнейшего использования, есть ли способ зарегистрировать или обеспечить видимость при таких конфликтах в банке?

https://confluence.atlassian.com/confkb/cannot-send-email-due-to-javax-mail-nosuchproviderexception-smtp-error-154079.html

+0

Спасибо за это обновление. У меня была такая же проблема и та же причина. Моя проблема была решена путем установки javax.mail.jar в начале моего CLASSPATH (я в среде UNIX и использую командную строку). – Hampden123

+0

Мы столкнулись с такой же ситуацией с использованием Java с Wildfly 8. Мы решили эту проблему, включая [smtp] (http://mvnrepository.com/artifact/com.sun.mail/smtp/1.5.4) зависимость от pom.xml, чтобы заставить поставщика для загрузки.Другим решением, которое работало, была настройка почты на администрирование Wildfly и использование @Resource. Однако для последнего подхода требуется конкретная конфигурация сервера приложений. –

4

Убедитесь, что у вас есть javax.mail.jar в вас построить путь. Если вы используете eclipse, вам может потребоваться обновить или щелкнуть правой кнопкой мыши ваш проект в проводнике файлов, выбрать configure build path, добавить внешний JAR и затем добавить его в путь сборки. Send email using java дает рабочий код (я его протестировал) на случай, если вы просто захотите просмотреть свой. Если это не проблема или вы не используете eclipse, трассировка стека была бы хорошей

+0

Я использую Eclipse. Из моего (ограниченного) понимания JDK 1.6 автоматически включает JAF. Разве это не так? – JuniorIncanter

+0

Прости, что я перепутал вещи в голове, когда написал это. Вы должны убедиться, что ** javax.mail.jar ** находится в вашем пути сборки (используйте те же шаги, которые я написал выше). Я только что повторно запустил код электронной почты в приведенной выше ссылке и работает без рамки в моем импорте. –

+0

Это в моем пути построения. Я подтвердил это, щелкнув правой кнопкой мыши по моему проекту (в Eclipse), выбрав «Свойства», выбрав «Путь сборки Java» и, наконец, выбрав «Библиотеки». Я вижу почту. Я также вижу его на вкладке «Заказ и экспорт». Я добавил трассировку стека в случае, если это поможет. – JuniorIncanter

1

JavaMail запрашивает ClassLoader для файла конфигурации, который настраивает поставщиков протокола. Если ClassLoader работает неправильно, JavaMail не сможет найти файл конфигурации. Существует несовместимость между тем, как работает OSGi ClassLoaders и что ожидает JavaMail, что может вызвать эту проблему. Если вы запускаете свое приложение в самом Eclipse, это может объяснить эту проблему. Другой распространенной причиной этой проблемы является импорт файла mail.jar в ваш проект таким образом, что файлы классов извлекаются из файла jar и включаются в ваше приложение, но файлы конфигурации остаются позади.

Попробуйте запустить программу из командной строки с помощью команды «java» и с файлом mail.jar в вашем CLASSPATH.

+0

Пробовал это и подумал, что у него есть шанс, так как это исправлено еще одной проблемой, но в этой ситуации нет кубиков. – JuniorIncanter

+0

Но для справки я запускаю приложение в самом Eclipse. – JuniorIncanter

+0

Если вы можете, попробуйте запустить его за пределами Eclipse. Точно так же «smtp» терпит неудачу? Попробуйте: session.addProvider (новый провайдер (Provider.Type.Transport, "smtps", "com.sun.mail.smtp.SMTPSSLTransport", "", "")); –

0

попробовать

Transport transport = session.getTransport("smtp"); 
3

При использовании почты API убедитесь, что протокол, который вы ожидаете работать? В этом случае вам не хватает smtp.jar с вашим проектом eclipse.

Существует несколько банок для разных протоколов, которые доступны в почтовом сообщении api. EX: dsn.jar, gimap.jar, imap.jar, mailapi.jar, pop3.jar, smtp.jar

+1

Это действительно ответ для многих случаев. Большинство людей будут обновлять javamail и действительно будут работать, но проблема представлена ​​с версией 1.4.7. Версия 1.4.7 нуждается в smtp.jar. Если вы не можете обновить версию javamail, это решение! – nakib

+0

Спасибо nimesh makwana и @nakib. –

5

На всякий случай, если кто-то совершит ту же ошибку, что и у меня: , вы должны использовать строчные буквы для протокола, разрешающего работать. Если вы введете SMTP в качестве имени протокола вместо smtp, вы получите NoSuchProviderException. Скорее всего, он работает одинаково для всех других поставщиков.

0

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

убедитесь, что вы помните, чтобы установить

properties.put("mail.transport.protocol", "smtp")); 

вместо

properties.put("mail.transport.protocol", "SMTP")); 
0

Я имел mail.jar и activation.jar в Lib каталога TOMCAT и mailapi.jar в Lib каталоге приложения. Приложение читало mailapi.jar во время выполнения, так как mailapi.jar - это легкая версия почтовой рассылки api, и ему нужен smtp.jar, поэтому приложение бросало smtp-исключение. Итак, если вы хотите избавиться от этого исключения,

Пожалуйста, разрешить конфликт между mail.jar и mailapi.jar по:

  • Удаление mailapi.jar (если он есть в пути к классам).
  • ИЛИ просто держите одну пару mailapi.jar и smtp.jar в пути для группы и удалите
    mail.jar.
  • ИЛИ просто сохранить одну пару mail.jar и activation.jar в путь к классу (чистый подход).

(FYI: Я искал файловую систему, чтобы узнать, связанные почты опарник и должен знать, что у меня есть противоречивая .jar файл в добавленном Gradle в пути к классам по следующему пути() C: \ workspace.metadata.plugins \ org.eclipse.wst.server.core \ tmp0 \ wtpwebapps \ testapp \ WEB-INF \ lib)

Смежные вопросы