humansg
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 …..
}
I tried using SMTP settings for hotmail, but is not able to work. Any help?
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
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 ;)
Well, it might not be non-existent if your firewall is blocking it, so try that anyways ;)
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
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.MessagingExcept
or with gmail:
javax.mail.MessagingExcept
ASKER
_host = "smtp.live.com"; // default smtp server
_port = "587"; // default smtp port
_sport = "587"; // default socketfactory port
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?
Like you sed your user/password on Gmail and Yahoo?
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
don't have hotmail account
ASKER
// GMAIL
_host = "smtp.gmail.com"; // default smtp server
_port = "465"; // default smtp port
_sport = "465"; // default socketfactory port
My setting for Gmail is this.
You just need to delete the following line:
props.put("mail.smtp.socke tFactory.c lass", "javax.net.ssl.SSLSocketFa ctory");
props.put("mail.smtp.socke
>>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
You need to use exactly the settings shown at my link
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
hi pkwan,
do you mind explaining why we need to comment off this line
// props.put("mail.smtp.socke tFactory.c lass", "javax.net.ssl.SSLSocketFa ctory");
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?
do you mind explaining why we need to comment off this line
// props.put("mail.smtp.socke
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."
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."
ASKER
So for SMTP server that requires SSL, I need this code.
props.put("mail.smtp.start tls.enable ", "true");
And for SMTP server that requires TLS, I need this code.
props.put("mail.smtp.socke tFactory.c lass", "javax.net.ssl.SSLSocketFa ctory");
Is this what you meant?
props.put("mail.smtp.start
And for SMTP server that requires TLS, I need this code.
props.put("mail.smtp.socke
Is this what you meant?
The other way round.
ASKER
oops! my bad!
alrite thanks!
alrite thanks!
humansg, can you tell me why you ignored my comment please? I'd already given you the correct settings
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.socke tFactory.c lass", "javax.net.ssl.SSLSocketFa ctory");
and adding this line
props.put("mail.smtp.start tls.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.
What pkwan provided was right by commenting this line
// props.put("mail.smtp.socke
and adding this line
props.put("mail.smtp.start
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
Sorry - i thought you'd gone onto gmail
ping smtp.live.com
It does not return pings for me