How can I send an email by Java application?

来源:互联网 发布:知君本无邪by尼罗鲤鱼 编辑:程序博客网 时间:2024/04/29 21:15

原文地址:http://stackoverflow.com/questions/46663/how-can-i-send-an-email-by-java-application-using-gmail-yahoo-or-hotmail#47452

How can I send an email by Java application using GMail, Yahoo, or Hotmail?

ANSWER 1


First download the JavaMail API and make sure the relevant jar files are in your classpath.

Here's a full working example using a GMail.

import java.util.*;import javax.mail.*;import javax.mail.internet.*;public class Main {    private static String USER_NAME = "*****";  // GMail user name (just the part before "@gmail.com")    private static String PASSWORD = "********"; // GMail password    private static String RECIPIENT = "lizard.bill@myschool.edu";    public static void main(String[] args) {        String from = USER_NAME;        String pass = PASSWORD;        String[] to = { RECIPIENT }; // list of recipient email addresses        String subject = "Java send mail example";        String body = "Welcome to JavaMail!";        sendFromGMail(from, pass, to, subject, body);    }    private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {        Properties props = System.getProperties();        String host = "smtp.gmail.com";        props.put("mail.smtp.starttls.enable", "true");        props.put("mail.smtp.host", host);        props.put("mail.smtp.user", from);        props.put("mail.smtp.password", pass);        props.put("mail.smtp.port", "587");        props.put("mail.smtp.auth", "true");        Session session = Session.getDefaultInstance(props);        MimeMessage message = new MimeMessage(session);        try {            message.setFrom(new InternetAddress(from));            InternetAddress[] toAddress = new InternetAddress[to.length];            // To get the array of addresses            for( int i = 0; i < to.length; i++ ) {                toAddress[i] = new InternetAddress(to[i]);            }            for( int i = 0; i < toAddress.length; i++) {                message.addRecipient(Message.RecipientType.TO, toAddress[i]);            }            message.setSubject(subject);            message.setText(body);            Transport transport = session.getTransport("smtp");            transport.connect(host, from, pass);            transport.sendMessage(message, message.getAllRecipients());            transport.close();        }        catch (AddressException ae) {            ae.printStackTrace();        }        catch (MessagingException me) {            me.printStackTrace();        }    }}

Naturally, you'll want to do more in the catch blocks than print the stack trace as I did in the example code above. Remove the catch blocks to see which method calls from the JavaMail API throw exceptions so you can better see how to properly handle them.

Some comments:

 

the lizard - do we need to forward a port for this??? props.put("mail.smtp.port", "587"); this port has to be opened?? –  Varun Apr 5 '11 at 4:19 
1 
@varun: That's the port on the outgoing mail server, smtp.gmail.com. See Configuring other mail clientsfor details. –  Bill the Lizard Apr 5 '11 at 11:11
 
Am I the only one who gets AuthenticationFailedException here props.put("mail.smtp.auth", "true"); if the true is string. It is fine if it is a boolean. –  nyxz Dec 20 '11 at 12:39
 
at this point I had to change internetaddress to inetaddress –  macintosh264 Feb 17 '12 at 4:04
 
this didn't work unless session.getTransport("smtp") is session.getTransport("smtps") –  Michael Roller Aug 21 '12 at 5:54
2 
For SSL gmail connection please use props.put("mail.smtp.port", "465"); // instead of 587 –  Tomasz DziurkoDec 20 '12 at 13:47
 
The above code is working nicely –  Ripon Al Wasim Jan 7 '13 at 6:30
 
This doesn't seems to be working now as of (Sep '13) atleast for gmail. You get 'PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target'. I believe there are some changes at gmail's side to the certificates and protocols. –  mtkSep 28 '13 at 17:42
 
@mtk I'm testing this now and I'm not getting that error. –  Bill the Lizard Oct 13 '13 at 15:41
 
