How to solve: Sending the email to the following s

2019-09-18 10:37发布

问题:

I am facing issue while sending mails programmatically using Java. I confirmed from the network team that sending mails through Java is blocked using firewall. but am able to get the response from telnet in my windows command prompt. Please find the details below.

Code used to send mail using Javax Mail:

public static void main(String[] args) throws MessagingException {
        String host = "mailhost.xxx";
        String to = "abc@xyz.edu";
        String from = "cde@xyz.edu";
        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);

        Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password");
            }
        });

        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 + ".");

    }

Using Telnet am able to send mails in command prompt: telnet mailhost.xxx 25 am getting the response like:

220 mailhost Microsoft ESMTP MAIL Service ready at Tue, 29 Mar 201
6 23:34:36 -0700

After googling I also tried setting JVM argument in Eclipse as below, no luck still getting the exception as shown below

-Djava.net.preferIPv4Stack=true

Exception:

Exception in thread "main" org.apache.commons.mail.EmailException: Sending the email to the following server failed : mailhost.xxx:25
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
    at org.apache.commons.mail.Email.send(Email.java:1267)
    at edu.xxx.pageobject.appcenter.util.ReportGenerator.main(ReportGenerator.java:328)
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: mailhost xxx, port: 25;
  nested exception is:
    java.net.SocketException: Permission denied: connect
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1282)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370)
    at javax.mail.Service.connect(Service.java:297)
    at javax.mail.Service.connect(Service.java:156)
    at javax.mail.Service.connect(Service.java:105)
    at javax.mail.Transport.send0(Transport.java:168)
    at javax.mail.Transport.send(Transport.java:98)
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
    ... 2 more
Caused by: java.net.SocketException: Permission denied: connect
    at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:232)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1250)
    ... 9 more

Let me know any possible solution to resolve the above issue.

回答1:

Since :

  • the source exception points to a permissions issue,
  • but you can connect from command line using telnet

that's not a network firewall issue.

You also ruled out the related Java 7 bug. So, the problem probably comes from your local Windows Firewall, or whatever Antivirus/firewall you're using. It may grant permissions to telnet, but not to Java.

Try to disable all your local firewall/antivirus, and check if java can successfully connect. If so, re-enable your firewall, and create an exception rule to allow connections to port 25 for your Java application.



回答2:

Posting an alternate solution for my above issue: As we were using Exchange accounts we were able to send the mails programmatically using EWS (Exchange Web Services) API. EWS Getting Started Guide Link