How can I send an email by Java application using GMail, Yahoo, or Hotmail?
是否有可能使用Gmail帐户从我的Java应用程序发送电子邮件?我已经用Java应用程序配置了我的公司邮件服务器来发送电子邮件,但是当我分发应用程序时,它不会削减它。任何使用hotmail、yahoo或gmail的回答都是可以接受的。 
 首先下载Javamail API,并确保相关的JAR文件在您的类路径中。 下面是一个使用gmail的完整工作示例。 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
   | 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块中做的比在上面的示例代码中打印堆栈跟踪更多。(删除catch块,查看javamail API调用的方法抛出异常,以便更好地了解如何正确处理这些异常。) 感谢@jodonnel和所有其他回答者。我给了他一笔赏金,因为他的回答让我找到了95%的完整答案。 
 类似这样(听起来您只需要更改您的SMTP服务器): 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | 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();  |  
  
 
 其他人在上面有很好的答案,但我想在这里添加一个关于我经验的注释。我发现,当使用gmail作为我的webapp的出站SMTP服务器时,gmail只允许我发送大约10封邮件,然后用反垃圾邮件响应进行响应,我必须手动单步执行才能重新启用SMTP访问。我发送的电子邮件不是垃圾邮件,而是用户在我的系统中注册时的网站"欢迎"电子邮件。所以,YMMV和我不会依赖Gmail来制作webapp。如果你代表一个用户发送电子邮件,比如一个已安装的桌面应用程序(用户在那里输入自己的Gmail凭据),你可能会没事的。 另外,如果您使用的是Spring,那么这里有一个工作配置,可以将gmail用于出站SMTP: 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | <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>  |  
  
 即使这个问题已经关闭,我想发布一个计数器的解决方案,但是现在使用简单的Java邮件(开源JavaMail SMTP包装器): 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | 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);  |  
  
 我下面的完整代码运行良好: 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   | 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(); 
   } 
} 
}  |  
  
。 
 最低要求: 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | 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); 
    } 
 
}  |  
  
。 
 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
   | //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; 
        } 
    } 
 
}  |  
  
。 
 当需要在同一个JVM中的任意位置设置多个SMTP会话时,发布的代码解决方案可能会导致问题。 Javamail常见问题解答建议使用 
1
   | Session.getInstance(properties);  |  
  
而不是 
1
   | Session.getDefaultInstance(properties);  |  
  
。 因为getdefault将只使用第一次调用时给定的属性。默认实例的所有后续使用都将忽略属性更改。 参见http://www. Oracle .COM/TeaTeWorks/Java/Faq-1354 7.html 
 这就是我要做的,当我想发送电子邮件附件,工作很好。:) 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   |  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); 
        } 
    } 
 
}  |  
  
。 
 如果您想在Javamail API中使用outlook,请使用 
号 作为更多和完整工作代码的主机,请查看此答案。 
 这是一个简单易用的类,用于向Gmail发送电子邮件。您需要将JavaMail库添加到构建路径中,或者只使用Maven。 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
   | 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; 
    } 
}  |  
  
号 示例用法: 
1 2 3 4 5 6 7
   | 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();  |  
  
号 
 
 嗨,试试这个代码…… 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
   | 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(); 
        } 
    } 
}  |  
  
 一个简单的途径是为pop3访问配置/启用gmail帐户。这将允许您通过Gmail服务器通过普通的SMTP发送出去。 然后通过smtp.gmail.com(端口587)发送。 
 
  
 |