5

I have referred to previous answers to similar question of mine but it gives an example using the outgoing server configuration of Gmail. However I want to use the JavaMail API for the webmail that my company is using:

Outgoing server: smtp.softcellindia.com

port: 25

Type of encryption: none

I have tried using the following code. But it seems to send no mails.

import javax.activation.DataHandler;   
import javax.activation.DataSource;   
import javax.mail.Message;   
import javax.mail.PasswordAuthentication;   
import javax.mail.Session;   
import javax.mail.Transport;   
import javax.mail.internet.InternetAddress;   
import javax.mail.internet.MimeMessage;   
import java.io.ByteArrayInputStream;   
import java.io.IOException;   
import java.io.InputStream;   
import java.io.OutputStream;   
import java.security.Security;   
import java.util.Properties;   

public class MailSender extends javax.mail.Authenticator {   
    private String mailhost = "smtp.softcellindia.com";   
    private String user;   
    private String password;   
    private Session session;   

    static {   
        Security.addProvider(new com.provider.JSSEProvider());   
    }  

    public MailSender(String user, String password) {   
        this.user = user;   
        this.password = password;   

        Properties props = new Properties();  
        props.setProperty("mail.transport.protocol", "smtp");   
        props.setProperty("mail.host", mailhost);   
        props.put("mail.smtp.auth", "true");   
        props.put("mail.smtp.port", "25");   
        props.put("mail.smtp.socketFactory.port", "25");   
        props.put("mail.smtp.socketFactory.class",   
                "javax.net.ssl.SSLSocketFactory");   
        props.put("mail.smtp.socketFactory.fallback", "false");   
        props.setProperty("mail.smtp.quitwait", "false");   

        session = Session.getDefaultInstance(props, this);

       }   

    protected PasswordAuthentication getPasswordAuthentication() {   
        return new PasswordAuthentication(user, password);   
    }   

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {   
        try{
        MimeMessage message = new MimeMessage(session);   
        DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));   
        message.setSender(new InternetAddress(sender));   
        message.setSubject(subject);   
        message.setDataHandler(handler);   
        if (recipients.indexOf(',') > 0)   
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
        else  
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
        Transport.send(message);   
        }catch(Exception e){

        }
    }   

    public class ByteArrayDataSource implements DataSource {   
        private byte[] data;   
        private String type;   

        public ByteArrayDataSource(byte[] data, String type) {   
            super();   
            this.data = data;   
            this.type = type;   
        }   

        public ByteArrayDataSource(byte[] data) {   
            super();   
            this.data = data;   
        }   

        public void setType(String type) {   
            this.type = type;   
        }   

        public String getContentType() {   
            if (type == null)   
                return "application/octet-stream";   
            else  
                return type;   
        }   

        public InputStream getInputStream() throws IOException {   
            return new ByteArrayInputStream(data);   
        }   

        public String getName() {   
            return "ByteArrayDataSource";   
        }   

        public OutputStream getOutputStream() throws IOException {   
            throw new IOException("Not Supported");   
        }   
    }   
} 
Harshul Pandav
  • 1,016
  • 11
  • 23
  • I think you should check your server's SMTP port . – Chirag Feb 27 '12 at 07:31
  • I finally got it working by changing props.setProperty("**mail.host**", mailhost); to props.setProperty("**mail.smtp.host**", mailhost); and deleted following lines props.put("mail.smtp.socketFactory.port", "25"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.quitwait", "false"); – Harshul Pandav Mar 01 '12 at 08:36
  • @Harshul:: Can u plz add ur own answer here. I am trying to use the same concept, but geting exception: 554 Message refused. – Harpreet Apr 09 '12 at 11:54
  • That code is unnecessarily complex. You certainly don't need your own version of ByteArrayDataSource if you're using a recent version of JavaMail. See the JavaMail FAQ for much simpler code, and for tips on how to debug your problem. "It doesn't work" isn't really enough information for us to tell you what you did wrong. – Bill Shannon Feb 27 '12 at 07:34

2 Answers2

0

Change javax.net.ssl.SSLSocketFactory to javax.net.SocketFactory

Rob Hruska
  • 118,520
  • 32
  • 167
  • 192
0

I had finally got it working by changing

props.setProperty("mail.host", mailhost);

to

props.setProperty("mail.smtp.host", mailhost);

and deleted following lines

props.put("mail.smtp.socketFactory.port", "25");
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactor"); 
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
Harshul Pandav
  • 1,016
  • 11
  • 23