Java 发送邮件


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

你可以在 JavaMail (Version 1.2) 下载最新的版本。

你可以再 在JAF (Version 1.1.1)下载最新的版本。

下载并解压这些文件,最上层文件夹你会发现很多的jar文件。你需要将mail.jar和activation.jar 添加到你的CLASSPATH中。

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

发送一封简单的 E-mail

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

  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,
  2. Address[] addresses)
  3. throws MessagingException

下面是对于参数的描述:

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

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

发送一封HTML E-mail

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

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

  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的例子。假设你的localhost已经连接到网络。

  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服务 ,如下图所示:

qqmailset

Java 代码如下:

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