Using JavaMail to send email with Live/Hotmail SMTP server

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?
humansgAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
Peter KwanConnect With a Mentor Commented:
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
 
for_yanCommented:
Did you try to
ping smtp.live.com

It does not return pings for me
0
 
PapertripCommented:
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
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
PapertripCommented:
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
 
CEHJCommented:
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
 
for_yanCommented:

   
  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
 
humansgAuthor Commented:
    _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
 
for_yanCommented:
But you need to use your hotmail user/password, correct ?

Like you sed your user/password on Gmail and Yahoo?
0
 
humansgAuthor Commented:
yes, you need to input your userID and password for authentication..
0
 
for_yanCommented:
still can't make it work for gmail - says cannot connect to SMTP server;

don't have hotmail account
0
 
humansgAuthor Commented:
	  // 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
 
Peter KwanCommented:
You just need to delete the following line:

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
0
 
CEHJCommented:
>>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
 
humansgAuthor Commented:
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
 
Peter KwanCommented:
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
 
humansgAuthor Commented:
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
 
Peter KwanCommented:
The other way round.
0
 
humansgAuthor Commented:
oops! my bad!

alrite thanks!
0
 
CEHJCommented:
humansg, can you tell me why you ignored my comment please? I'd already given you the correct settings
0
 
humansgAuthor Commented:
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
 
CEHJCommented:
>>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
All Courses

From novice to tech pro — start learning today.