Sending mail using hotmail SMTP - Not responding

1.6k Views Asked by At

I'm following a tutorial in order to create a class to send mail using Hotmail STMP. Somehow I get the error of:

"javax.mail.NoSuchProviderException: No provider for smtp"

I tried to ping and telnet to smtp.live.com and I got no response back. I'm not sure if the code is not correct or it's because of the hotmail's SMTP. Can anyone please give me an advice?

Thanks for your help.

Below is the class:

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 = new String[1]; 
  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 protected]"; // email sent from 
    _subject = "conco"; // email subject 
    _body = "bebe"; // email body 
    _to[0] = "[email protected]";
    _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 ….. 
} 

In the main class, i just call a constructor and send()

3

There are 3 best solutions below

0
chainkite On

Have you try port 25? My emailbox setting shows smtp port is 25.

1
sendon1982 On

I used your code and was able to send Email with no error.

new Mail("your email here", "your password here").send();

You have two Constructor here, the one without parameter has no email and password there.

Turn the debug on: _debuggable = true;

I am using JavaMail API:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.5</version>
</dependency>
0
Mahadev Mane On

public static void sendEmail()throws Exception {

    Properties props = null;
    if (props == null) {
        props = new Properties();
        props.put("mail.smtp.host", "smtp.live.com");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.user", "[email protected]");
        props.put("mail.smtp.pwd", "mypassword");
    }
    Session session = Session.getInstance(props, null);
    session.setDebug(true);
    Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress("[email protected]"));
    msg.setSubject("Auto Generated Mail");
    msg.setText("Testing Mail");
msg.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
    Transport transport = session.getTransport("smtp");
    transport.connect("smtp.live.com", 587, "[email protected]", "Mypassword");
    transport.sendMessage(msg, msg.getAllRecipients());
    System.out.println("Mail sent successfully at ");
    transport.close();
}