2014-01-27 3 views
0

Я создаю динамический веб-проект в Eclipse Kepler под Windows, который отправит электронное письмо на какой-то адрес. Я добавил "activ.jar" & "javax.mail-1.5.1.jar" в моей папке с папкой. Проблема в том, что в первый раз, когда я ее запустил, он работал нормально. Но через несколько дней, когда пытался снова отдыхать, он показывает следующее исключениеTransport.send (message) throwing NoSuchProviderException

javax.mail.NoSuchProviderException: smtp 
at javax.mail.Session.getService(Session.java:800) 
at javax.mail.Session.getTransport(Session.java:736) 
at javax.mail.Session.getTransport(Session.java:676) 
at javax.mail.Session.getTransport(Session.java:656) 
at javax.mail.Session.getTransport(Session.java:713) 
at javax.mail.Transport.send0(Transport.java:248) 
at javax.mail.Transport.send(Transport.java:124) 
at com.uks.pms.common.mail.dao.MailDAO.sendEmail(MailDAO.java:183) 
at com.uks.pms.user.attendance.action.ATUpdateAction.update(ATUpdateAction.java:188) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450) 
................................................... 

Метод, который я написал для выполнения действия является следующим образом-

public void sendEmail(MailBean mailConfig, String fromID, String toID, 
     String ccTo, StringBuffer mailContent) throws AddressException, 
     SendFailedException, MessagingException, Exception { 

    javax.mail.Session session = null; 
    MimeMessage mimeMessage = null; 

    try { 
     session = getSession(mailConfig); 
     mimeMessage = new MimeMessage(session); 
     mimeMessage.setFrom(new InternetAddress(fromID)); 
     mimeMessage.addRecipient(Message.RecipientType.TO, 
       new InternetAddress(toID)); 
     mimeMessage.setSubject(MailUtil.MAIL_CONTENT_SUBJECT); 
     if (!(ccTo == null || ccTo.isEmpty())) { 
      mimeMessage.addRecipient(Message.RecipientType.CC, 
        new InternetAddress(ccTo)); 
     } 
     mimeMessage.setText(mailContent.toString()); 
     mimeMessage.setContent(mailContent.toString(), 
       MailUtil.MAIL_CONTENT_TYPE); 
     Transport.send(mimeMessage); 
     System.out 
       .println("IF YOU ARE SEEING THIS MESSAGE THEN IT MEANS YOU HAVE SUCCESSFULLY SENT THE EMAIL"); 
    } finally { 
     System.gc(); 
    } 
} 

private javax.mail.Session getSession(MailBean mailConfig) throws Exception { 
    Properties properties = null; 
    javax.mail.Session session = null; 

    try { 
     properties = System.getProperties(); 
     properties.setProperty(MailUtil.KEY_MAIL_SMTP_PORT, 
       mailConfig.getPortNo()); 
     properties.setProperty(MailUtil.KEY_MAIL_SMTP_HOST, 
       mailConfig.getMailServer()); 

     session = javax.mail.Session.getDefaultInstance(properties); 
    } finally { 
     System.gc(); 
    } 
    return session; 
} 

где число порта 587 & хост 172.51.10.40 в сети. Я использую hmailserver в качестве почтового сервера без аутентификации & все настройки брандмауэра установлены правильно. Я не мог понять, где возникла проблема. Пожалуйста, дайте некоторое решение. Если какая-либо другая информация требуется, сообщите мне об этом.

Спасибо!

+0

Есть ли у вас какие-либо другие версии той же банки в вашем пути к классу? Извините, я удалил свой предыдущий комментарий как smtp.jar, требуемый в более ранних версиях javax.mail –

+0

Нет. Только упомянутые две банки добавлены. Даже он отлично работает, когда я запускаю его как простую программу Java. Но не работает в веб-проекте. –

ответ

0

Потому что вы используете это в контейнере сервлетов, вы можете работать в Bug 6668 -skip unusable Store and Transport classes. Если возможно, перейдите на JavaMail 1.5.3. В противном случае, измените создание сеанса к следующему:

final ClassLoader ccl = Thread.currentThread().getContextClassLoader(); 
    Thread.currentThread().setContextClassLoader(Session.class.getClassLoader()); 
    try { 
     session = javax.mail.Session.getDefaultInstance(properties); 
    } finally { 
     Thread.currentThread().setContextClassLoader(ccl); 
    } 

Это хорошая идея, чтобы fix the common mistakes в вашем коде.

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