Search code examples
jspexchange-serverjakarta-mailipv6java-7

Sending email using JSP


This problem is driving me nuts. I have the following code:

<html>
<body>
<%@ page import="java.util.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%
String host = "exchsrv2";
String to = "[email protected]";
String from = "[email protected]";
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>

Okay, the problem is, I get the following error:

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)

I know Exchange server is there. I can telnet to it just fine. My Exchange server is setup to not require authentication. I got a program that works fine in C#/.NET, and it works fine, so I know the problem isn't in the Exchange server. What am I doing wrong here?


Solution

  • Well offhand I would say there is an authentication issue when trying to connect. You are not providing any username or password, unless your exchange server doesn't require username and password.


    UPDATE: If using JDK 7 see the following post, it resolved this issue:

    Defect - JDK7 Permission Denied with Sockets when using VPN

    "More digging around and it seems the VPN client has IPv6 disabled which is causing issues with JDK7. If I use the following flag -Djava.net.preferIPv4Stack=true I no longer see the errors. Is this workaround expected or is this an issue?"


    public class MailTest {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws MessagingException {
            String host = "smtp.gmail.com";
            String to = "[email protected]";
            String from = "[email protected]";
            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 + ".");
    
        }
    }