Java 发送邮件

使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) 。

  • 您可以从 Java 网站下载最新版本的 JavaMail,打开网页右侧有个 Downloads 链接,点击它下载。

  • 您可以从 Java 网站下载最新版本的 JAF(版本 1.1.1)

下载并解压缩这些文件,在新创建的顶层目录中,您会发现这两个应用程序的一些 jar 文件。您需要把 mail.jaractivation.jar 文件添加到您的 CLASSPATH 中。

如果你使用第三方邮件服务器如QQ的SMTP服务器,可查看文章底部用户认证完整的实例。

发送一封简单的 E-mail

下面是一个发送简单E-mail的例子。假设你的本地主机已经连接到网络。

SendEmail.java 文件代码:

  1. // 文件名 SendEmail.java
  2. import java.util.*;
  3. import javax.mail.*;
  4. import javax.mail.internet.*;
  5. import javax.activation.*;
  6. public class SendEmail
  7. {
  8. public static void main(String [] args)
  9. {
  10. // 收件人电子邮箱
  11. String to = "abcd@gmail.com";
  12. // 发件人电子邮箱
  13. String from = "web@gmail.com";
  14. // 指定发送邮件的主机为 localhost
  15. String host = "localhost";
  16. // 获取系统属性
  17. Properties properties = System.getProperties();
  18. // 设置邮件服务器
  19. properties.setProperty("mail.smtp.host", host);
  20. // 获取默认session对象
  21. Session session = Session.getDefaultInstance(properties);
  22. try{
  23. // 创建默认的 MimeMessage 对象
  24. MimeMessage message = new MimeMessage(session);
  25. // Set From: 头部头字段
  26. message.setFrom(new InternetAddress(from));
  27. // Set To: 头部头字段
  28. message.addRecipient(Message.RecipientType.TO,
  29. new InternetAddress(to));
  30. // Set Subject: 头部头字段
  31. message.setSubject("This is the Subject Line!");
  32. // 设置消息体
  33. message.setText("This is actual message");
  34. // 发送消息
  35. Transport.send(message);
  36. System.out.println("Sent message successfully....");
  37. }catch (MessagingException mex) {
  38. mex.printStackTrace();
  39. }
  40. }
  41. }

编译并运行这个程序来发送一封简单的E-mail:

  1. $ java SendEmail
  2. Sent message successfully....

如果你想发送一封e-mail给多个收件人,那么使用下面的方法来指定多个收件人ID:

  1. void addRecipients(Message.RecipientType type, Address[] addresses)
  2. throws MessagingException

下面是对于参数的描述:

  • type:要被设置为 TO, CC 或者 BCC,这里 CC 代表抄送、BCC 代表秘密抄送。举例:Message.RecipientType.TO

  • addresses: 这是 email ID 的数组。在指定电子邮件 ID 时,你将需要使用 InternetAddress() 方法。

发送一封 HTML E-mail

下面是一个发送 HTML E-mail 的例子。假设你的本地主机已经连接到网络。

和上一个例子很相似,除了我们要使用 setContent() 方法来通过第二个参数为 "text/html",来设置内容来指定要发送HTML 内容。

SendHTMLEmail.java 文件代码:

  1. // 文件名 SendHTMLEmail.java
  2. import java.util.*;
  3. import javax.mail.*;
  4. import javax.mail.internet.*;
  5. import javax.activation.*;
  6. public class SendHTMLEmail
  7. {
  8. public static void main(String [] args)
  9. {
  10. // 收件人电子邮箱
  11. String to = "abcd@gmail.com";
  12. // 发件人电子邮箱
  13. String from = "web@gmail.com";
  14. // 指定发送邮件的主机为 localhost
  15. String host = "localhost";
  16. // 获取系统属性
  17. Properties properties = System.getProperties();
  18. // 设置邮件服务器
  19. properties.setProperty("mail.smtp.host", host);
  20. // 获取默认的 Session 对象。
  21. Session session = Session.getDefaultInstance(properties);
  22. try{
  23. // 创建默认的 MimeMessage 对象。
  24. MimeMessage message = new MimeMessage(session);
  25. // Set From: 头部头字段
  26. message.setFrom(new InternetAddress(from));
  27. // Set To: 头部头字段
  28. message.addRecipient(Message.RecipientType.TO,
  29. new InternetAddress(to));
  30. // Set Subject: 头字段
  31. message.setSubject("This is the Subject Line!");
  32. // 发送 HTML 消息, 可以插入html标签
  33. message.setContent("<h1>This is actual message</h1>",
  34. "text/html" );
  35. // 发送消息
  36. Transport.send(message);
  37. System.out.println("Sent message successfully....");
  38. }catch (MessagingException mex) {
  39. mex.printStackTrace();
  40. }
  41. }
  42. }

