代码之家  ›  专栏  ›  技术社区  ›  Bill the Lizard

如何使用Gmail、雅虎或Hotmail发送Java应用程序的电子邮件?

  •  190
  • Bill the Lizard  · 技术社区  · 16 年前

    是否有可能使用Gmail帐户从我的Java应用程序发送电子邮件?我已经用Java应用程序配置了我的公司邮件服务器来发送电子邮件,但是当我分发应用程序时,它不会削减它。任何使用hotmail、yahoo或gmail的回答都是可以接受的。

    13 回复  |  直到 7 年前
        1
  •  176
  •   Bill the Lizard    7 年前

    首先下载 JavaMail API 并确保相关的JAR文件在类路径中。

    下面是一个使用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();
            }
        }
    }
    

    当然,你会想在 catch 块,然后像上面的示例代码一样打印堆栈跟踪。(删除) 抓住 块来查看来自javamail API的哪些方法调用引发异常,以便更好地了解如何正确处理这些异常。)


    多亏了 @jodonnel 以及所有回答的人。我给了他一笔赏金,因为他的回答让我找到了95%的完整答案。

        2
  •  109
  •   jodonnell    13 年前

    类似这样(听起来您只需要更改您的SMTP服务器):

    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 mail
    props.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 addresses
    while (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();
    
        3
  •  20
  •   Jason Thrasher    15 年前

    其他人在上面有很好的答案,但我想在这里添加一个关于我经验的注释。我发现,当使用gmail作为我的webapp的出站SMTP服务器时,gmail只允许我发送大约10封邮件,然后用反垃圾邮件响应进行响应,我必须手动单步执行才能重新启用SMTP访问。我发送的电子邮件不是垃圾邮件,而是用户在我的系统中注册时的网站“欢迎”电子邮件。所以,YMMV和我不会依赖Gmail来制作webapp。如果你代表一个用户发送电子邮件,比如一个已安装的桌面应用程序(用户在其中输入自己的Gmail凭据),你可能会没事的。

    另外,如果您使用的是Spring,那么这里有一个工作配置,可以将gmail用于出站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>
    
        4
  •  12
  •   Benny Bottema    8 年前

    尽管这个问题已经解决了,我还是想发布一个反问题的解决方案,但是现在使用 Simple Java Mail (开源javamail smtp包装器):

    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 instead
    new Mailer(session).sendMail(email);
    
        5
  •  7
  •   King of Masses    9 年前

    我下面的完整代码运行良好:

    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();
       }
    }
    }
    
        6
  •  3
  •   Reinstate Monica -- notmaynard Antonio Dias    11 年前
    //set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar
    import 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;
            }
        }
    
    }
    
        7
  •  3
  •   AlikElzin-kilaka planben    10 年前

    最低要求:

    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);
        }
    
    }
    
        8
  •  2
  •   Bryan    11 年前

    当需要在同一个JVM中的任意位置设置多个SMTP会话时,发布的代码解决方案可能会导致问题。

    Javamail常见问题解答建议使用

    Session.getInstance(properties);
    

    而不是

    Session.getDefaultInstance(properties);
    

    因为getdefault将只使用第一次调用时给定的属性。默认实例的所有后续使用都将忽略属性更改。

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

        9
  •  1
  •   Ifnu    15 年前

    这就是我要做的,当我想发送电子邮件附件,工作很好。:)

     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);
            }
        }
    
    }
    
        10
  •  0
  •   Ryan Farley    16 年前

    一个简单的途径是为pop3访问配置/启用gmail帐户。这将允许您通过Gmail服务器通过普通的SMTP发送出去。

    然后通过smtp.gmail.com(端口587)发送。

        11
  •  0
  •   Pyare    11 年前

    嗨,试试这个代码……

    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();
            }
        }
    }
    
        12
  •  0
  •   BullyWiiPlaza    9 年前

    这是一个易于使用的邮件发送类 Gmail . 你需要 JavaMail 图书馆 added to your build path 或者只是使用 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;
        }
    }
    

    示例用法:

    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();
    
        13
  •  0
  •   Community pid    7 年前

    如果要将Outlook与 Javamail API 然后使用

    smtp-mail.outlook.com
    

    作为一个 主办 更多和完整的工作代码 Check out this answer .