Conrad Conrad -4 years ago 133
Android Question

SSLException in using JavaMail API

I am making use of Java Mail API to develop an app to send mail. I can successfully send the mail if I use the mail server hosting by yahoo or gmail. However, when I try to use my own mail server, I am fail to send the mail, what are the possible reasons causing the failure? When I execute my app in my device, it displays "Email was not sent", so no exception occurs. May I ask how can I change my program so I can successfully connect my app to my smtp server, or how can I get more information to display therefore I can understand why the connection has failed.

Here is my program:

public class Sender extends Activity {

Button Send;
TextView text;

public void onCreate(Bundle savedInstanceState) {

Send = (Button) findViewById(;
text = (TextView) findViewById(;

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()

Send.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
new SendMail().execute();


private class SendMail extends AsyncTask<String, Void, Integer>
ProgressDialog pd = null;
String error = null;
Integer result;

protected void onPreExecute() {
// TODO Auto-generated method stub
pd = new ProgressDialog(Sender.this);
pd.setTitle("Sending Mail");
pd.setMessage("Please wait...");

protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub

MailSender sender = new MailSender("", "password");

sender.setTo(new String[]{"", ""});
sender.setSubject("Test mail");
sender.setBody("This is the mail body");
try {
if(sender.send()) {
System.out.println("Message sent");
return 1;
} else {
return 2;
} catch (Exception e) {
error = e.getMessage();
Log.e("SendMail", e.getMessage(), e);
return 3;

protected void onPostExecute(Integer result) {
if(error!=null) {
if(result==1) {
"Email was sent successfully.", Toast.LENGTH_LONG)
} else if(result==2) {
"Email was not sent.", Toast.LENGTH_LONG).show();
} else if(result==3) {
"There was a problem sending the email.",

public class MailSender extends Authenticator {
private String user;
private String password;

private String [] to;
private String from;

private String port;
private String sport;

private String host;

private String subject;
private String body;

private boolean auth;
private boolean debuggable;

private Multipart multi;

public MailSender(){
host = "";
port = "25";
sport = "25";

user = "";
password = "";
from = "";
subject = "";
body = "";

debuggable = false;
auth = true;

multi = new MimeMultipart();

// There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");

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

public boolean send() throws Exception {
Properties props = setProperties();

Session session = Session.getInstance(props, this);

MimeMessage msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(from));

InternetAddress[] addressTo = new InternetAddress[to.length];
for(int i=0; i<to.length; i++){
addressTo[i] = new InternetAddress(to[i]);

msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
msg.setSentDate(new Date());

BodyPart messageBodyPart = new MimeBodyPart();


Transport transport = session.getTransport("smtps");
transport.connect(host, 25, user, password);
transport.sendMessage(msg, msg.getAllRecipients());
return true;
} catch (Exception e) {
return false;

public void addAttachment(String filename) throws Exception {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));


public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);

private Properties setProperties() {
Properties props = new Properties();

props.put("", host);

if(debuggable) {
props.put("mail.debug", "true");

if(auth) {
props.put("mail.smtp.auth", "true");

props.put("mail.smtp.port", port);
props.put("mail.smtp.socketFactory.port", sport);
props.put("mail.smtp.socketFactory.class", "");
props.put("mail.smtp.socketFactory.fallback", "false");

return props;

public void setTo(String[] toAddress) { = toAddress;

public void setFrom(String fromAddress) {
this.from = fromAddress;

public void setSubject(String subject) {
this.subject = subject;

public void setBody(String body) {
this.body = body;

Error messages in error log:

08-15 11:21:37.284: W/System.err(2553): SSL handshake aborted: ssl=0x5c075548: Failure in SSL library, usually a protocol error
08-15 11:21:37.291: W/System.err(2553): Caused by: SSL handshake aborted: ssl=0x5c075548: Failure in SSL library, usually a protocol error
08-15 11:21:37.299: W/System.err(2553): Caused by: SSL handshake aborted: ssl=0x5c075548: Failure in SSL library, usually a protocol error

Answer Source

You're connecting to port 25 and using SSL. Port 25 is the non-SSL (plain text) port. Assuming your server is set up for SSL, use the connect method that doesn't require you to specify a port number and let JavaMail use the default port.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download