Solved

Using JavaMail to send email with Live/Hotmail SMTP server

Posted on 2011-09-25
23
4,508 Views
Last Modified: 2012-05-12
import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
 
 
public class Mail extends javax.mail.Authenticator { 
  private String _user; 
  private String _pass; 
 
  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 _multipart; 
 
 
  public Mail() { 
    _host = "smtp.live.com"; // default smtp server
    _port = "587"; // default smtp port 
    _sport = "587"; // default socketfactory port 
	 
    _user = ""; // username 
    _pass = ""; // password 
    _from = ""; // email sent from 
    _subject = ""; // email subject 
    _body = ""; // email body 
 
    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 
 
    _multipart = 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/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    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"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 
 
  public Mail(String user, String pass) { 
    this(); 
 
    _user = user; 
    _pass = pass; 
  } 
 
  public boolean send() throws Exception { 
    Properties props = _setProperties(); 
 
    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      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.setSubject(_subject); 
      msg.setSentDate(new Date()); 
 
      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 
 
      // Put parts in message 
      msg.setContent(_multipart); 
 
      // send email 
      Transport.send(msg); 
 
      return true; 
    } else { 
      return false; 
    } 
  } 
 
  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 
 
    _multipart.addBodyPart(messageBodyPart); 
  } 
 
  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 
 
  private Properties _setProperties() { 
    Properties props = new Properties(); 
 
    props.put("mail.smtp.host", _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", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
 
    return props; 
  } 
 
  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 
 
  public void setBody(String _body) { 
    this._body = _body; 
  } 
  
  public String[] getTo() { 
    return _to; 
  } 
	 
  public void setTo(String[] _to) { 
    this._to = _to; 
  } 
 
  public String getFrom() { 
    return _from; 
  } 
	 
  public void setFrom(String _from) { 
    this._from = _from; 
  }
  public String getSubject() { 
    return _subject; 
  } 
	 
  public void setSubject(String _subject) { 
    this._subject = _subject; 
  }   
  // more of the getters and setters ….. 
} 

Open in new window


I tried using SMTP settings for hotmail, but is not able to work. Any help?
0
Comment
Question by:humansg
  • 7
  • 4
  • 4
  • +2
23 Comments
 
LVL 47

Expert Comment

by:for_yan
ID: 36594547
Did you try to
ping smtp.live.com

It does not return pings for me
0
 
LVL 21

Expert Comment

by:Papertrip
ID: 36594573
Pinging an SMTP server is not the proper test for diagnosing an issue such as this.  Instead you should telnet to the port.
[root@broken ~]# telnet smtp.live.com 25
Trying 65.55.96.11...
Connected to smtp.live.com.
Escape character is '^]'.
220 BLU0-SMTP336.phx.gbl Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at  Sun, 25 Sep 2011 00:51:25 -0700

Open in new window

0
 
LVL 21

Expert Comment

by:Papertrip
ID: 36594576
I should have clarified that the telnet test is probably not going to solve your problem, but I just wanted to make sure that nobody started troubleshooting a non-existent problem.

Well, it might not be non-existent if your firewall is blocking it, so try that anyways ;)
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36594685
I don't know the settings for Hotmail. If you want to use Googlemail:

http://technojeeves.com/joomla/index.php/free/80-send-secure-mail-via-google-with-java
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36594817

   
  didn't work for me either with hotmail:
  javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;

   
     or with gmail:

      javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
0
 

Author Comment

by:humansg
ID: 36594831
    _host = "smtp.live.com"; // default smtp server
    _port = "587"; // default smtp port 
    _sport = "587"; // default socketfactory port

Open in new window


I have tried GMail and Yahoo!Mail by changing these parameters to their SMTP server settings.
Just couldn't get it work with hotmail/live..
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36594836
But you need to use your hotmail user/password, correct ?

Like you sed your user/password on Gmail and Yahoo?
0
 

Author Comment

by:humansg
ID: 36594847
yes, you need to input your userID and password for authentication..
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36594850
still can't make it work for gmail - says cannot connect to SMTP server;

don't have hotmail account
0
 

Author Comment

by:humansg
ID: 36594851
	  // GMAIL
_host = "smtp.gmail.com"; // default smtp server
_port = "465"; // default smtp port 
_sport = "465"; // default socketfactory port

Open in new window


My setting for Gmail is this.
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 16

Expert Comment

