2014-01-20 4 views
-1

Я пытаюсь отправить JavaMail из сервлета. Код сервлета выглядит следующим образом:MailConnectException при отправке JavaMail

package com.lsp.web; 

import com.lsp.service.Mailer; 
import org.springframework.beans.factory.annotation.Autowired; 

import javax.mail.MessagingException; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

@WebServlet(name = "contact", urlPatterns = {"/contact"}) 
public class ContactServlet extends SpringInjectedServlet { 
    @Autowired 
    private Mailer mailer; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     req.getRequestDispatcher("contact.jsp").forward(req, resp); 
    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     String customerEmail = req.getParameter("email"); 
     String subject = req.getParameter("subject"); 
     String body = req.getParameter("message"); 

     String error = null; 
     String succMess = null; 

     try { 
      javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail); 
      ia.validate(); 
      mailer.send(customerEmail, subject, body); //Maler class send method 
      req.setAttribute("succMessage", succMess); 
      req.getRequestDispatcher("sent.jsp").forward(req, resp); 

     } catch (javax.mail.internet.AddressException ae) { 
      error = "您指出的邮箱地址不存在"; 
      req.setAttribute("errorMessage", error); 
      req.getRequestDispatcher("contact.jsp").forward(req, resp); 
     } 
     catch (MessagingException mex) { 
      error = "发送失败"; 
      req.setAttribute("errorMessage", error); 
      req.getRequestDispatcher("contact.jsp").forward(req, resp); 
     } 
    } 
} 

Тогда мой класс Mailer является:

package com.lsp.service; 

import org.apache.log4j.Logger; 
import org.springframework.stereotype.Component; 

import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import java.util.Properties; 

@Component 
public class Mailer { 
    private static final Logger log = Logger.getLogger(Mailer.class); 

    public Mailer() { 
     log.info("I'm newed."); 
    } 

    public void send(String from, String subject, String body) { 
     String to = "[email protected]"; 
     String host = "localhost"; 

     Properties properties = System.getProperties(); 
     properties.setProperty("mail.smtp.host", host); 

     Session session = Session.getDefaultInstance(properties); 

     try{ 
      // Create a default MimeMessage object. 
      MimeMessage message = new MimeMessage(session); 

      // Set From: header field of the header. 
      message.setFrom(new InternetAddress(from)); 

      // Set To: header field of the header. 
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 

      // Set Subject: header field 
      message.setSubject(subject); 

      // Send the actual HTML message, as big as you like 
      message.setText(body); 

      // Send message 
      Transport.send(message); 
      System.out.println("Sent message successfully...."); 
     }catch (MessagingException mex) { 
      mex.printStackTrace(); 
     } 
    } 
} 

После удара подать (или отправить) кнопку представить форму Jsp страницы, я получил исключение говоря:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1; 
nested exception is:java.net.SocketException: Network is unreachable: connect 

Откуда взялся номер порта 25? Почему я получаю это исключение и как его решить?

Я ценю, если кто-то может мне помочь. Спасибо.

+0

http://stackoverflow.com/questions/8771167/how-to-change-javamail-port – Alfabravo

+0

Я изменил с getDefaultInstance (свойства) на getInstance (свойства), но все же дает мне такое же исключение. – user3014926

+0

1.) Ответ на ваш вопрос: вы не устанавливаете порт в своем коде, как показано в связанном вопросе. 2.) Вы уверены, что у вас есть sendmail/apache james/другой smtp-сервис, запущенный в localhost: 25 ??? – Alfabravo

ответ

1

Путь решить это:

1.) Установить службу SMTP, чтобы ваши сеансы могут подключиться к чему-то и очереди ваших SMTP-сообщений. Apache James действительно прост в использовании в Windows, просто загружайте, распаковывайте и выполняйте run.bat. На localhost будет работать служба: 25.

2.) Использование getDefaultInstance устанавливает некоторые свойства по умолчанию, а getInstance настоятельно рекомендует создать набор свойств, чтобы клиент мог подключиться к службе SMTP. Проверьте, какой из них вам лучше.

3.) Читайте о SMTP. Если вы ожидали, что ваш код будет отправлять сообщения, используя ничего, кроме вашего клиента, вам действительно нужно улучшить свои знания об этом.

+0

Я бегу на Tomcat. – user3014926

+0

Tomcat - это веб-контейнер. Он не предлагает услугу ретрансляции smtp. – Alfabravo

+0

Спасибо. Я продолжу загрузку Apache James, но я также хочу, чтобы моя Tomcat ругалась. – user3014926

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