编译并运行此程序来发送HTML e-mail:

  1. $ java SendHTMLEmail
  2. Sent message successfully....

发送带有附件的 E-mail

下面是一个发送带有附件的 E-mail的例子。假设你的本地主机已经连接到网络。

SendFileEmail.java 文件代码:

  1. // 文件名 SendFileEmail.java
  2. import java.util.*;
  3. import javax.mail.*;
  4. import javax.mail.internet.*;
  5. import javax.activation.*;
  6. public class SendFileEmail
  7. {
  8. public static void main(String [] args)
  9. {
  10. // 收件人电子邮箱
  11. String to = "abcd@gmail.com";
  12. // 发件人电子邮箱
  13. String from = "web@gmail.com";
  14. // 指定发送邮件的主机为 localhost
  15. String host = "localhost";
  16. // 获取系统属性
  17. Properties properties = System.getProperties();
  18. // 设置邮件服务器
  19. properties.setProperty("mail.smtp.host", host);
  20. // 获取默认的 Session 对象。
  21. Session session = Session.getDefaultInstance(properties);
  22. try{
  23. // 创建默认的 MimeMessage 对象。
  24. MimeMessage message = new MimeMessage(session);
  25. // Set From: 头部头字段
  26. message.setFrom(new InternetAddress(from));
  27. // Set To: 头部头字段
  28. message.addRecipient(Message.RecipientType.TO,
  29. new InternetAddress(to));
  30. // Set Subject: 头字段
  31. message.setSubject("This is the Subject Line!");
  32. // 创建消息部分
  33. BodyPart messageBodyPart = new MimeBodyPart();
  34. // 消息
  35. messageBodyPart.setText("This is message body");
  36. // 创建多重消息
  37. Multipart multipart = new MimeMultipart();
  38. // 设置文本消息部分
  39. multipart.addBodyPart(messageBodyPart);
  40. // 附件部分
  41. messageBodyPart = new MimeBodyPart();
  42. String filename = "file.txt";
  43. DataSource source = new FileDataSource(filename);
  44. messageBodyPart.setDataHandler(new DataHandler(source));
  45. messageBodyPart.setFileName(filename);
  46. multipart.addBodyPart(messageBodyPart);
  47. // 发送完整消息
  48. message.setContent(multipart );
  49. // 发送消息
  50. Transport.send(message);
  51. System.out.println("Sent message successfully....");
  52. }catch (MessagingException mex) {
  53. mex.printStackTrace();
  54. }
  55. }
  56. }

编译并运行你的程序来发送一封带有附件的邮件。

  1. $ java SendFileEmail
  2. Sent message successfully....

用户认证部分

如果需要提供用户名和密码给e-mail服务器来达到用户认证的目的,你可以通过如下设置来完成:

  1. props.put("mail.smtp.auth", "true");
  2. props.setProperty("mail.user", "myuser");
  3. props.setProperty("mail.password", "mypwd");

e-mail其他的发送机制和上述保持一致。

需要用户名密码验证邮件发送实例:

本实例以 QQ 邮件服务器为例,你需要在登录QQ邮箱后台在"设置"=》账号中开启POP3/SMTP服务 ,如下图所示:

Java 发送邮件 - 图1

QQ 邮箱通过生成授权码来设置密码:

Java 发送邮件 - 图2

Java 代码如下:

