класса javax.почта.NoSuchProviderException: нет поставщика для smtps

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

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

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

на всякий случай, если что-то было повреждено, я повторно загрузил весь zip с веб-сайта 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)

9 ответов


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

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

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


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


убедитесь, что у вас есть javax.почта.банку в построении пути. Если вы используете eclipse, вам может потребоваться обновить или щелкнуть правой кнопкой мыши проект в проводнике файлов, выбрать Настроить путь сборки, добавить внешний JAR и добавить его в путь сборки. отправить письмо с помощью java дает рабочий код (я его тестировал), если вы просто хотите посмотреть на свой. Если это не проблема, или вы не используете Eclipse, трассировка стека будет хорошо


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

в mail api доступно несколько банок для разных протоколов. Например, уведомления о доставке.Джар, гимап.jar, imap.jar, mailapi.банку ,по протоколу POP3.jar, smtp.Джар


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

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


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

убедитесь, что вы не забыли установить

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

вместо

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

У меня была почта.jar и активации.jar в каталоге lib tomcat и mailapi.jar в каталоге lib приложения. Приложение читало mailapi.jar во время выполнения, начиная с mailapi.jar-это облегченная версия почтового api, и ей нужен smtp.jar, поэтому приложение бросало исключение smtp. Поэтому, если вы хотите избавиться от этого исключения,

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

  • удаление mailapi.jar (если он есть в путь класса.)
  • или просто держать одна пара mailapi.jar и smtp.jar в пути к классам и удалить
    почта.сосуд.
  • или просто сохранить одну пару почты.jar и активации.jar in путь к классам (чистый подход).

(FYI: я искал файловую систему, чтобы узнать связанные с почтой файлы jar и узнал, что у меня есть конфликтующий файл jar по следующему пути (добавлен gradle в classpath) C:\workspace.метаданные.Плагины\орг.затмение.wst.сервер.core\tmp0\wtpwebapps\testapp\WEB-INF\lib)


У меня такая же проблема. я решил это, добавив правильную зависимость в maven. группа ИД - пакета javax.почта artifactory почте версия 1.4.7

Если вы делаете, без сборки maven, добавьте правильную библиотеку для javax.почта!--1-->


попробовать

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