by:Peter Kwan
ID: 36594979
You just need to delete the following line:

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36594993
>>I have tried GMail and Yahoo!Mail by changing these parameters to their SMTP server settings.

You need to use exactly the settings shown at my link
0
 
LVL 16

Accepted Solution

by:
Peter Kwan earned 500 total points
ID: 36595000
Please also add the following line:

props.put("mail.smtp.starttls.enable", "true");

So the code that should be working is:

import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
 
 
public class Mail extends javax.mail.Authenticator { 
  private String _user; 
  private String _pass; 
 
  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 _multipart; 
 
 
  public Mail() { 
    _host = "smtp.live.com"; // default smtp server
    _port = "587"; // default smtp port 
    _sport = "587"; // default socketfactory port 
	 
    _user = ""; // username 
    _pass = ""; // password 
    _from = ""; // email sent from 
    _subject = ""; // email subject 
    _body = ""; // email body 
 
    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 
 
    _multipart = 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/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    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"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 
 
  public Mail(String user, String pass) { 
    this(); 
 
    _user = user; 
    _pass = pass; 
  } 
 
  public boolean send() throws Exception { 
    Properties props = _setProperties(); 
 
    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      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.setSubject(_subject); 
      msg.setSentDate(new Date()); 
 
      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 
 
      // Put parts in message 
      msg.setContent(_multipart); 
 
      // send email 
      Transport.send(msg); 
 
      return true; 
    } else { 
      return false; 
    } 
  } 
 
  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 
 
    _multipart.addBodyPart(messageBodyPart); 
  } 
 
  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 
 
  private Properties _setProperties() { 
    Properties props = new Properties(); 
 
    props.put("mail.smtp.host", _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", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.put("mail.smtp.starttls.enable", "true");
 
    return props; 
  } 
 
  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 
 
  public void setBody(String _body) { 
    this._body = _body; 
  } 
  
  public String[] getTo() { 
    return _to; 
  } 
	 
  public void setTo(String[] _to) { 
    this._to = _to; 
  } 
 
  public String getFrom() { 
    return _from; 
  } 
	 
  public void setFrom(String _from) { 
    this._from = _from; 
  }
  public String getSubject() { 
    return _subject; 
  } 
	 
  public void setSubject(String _subject) { 
    this._subject = _subject; 
  }   
  // more of the getters and setters ….. 
} 

Open in new window

0
 

Author Comment

by:humansg
ID: 36595074
hi pkwan,

do you mind explaining why we need to comment off this line
// props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

i've tried and it work successfully!

so if I were to switch between GMail/Yahoo! and Hotmail Live, I will have to perform such settings in order for it to work? An if-else statement to toggle these properties?
0
 
LVL 16

Expert Comment

by:Peter Kwan
ID: 36595102
This is because SSL is not needed for TLS port 587 for live.com.

You may refer to the following:
http://answers.microsoft.com/en-us/windows/forum/windows_other-networking/any-bug-fix-for-live-mail-send-failure-on-ssl-port/62f70ed5-567e-e011-9b4b-68b599b31bf5

"Right-click on the account in the Folder pane and select Properties. On the Servers tab, check that the Outgoing (SMTP) server is set to smtp.comcast.net and that the My server requires authentication box is checked. Then on the Advanced tab, change the Outgoing (SMTP) port number to 587. Neither of the This server requires a secure connection (SSL) boxes should be checked."  
0
 

Author Comment

by:humansg
ID: 36595114
So for SMTP server that requires SSL, I need this code.
props.put("mail.smtp.starttls.enable", "true");

And for SMTP server that requires TLS, I need this code.
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

Is this what you meant?
0
 
LVL 16

Expert Comment

by:Peter Kwan
ID: 36595115
The other way round.
0
 

Author Closing Comment

by:humansg
ID: 36595118
oops! my bad!

alrite thanks!
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36595408
humansg, can you tell me why you ignored my comment please? I'd already given you the correct settings
0
 

Author Comment

by:humansg
ID: 36595664
CEHJ,

I am asking for a setting that work with hotmail live smtp server and not with GMail.
What pkwan provided was right by commenting this line
// props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
and adding this line
props.put("mail.smtp.starttls.enable", "true");

The link you provided was for GMail not Live/Hotmail.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36596214
>>I am asking for a setting that work with hotmail live smtp server and not with GMail.

Sorry - i thought you'd gone onto gmail
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Updating Java 9 87
json format text only 4 65
Core Java. What output will be and why ? 6 58
advertisement module in core php 4 88
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Viewers learn about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now