Link to home
Start Free TrialLog in
Avatar of humansg
humansgFlag for Singapore

asked on

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?
Avatar of for_yan
for_yan
Flag of United States of America image

Did you try to
ping smtp.live.com

It does not return pings for me
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

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 ;)
Avatar of CEHJ
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

   
  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;
Avatar of humansg

ASKER

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

Like you sed your user/password on Gmail and Yahoo?
Avatar of humansg

ASKER

yes, you need to input your userID and password for authentication..
still can't make it work for gmail - says cannot connect to SMTP server;

don't have hotmail account
Avatar of humansg

ASKER

	  // 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.
You just need to delete the following line:

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
>>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
ASKER CERTIFIED SOLUTION
Avatar of Peter Kwan
Peter Kwan
Flag of Hong Kong image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of humansg

ASKER

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?
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."  
Avatar of humansg

ASKER

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?
The other way round.
Avatar of humansg

ASKER

oops! my bad!

alrite thanks!
humansg, can you tell me why you ignored my comment please? I'd already given you the correct settings
Avatar of humansg

ASKER

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.
>>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