@billtheLizard Really not sure what the issue is then. I am getting the same error as stated above and I do find several other posts refer that error. But not able to resolve it yet. I believe there must be some differences depending from which region it is being executed. –  mtk Oct 13 '13 at 17:21
2 
See oracle.com/technetwork/java/faq-135477.html#getdefaultinstance regarding use of Session.getDefaultInstance(properties). This FAQ recommends using getInstance(..) instead. –  Bryan Dec 12 '13 at 18:04
1 
I was unable to access using SMTP gmail with the above and similar codes and was gettingjavax.mail.AuthenticationFailedException and had to explicitly enable "less secure apps" in my gmail settings: google.com/settings/security/lesssecureapps. Once "less secure apps" was enabled, the code worked –  Marcus Junius Brutus Sep 29 '14 at 22:19 
 
@Marcus Junius Brutus Thanks, this really helped ! LESSSECUREAPPS guys ! –  Vikrant Goel Jan 28 at 1:36
 
@BilltheLizard hi.this code works fine.. but how can i attach a image with the mail..? message.setFileName(filename); send the image.. but the image size is reduced to 1kb. so i cannot open the image.plz help.thanks. –  Dinoop Nair Feb 3 at 6:17

See Configuring other mail clients(gmail的邮件客户端设置,见下图)


ANSWER 2

Something like this (sounds like you just need to change your SMTP server):

String host = "smtp.gmail.com";String from = "user name";Properties props = System.getProperties();props.put("mail.smtp.host", host);props.put("mail.smtp.user", from);props.put("mail.smtp.password", "asdfgh");props.put("mail.smtp.port", "587"); // 587 is the port number of yahoo mailprops.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props, null);MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(from));InternetAddress[] to_address = new InternetAddress[to.length];int i = 0;// To get the array of addresseswhile (to[i] != null) {    to_address[i] = new InternetAddress(to[i]);    i++;}System.out.println(Message.RecipientType.TO);i = 0;while (to_address[i] != null) {    message.addRecipient(Message.RecipientType.TO, to_address[i]);    i++;}message.setSubject("sending in a group");message.setText("Welcome to JavaMail");// alternately, to send HTML mail:// message.setContent("<p>Welcome to JavaMail</p>", "text/html");Transport transport = session.getTransport("smtp");transport.connect("smtp.mail.yahoo.co.in", "user name", "asdfgh");transport.sendMessage(message, message.getAllRecipients());transport.close();

Comments:
 
Is it possible to send the content as html? If I try to write some html code and send it, but on the receive end, the content of the email is only html code. –  Thang Pham Feb 21 '11 at 16:35
3 
To send html body instead of clear text change this line: message.setText("Welcome to JavaMail");with this line: message.setContent("<h1>Hello world</h1>", "text/html"); –  mist Jun 28 '11 at 20:36
2 
This one is missing ("mail.smtp.starttls.enable", "true") –  Sotomajor Oct 3 '12 at 12:35


ANSWER 3

Other people have good answers above, but I wanted to add a note on my experience here. I've found that when using Gmail as an outbound SMTP server for my webapp, Gmail only lets me send ~10 or so messages before responding with an anti-spam response that I have to manually step through to re-enable SMTP access. The emails I was sending were not spam, but were website "welcome" emails when users registered with my system. So, YMMV, and I wouldn't rely on Gmail for a production webapp. If you're sending email on a user's behalf, like an installed desktop app (where the user enters their own Gmail credentials), you may be okay.

Also, if you're using Spring, here's a working config to use Gmail for outbound SMTP:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">    <property name="defaultEncoding" value="UTF-8"/>    <property name="host" value="smtp.gmail.com"/>    <property name="port" value="465"/>    <property name="username" value="${mail.username}"/>    <property name="password" value="${mail.password}"/>    <property name="javaMailProperties">        <value>            mail.debug=true            mail.smtp.auth=true            mail.smtp.socketFactory.class=java.net.SocketFactory            mail.smtp.socketFactory.fallback=false        </value>    </property></bean>

ANSWER 4


Even though this question is closed, I'd like to post a counter solution, but now using Vesijama (Open Source JavaMail smtp wrapper):

final Email email = new Email();String host = "smtp.gmail.com";Integer port = 587;String from = "username";String pass = "password";String[] to = {"to@gmail.com"};email.setFromAddress("", from);email.setSubject("sending in a group");for( int i=0; i < to.length; i++ ) {    email.addRecipient("", to[i], RecipientType.TO);}email.setText("Welcome to JavaMail");new Mailer(host, port, from, pass).sendMail(email);// you could also still use your mail session insteadnew Mailer(session).sendMail(email);