SendEmail2.java 文件代码:

  1. // 需要用户名密码邮件发送实例
  2. //文件名 SendEmail2.java
  3. //本实例以QQ邮箱为例,你需要在qq后台设置
  4. import java.util.Properties;
  5. import javax.mail.Authenticator;
  6. import javax.mail.Message;
  7. import javax.mail.MessagingException;
  8. import javax.mail.PasswordAuthentication;
  9. import javax.mail.Session;
  10. import javax.mail.Transport;
  11. import javax.mail.internet.InternetAddress;
  12. import javax.mail.internet.MimeMessage;
  13. public class SendEmail2
  14. {
  15. public static void main(String [] args)
  16. {
  17. // 收件人电子邮箱
  18. String to = "xxx@qq.com";
  19. // 发件人电子邮箱
  20. String from = "xxx@qq.com";
  21. // 指定发送邮件的主机为 smtp.qq.com
  22. String host = "smtp.qq.com"; //QQ 邮件服务器
  23. // 获取系统属性
  24. Properties properties = System.getProperties();
  25. // 设置邮件服务器
  26. properties.setProperty("mail.smtp.host", host);
  27. properties.put("mail.smtp.auth", "true");
  28. // 获取默认session对象
  29. Session session = Session.getDefaultInstance(properties,new Authenticator(){
  30. public PasswordAuthentication getPasswordAuthentication()
  31. {
  32. return new PasswordAuthentication("xxx@qq.com", "qq邮箱授权码"); //发件人邮件用户名、授权码
  33. }
  34. });
  35. try{
  36. // 创建默认的 MimeMessage 对象
  37. MimeMessage message = new MimeMessage(session);
  38. // Set From: 头部头字段
  39. message.setFrom(new InternetAddress(from));
  40. // Set To: 头部头字段
  41. message.addRecipient(Message.RecipientType.TO,
  42. new InternetAddress(to));
  43. // Set Subject: 头部头字段
  44. message.setSubject("This is the Subject Line!");
  45. // 设置消息体
  46. message.setText("This is actual message");
  47. // 发送消息
  48. Transport.send(message);
  49. System.out.println("Sent message successfully....from runoob.com");
  50. }catch (MessagingException mex) {
  51. mex.printStackTrace();
  52. }
  53. }
  54. }

QQ邮箱,设置SSL加密

  1. // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
  2. MailSSLSocketFactory sf = new MailSSLSocketFactory();
  3. sf.setTrustAllHosts(true);
  4. props.put("mail.smtp.ssl.enable", "true");
  5. props.put("mail.smtp.ssl.socketFactory", sf);

参考消息:

  1. import java.security.GeneralSecurityException;
  2. import java.util.Properties;
  3. import javax.mail.Authenticator;
  4. import javax.mail.Message;
  5. import javax.mail.MessagingException;
  6. import javax.mail.PasswordAuthentication;
  7. import javax.mail.Session;
  8. import javax.mail.Transport;
  9. import javax.mail.internet.InternetAddress;
  10. import javax.mail.internet.MimeMessage;
  11. import com.sun.mail.util.MailSSLSocketFactory;
  12. public class SendEmail
  13. {
  14. public static void main(String [] args) throws GeneralSecurityException
  15. {
  16. // 收件人电子邮箱
  17. String to = "XXXXX@qq.com";
  18. // 发件人电子邮箱
  19. String from = "XXXXXX@qq.com";
  20. // 指定发送邮件的主机为 smtp.qq.com
  21. String host = "smtp.qq.com"; //QQ 邮件服务器
  22. // 获取系统属性
  23. Properties properties = System.getProperties();
  24. // 设置邮件服务器
  25. properties.setProperty("mail.smtp.host", host);
  26. properties.put("mail.smtp.auth", "true");
  27. MailSSLSocketFactory sf = new MailSSLSocketFactory();
  28. sf.setTrustAllHosts(true);
  29. properties.put("mail.smtp.ssl.enable", "true");
  30. properties.put("mail.smtp.ssl.socketFactory", sf);
  31. // 获取默认session对象
  32. Session session = Session.getDefaultInstance(properties,new Authenticator(){
  33. public PasswordAuthentication getPasswordAuthentication()
  34. {
  35. return new PasswordAuthentication("429240967@qq.com", "授权的 QQ 邮箱密码"); //发件人邮件用户名、密码
  36. }
  37. });
  38. try{
  39. // 创建默认的 MimeMessage 对象
  40. MimeMessage message = new MimeMessage(session);
  41. // Set From: 头部头字段
  42. message.setFrom(new InternetAddress(from));
  43. // Set To: 头部头字段
  44. message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
  45. // Set Subject: 头部头字段
  46. message.setSubject("This is the Subject Line!");
  47. // 设置消息体
  48. message.setText("This is actual message");
  49. // 发送消息
  50. Transport.send(message);
  51. System.out.println("Sent message successfully....from runoob.com");
  52. }catch (MessagingException mex) {
  53. mex.printStackTrace();
  54. }
  55. }
  56. }