Отправка электронной почты с использованием JSP - PullRequest
3 голосов
/ 20 сентября 2011

Эта проблема сводит меня с ума.У меня есть следующий код:

<html>
<body>
<%@ page import="java.util.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%
String host = "exchsrv2";
String to = "alan@domain.com";
String from = "apeince@domain.com";
String subject = "test";
String messageText = "body test";

Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", "25");
Session mailSession = Session.getDefaultInstance(props, null);

Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(messageText);

Transport.send(msg);
out.println("Mail was sent to " + to);
out.println(" from " + from);
out.println(" using host " + host + ".");
%>
</body>
</html>

Хорошо, проблема в том, что я получаю следующую ошибку:

javax.servlet.ServletException: javax.mail.MessagingException: Could not connect to SMTP host: exchsrv2, port: 25;
nested exception is:
java.net.SocketException: Permission denied: connect
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:911)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:840)
org.apache.jsp.alan_jsp._jspService(alan_jsp.java:113)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Я знаю, что сервер Exchange существует.Я могу telnet к этому просто отлично.Мой сервер Exchange настроен так, что не требует аутентификации.У меня есть программа, которая отлично работает в C # /. NET, и она отлично работает, поэтому я знаю, что проблема не в сервере Exchange.Что я тут не так делаю?

Ответы [ 3 ]

9 голосов
/ 20 сентября 2011

Ну, я бы сказал, что при попытке подключения возникает проблема с аутентификацией. Вы не предоставляете имя пользователя или пароль, если ваш сервер обмена не требует имени пользователя и пароля.


ОБНОВЛЕНИЕ: При использовании JDK 7 см. Следующий пост, это решило эту проблему:

Дефект - отказано в доступе JDK7 для сокетов при использовании VPN

"Больше копаться, и кажется, что у VPN-клиента отключен IPv6, что вызывает проблемы с JDK7. Если я использую следующий флаг -Djava.net.preferIPv4Stack = true, я больше не вижу ошибок. Ожидается ли этот обходной путь или это проблема? "


public class MailTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws MessagingException {
        String host = "smtp.gmail.com";
        String to = "myEmail@gmail.com";
        String from = "myEmail@gmail.com";
        String subject = "test";
        String messageText = "body test";

        Properties props = System.getProperties();
        props.put("mail.host", host);
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.port", "25");

        // If using authentication, otherwise comment out
        props.put("mail.smtp.auth", "true");

        // Gmail requires TLS, your server may not
        props.put("mail.smtp.starttls.enable", "true");

        Session mailSession = Session.getDefaultInstance(props, null);

        Message msg = new MimeMessage(mailSession);
        msg.setFrom(new InternetAddress(from));
        InternetAddress[] address = {new InternetAddress(to)};
        msg.setRecipients(Message.RecipientType.TO, address);
        msg.setSubject(subject);
        msg.setSentDate(new Date());
        msg.setText(messageText);

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

        //connect with authentication
        //transport.connect(host,"myUsername" , "myPassword");

        //connect without authentication
        transport.connect();
        transport.sendMessage(msg, address);

        transport.close();

        System.out.println("Mail was sent to " + to);
        System.out.println(" from " + from);
        System.out.println(" using host " + host + ".");

    }
}
1 голос
/ 25 сентября 2012

Если вы не хотите менять предпочтительный стек IP на IPv4, альтернативным решением может быть использование адреса IPv6 для хоста вместо имени DHCP, например ::

String host = "fe80::b84d:1ed2:5329:de87%10";

Причина ошибки заключается в том, что IPv6 по умолчанию используется в Windows начиная с JDK 7. Когда вы пытаетесь подключиться к IPv4-адресу, то под прикрытием он будет использовать IPv4-сопоставленный IPv6-адрес (см. этот блог с сайта Oracle ). Но обычно это не должно быть проблемой, если ваш сервер обмена поддерживает IPv6. Однако я столкнулся с подобной проблемой при отправке почты из кода Java через сервер MS Exchange 2010 Server после перехода на JDK 7. Странно то, что согласно эта ссылка в MS Technet поддерживает IPv6. Так как я не хотел по умолчанию для IP-стека нашего полного приложения использовать IPv4, принятое решение путем установки флага -Djava.net.preferIPv4Stack = true при запуске приложения не было возможным. Таким образом, изменение имени хоста на действительный IPv6 было лучшим решением в моем случае. Мне не на 100% понятно, почему это работает, а не имя DHCP.

0 голосов
/ 26 мая 2014
      <%
      String host = "smtp.gmail.com";
      String from="send-from@gmail.com";//Your E-mail-Id
      String pass="xxxxxx";      //your e-mail account password

String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
String to = "send-to@gmail.com"; //recipient E-mail-Id
String from = "send-from@gmail.com"; // Your E-mail Id
String subject ="test mail";
String messageText = "hello abc";
boolean sessionDebug = true;


Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.transport.protocol.", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.", "true");
props.put("mail.smtp.port", "465");//port number 465 for Secure (SSL) and we can also            use port no 587 for Secure (TLS)
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.socketFactory.class", SSL_FACTORY);


Session mailSession = Session.getDefaultInstance(props, null);
mailSession.setDebug(sessionDebug);


Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
msg.setContent(messageText, "text/html");


Transport transport = mailSession.getTransport("smtp");
transport.connect(host, user, pass);


 try {
      transport.sendMessage(msg, msg.getAllRecipients());
      out.println("Send Success");
      boolean WasEmailSent = true; // assume it was sent
     }

catch (Exception err) {
                       boolean WasEmailSent = false; 
                      }
                  transport.close();
      %>
...