ANSWER 5

My complete code as below is working well:

package ripon.java.mail;import java.util.*;import javax.mail.*;import javax.mail.internet.*;public class SendEmail{public static void main(String [] args){        // Sender's email ID needs to be mentioned     String from = "test@gmail.com";     String pass ="test123";    // Recipient's email ID needs to be mentioned.   String to = "ripon420@yahoo.com";   String host = "smtp.gmail.com";   // Get system properties   Properties properties = System.getProperties();   // Setup mail server   properties.put("mail.smtp.starttls.enable", "true");   properties.put("mail.smtp.host", host);   properties.put("mail.smtp.user", from);   properties.put("mail.smtp.password", pass);   properties.put("mail.smtp.port", "587");   properties.put("mail.smtp.auth", "true");   // Get the default Session object.   Session session = Session.getDefaultInstance(properties);   try{      // Create a default MimeMessage object.      MimeMessage message = new MimeMessage(session);      // Set From: header field of the header.      message.setFrom(new InternetAddress(from));      // Set To: header field of the header.      message.addRecipient(Message.RecipientType.TO,                               new InternetAddress(to));      // Set Subject: header field      message.setSubject("This is the Subject Line!");      // Now set the actual message      message.setText("This is actual message");      // Send message      Transport transport = session.getTransport("smtp");      transport.connect(host, from, pass);      transport.sendMessage(message, message.getAllRecipients());      transport.close();      System.out.println("Sent message successfully....");   }catch (MessagingException mex) {      mex.printStackTrace();   }}}

ANSWER 6

//set CLASSPATH=%CLASSPATH%;activation.jar;mail.jarimport javax.mail.*;import javax.mail.internet.*;import java.util.*;public class Mail{    String  d_email = "iamdvr@gmail.com",            d_password = "****",            d_host = "smtp.gmail.com",            d_port  = "465",            m_to = "iamdvr@yahoo.com",            m_subject = "Testing",            m_text = "Hey, this is the testing email using smtp.gmail.com.";    public static void main(String[] args)    {        String[] to={"XXX@yahoo.com"};        String[] cc={"XXX@yahoo.com"};        String[] bcc={"XXX@yahoo.com"};        //This is for google        Mail.sendMail("venkatesh@dfdf.com", "password", "smtp.gmail.com",                       "465", "true", "true",                       true, "javax.net.ssl.SSLSocketFactory", "false",                       to, cc, bcc,                       "hi baba don't send virus mails..",                       "This is my style...of reply..If u send virus mails..");    }    public synchronized static boolean sendMail(        String userName, String passWord, String host,         String port, String starttls, String auth,         boolean debug, String socketFactoryClass, String fallback,         String[] to, String[] cc, String[] bcc,         String subject, String text)     {        Properties props = new Properties();        //Properties props=System.getProperties();        props.put("mail.smtp.user", userName);        props.put("mail.smtp.host", host);        if(!"".equals(port))            props.put("mail.smtp.port", port);        if(!"".equals(starttls))            props.put("mail.smtp.starttls.enable",starttls);        props.put("mail.smtp.auth", auth);        if(debug) {            props.put("mail.smtp.debug", "true");        } else {            props.put("mail.smtp.debug", "false");                 }        if(!"".equals(port))            props.put("mail.smtp.socketFactory.port", port);        if(!"".equals(socketFactoryClass))            props.put("mail.smtp.socketFactory.class",socketFactoryClass);        if(!"".equals(fallback))            props.put("mail.smtp.socketFactory.fallback", fallback);        try        {            Session session = Session.getDefaultInstance(props, null);            session.setDebug(debug);            MimeMessage msg = new MimeMessage(session);            msg.setText(text);            msg.setSubject(subject);            msg.setFrom(new InternetAddress("p_sambasivarao@sutyam.com"));            for(int i=0;i<to.length;i++) {                msg.addRecipient(Message.RecipientType.TO,                                  new InternetAddress(to[i]));            }            for(int i=0;i<cc.length;i++) {                msg.addRecipient(Message.RecipientType.CC,                                  new InternetAddress(cc[i]));            }            for(int i=0;i<bcc.length;i++) {                msg.addRecipient(Message.RecipientType.BCC,                                  new InternetAddress(bcc[i]));            }            msg.saveChanges();            Transport transport = session.getTransport("smtp");            transport.connect(host, userName, passWord);            transport.sendMessage(msg, msg.getAllRecipients());            transport.close();            return true;        }        catch (Exception mex)        {            mex.printStackTrace();            return false;        }    }}

ANSWER 7

The minimum required:

import java.util.Properties;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;public class MessageSender {    public static void sendHardCoded() throws AddressException, MessagingException {        String to = "a@a.info";        final String from = "b@gmail.com";        Properties properties = new Properties();        properties.put("mail.smtp.starttls.enable", "true");        properties.put("mail.smtp.auth", "true");        properties.put("mail.smtp.host", "smtp.gmail.com");        properties.put("mail.smtp.port", "587");        Session session = Session.getInstance(properties,                new javax.mail.Authenticator() {                    protected PasswordAuthentication getPasswordAuthentication() {                        return new PasswordAuthentication(from, "BeNice");                    }                });        MimeMessage message = new MimeMessage(session);        message.setFrom(new InternetAddress(from));        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));        message.setSubject("Hello");        message.setText("What's up?");        Transport.send(message);    }}

ANSWER 8


This is what I do when i want to send email with attachment, work fine. :)

public class NewClass {    public static void main(String[] args) {        try {            Properties props = System.getProperties();            props.put("mail.smtp.starttls.enable", "true");            props.put("mail.smtp.host", "smtp.gmail.com");            props.put("mail.smtp.auth", "true");            props.put("mail.smtp.port", "465"); // smtp port            Authenticator auth = new Authenticator() {                @Override                protected PasswordAuthentication getPasswordAuthentication() {                    return new PasswordAuthentication("username-gmail", "password-gmail");                }            };            Session session = Session.getDefaultInstance(props, auth);            MimeMessage msg = new MimeMessage(session);            msg.setFrom(new InternetAddress("username-gmail@gmail.com"));            msg.setSubject("Try attachment gmail");            msg.setRecipient(RecipientType.TO, new InternetAddress("username-gmail@gmail.com"));            //add atleast simple body            MimeBodyPart body = new MimeBodyPart();            body.setText("Try attachment");            //do attachment            MimeBodyPart attachMent = new MimeBodyPart();            FileDataSource dataSource = new FileDataSource(new File("file-sent.txt"));            attachMent.setDataHandler(new DataHandler(dataSource));            attachMent.setFileName("file-sent.txt");            attachMent.setDisposition(MimeBodyPart.ATTACHMENT);            Multipart multipart = new MimeMultipart();            multipart.addBodyPart(body);            multipart.addBodyPart(attachMent);            msg.setContent(multipart);            Transport.send(msg);        } catch (AddressException ex) {            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);        } catch (MessagingException ex) {            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);        }    }}

OTHER ANSWERS:

up vote0down vote

An easy route would be to have the gmail account configured/enabled for POP3 access. This would allow you to send out via normal SMTP through the gmail servers.

Then you'd just send through smtp.gmail.com (on port 587)

shareimprove this answer
 
up vote0down vote

The posted code solutions may cause problems when you need to set up multiple SMTP sessions anywhere within the same JVM.

The JavaMail FAQ recommends using

Session.getInstance(properties);

instead of

Session.getDefaultInstance(properties);

because the getDefault will only use the properties given the first time it is invoked. All later uses of the default instance will ignore property changes.

See http://www.oracle.com/technetwork/java/faq-135477.html#getdefaultinstance

shareimprove this answer
 

Hi try this code:

package my.test.service;import java.util.Properties;import javax.mail.Authenticator;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Message;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;public class Sample {    public static void main(String args[]) {        final String SMTP_HOST = "smtp.gmail.com";        final String SMTP_PORT = "587";        final String GMAIL_USERNAME = "xxxxxxxxxx@gmail.com";        final String GMAIL_PASSWORD = "xxxxxxxxxx";        System.out.println("Process Started");        Properties prop = System.getProperties();        prop.setProperty("mail.smtp.starttls.enable", "true");        prop.setProperty("mail.smtp.host", SMTP_HOST);        prop.setProperty("mail.smtp.user", GMAIL_USERNAME);        prop.setProperty("mail.smtp.password", GMAIL_PASSWORD);        prop.setProperty("mail.smtp.port", SMTP_PORT);        prop.setProperty("mail.smtp.auth", "true");        System.out.println("Props : " + prop);        Session session = Session.getInstance(prop, new Authenticator() {            protected PasswordAuthentication getPasswordAuthentication() {                return new PasswordAuthentication(GMAIL_USERNAME,                        GMAIL_PASSWORD);            }        });        System.out.println("Got Session : " + session);        MimeMessage message = new MimeMessage(session);        try {            System.out.println("before sending");            message.setFrom(new InternetAddress(GMAIL_USERNAME));            message.addRecipients(Message.RecipientType.TO,                    InternetAddress.parse(GMAIL_USERNAME));            message.setSubject("My First Email Attempt from Java");            message.setText("Hi, This mail came from Java Application.");            message.setRecipients(Message.RecipientType.TO,                    InternetAddress.parse(GMAIL_USERNAME));            Transport transport = session.getTransport("smtp");            System.out.println("Got Transport" + transport);            transport.connect(SMTP_HOST, GMAIL_USERNAME, GMAIL_PASSWORD);            transport.sendMessage(message, message.getAllRecipients());            System.out.println("message Object : " + message);            System.out.println("Email Sent Successfully");        } catch (AddressException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (MessagingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}


Here's an easy-to-use class for sending emails with Gmail. You need to have the JavaMail libraryadded to your build path or just use Maven.

import java.util.Properties;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;public class GmailSender{    private static String protocol = "smtp";    private String username;    private String password;    private Session session;    private Message message;    private Multipart multipart;    public GmailSender()    {        this.multipart = new MimeMultipart();    }    public void setSender(String username, String password)    {        this.username = username;        this.password = password;        this.session = getSession();        this.message = new MimeMessage(session);    }    public void addRecipient(String recipient) throws AddressException, MessagingException    {        message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));    }    public void setSubject(String subject) throws MessagingException    {        message.setSubject(subject);    }    public void setBody(String body) throws MessagingException    {        BodyPart messageBodyPart = new MimeBodyPart();        messageBodyPart.setText(body);        multipart.addBodyPart(messageBodyPart);        message.setContent(multipart);    }    public void send() throws MessagingException    {        Transport transport = session.getTransport(protocol);        transport.connect(username, password);        transport.sendMessage(message, message.getAllRecipients());        transport.close();    }    public void addAttachment(String filePath) throws MessagingException    {        BodyPart messageBodyPart = getFileBodyPart(filePath);        multipart.addBodyPart(messageBodyPart);        message.setContent(multipart);    }    private BodyPart getFileBodyPart(String filePath) throws MessagingException    {        BodyPart messageBodyPart = new MimeBodyPart();        DataSource dataSource = new FileDataSource(filePath);        messageBodyPart.setDataHandler(new DataHandler(dataSource));        messageBodyPart.setFileName(filePath);        return messageBodyPart;    }    private Session getSession()    {        Properties properties = getMailServerProperties();        Session session = Session.getDefaultInstance(properties);        return session;    }    private Properties getMailServerProperties()    {        Properties properties = System.getProperties();        properties.put("mail.smtp.starttls.enable", "true");        properties.put("mail.smtp.host", protocol + ".gmail.com");        properties.put("mail.smtp.user", username);        properties.put("mail.smtp.password", password);        properties.put("mail.smtp.port", "587");        properties.put("mail.smtp.auth", "true");        return properties;    }}

Example usage:

GmailSender sender = new GmailSender();sender.setSender("myEmailNameWithout@gmail.com", "mypassword");sender.addRecipient("recipient@somehost.com");sender.setSubject("The subject");sender.setBody("The body");sender.addAttachment("TestFile.txt");sender.send();


 
Is it possible to send the content as html? If I try to write some html code and send it, but on the receive end, the content of the email is only html code. –  Thang Pham Feb 21 '11 at 16:35
3 
To send html body instead of clear text change this line: message.setText("Welcome to JavaMail");with this line: message.setContent("<h1>Hello world</h1>", "text/html"); –  mist Jun 28 '11 at 20:36
2 
This one is missing ("mail.smtp.starttls.enable", "true") –  Sotomajor Oct 3 '12 at 12:35
0 0