今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题。为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用。呵呵 

注意:要先导入javamail的mail.jar包。

以下三段代码是我的全部代码,朋友们如果想用,直接复制即可。

第一个类:MailSenderInfo.java

1 package com.util.mail;
  2 
  3 import java.util.Properties;
  4 
  5 /**
  6  * 发送邮件需要使用的基本信息
  7  */
  8 public class MailSenderInfo {
  9     
 10     //发送邮件的服务器的IP和端口
 11     private String mailServerHost;
 12     private String mailServerPort = "25";
 13     
 14     //邮件发送者的地址
 15     private String fromAddress;
 16     //邮件接收者的地址
 17     private String toAddress;
 18     //登录邮件发送服务器的用户名和密码
 19     private String userName;
 20     private String password;
 21     
 22     //是否需要身份验证
 23     private boolean validate = false;
 24     
 25     //邮件主题
 26     private String subject;
 27     //邮件的文本内容
 28     private String content;
 29     //邮件附件的文件名
 30     private String[] attachFileNames;
 31     
 32     /**
 33      * 获得邮件会话属性
 34      */
 35     public Properties getProperties() {
 36         Properties p = new Properties();
 37         p.put("mail.smtp.host", this.mailServerHost);
 38         p.put("mail.smtp.port", this.mailServerHost);
 39         p.put("mail.smtp.auth", validate ? "true" : "false");
 40         return p;
 41     }
 42 
 43     public String getMailServerHost() {
 44         return mailServerHost;
 45     }
 46 
 47     public void setMailServerHost(String mailServerHost) {
 48         this.mailServerHost = mailServerHost;
 49     }
 50 
 51     public String getMailServerPort() {
 52         return mailServerPort;
 53     }
 54 
 55     public void setMailServerPort(String mailServerPort) {
 56         this.mailServerPort = mailServerPort;
 57     }
 58 
 59     public boolean isValidate() {
 60         return validate;
 61     }
 62 
 63     public void setValidate(boolean validate) {
 64         this.validate = validate;
 65     }
 66 
 67     public String[] getAttachFileNames() {
 68         return attachFileNames;
 69     }
 70 
 71     public void setAttachFileNames(String[] attachFileNames) {
 72         this.attachFileNames = attachFileNames;
 73     }
 74 
 75     public String getFromAddress() {
 76         return fromAddress;
 77     }
 78 
 79     public void setFromAddress(String fromAddress) {
 80         this.fromAddress = fromAddress;
 81     }
 82 
 83     public String getPassword() {
 84         return password;
 85     }
 86 
 87     public void setPassword(String password) {
 88         this.password = password;
 89     }
 90 
 91     public String getToAddress() {
 92         return toAddress;
 93     }
 94 
 95     public void setToAddress(String toAddress) {
 96         this.toAddress = toAddress;
 97     }
 98 
 99     public String getUserName() {
100         return userName;
101     }
102 
103     public void setUserName(String userName) {
104         this.userName = userName;
105     }
106 
107     public String getSubject() {
108         return subject;
109     }
110 
111     public void setSubject(String subject) {
112         this.subject = subject;
113     }
114 
115     public String getContent() {
116         return content;
117     }
118 
119     public void setContent(String content) {
120         this.content = content;
121     }
122     
123 }

第二个类:SimpleMailSender.java

1 package com.util.mail;
  2 
  3 import java.util.Date;
  4 import java.util.Properties;
  5 
  6 import javax.mail.Address;
  7 import javax.mail.BodyPart;
  8 import javax.mail.Message;
  9 import javax.mail.MessagingException;
 10 import javax.mail.Multipart;
 11 import javax.mail.Session;
 12 import javax.mail.Transport;
 13 import javax.mail.internet.AddressException;
 14 import javax.mail.internet.InternetAddress;
 15 import javax.mail.internet.MimeBodyPart;
 16 import javax.mail.internet.MimeMessage;
 17 import javax.mail.internet.MimeMultipart;
 18 
 19 /**
 20  * 简单邮件(不带附件)发送器
 21  */
 22 public class SimpleMailSender {
 23     
 24     /**
 25      * 以文本格式发送邮件
 26      * @param mailInfo 待发送的邮件的信息
 27      */
 28     public boolean sendTextMail(MailSenderInfo mailInfo) {
 29         //判断是否需要身份认证
 30         MyAuthenticator authenticator = null;
 31         Properties pro = mailInfo.getProperties();
 32         
 33         if (mailInfo.isValidate()) {
 34             //如果需要身份认证,则创建一个密码验证器
 35             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
 36         }
 37         
 38         //根据邮件会话属性和密码验证器构造一个发送邮件的session
 39         Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
 40         
 41         try {
 42             //根据session创建一个邮件消息
 43             Message mailMessage = new MimeMessage(sendMailSession);
 44             //创建邮件发送者地址
 45             Address from = new InternetAddress(mailInfo.getFromAddress());
 46             //设置邮件消息的发送者
 47             mailMessage.setFrom(from);
 48             //创建邮件的接收者地址,并设置到邮件消息中
 49             Address to = new InternetAddress(mailInfo.getToAddress());
 50             // Message.RecipientType.TO属性表示接收者的类型为TO 
 51             mailMessage.setRecipient(Message.RecipientType.TO, to);
 52             // 设置邮件消息的主题
 53             mailMessage.setSubject(mailInfo.getSubject());
 54             // 设置邮件消息发送的时间
 55             mailMessage.setSentDate(new Date());
 56             // 设置邮件消息的主要内容
 57             String mailContent = mailInfo.getContent();
 58              mailMessage.setText(mailContent);
 59              // 发送邮件
 60              Transport.send(mailMessage);
 61              return true;
 62         } catch (AddressException e) {
 63             e.printStackTrace();
 64         } catch (MessagingException e) {
 65             e.printStackTrace();
 66         }
 67         return false;
 68     }
 69     
 70     /**
 71      * 以Html格式发送邮件
 72      * @param mailInfo 待发送的邮件的信息
 73      */
 74     public boolean sendHtmlMail(MailSenderInfo mailInfo) {
 75         //判断是否需要身份认证
 76         MyAuthenticator authenticator = null;
 77         Properties pro = mailInfo.getProperties();
 78         
 79         if (mailInfo.isValidate()) {
 80             //如果需要身份认证,则创建一个密码验证器
 81             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
 82         }
 83         //根据邮件会话属性和密码验证器构造一个发送邮件的session
 84         Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
 85         
 86         try {
 87             //根据session创建一个邮件消息
 88             Message mailMessage = new MimeMessage(sendMailSession);
 89             //创建邮件发送者地址
 90             Address from = new InternetAddress(mailInfo.getFromAddress());
 91             //设置邮件消息的发送者
 92             mailMessage.setFrom(from);
 93             //创建邮件的接收者地址,并设置到邮件消息中
 94             Address to = new InternetAddress(mailInfo.getToAddress());
 95             // Message.RecipientType.TO属性表示接收者的类型为TO 
 96             mailMessage.setRecipient(Message.RecipientType.TO, to);
 97             // 设置邮件消息的主题
 98             mailMessage.setSubject(mailInfo.getSubject());
 99             // 设置邮件消息发送的时间
100             mailMessage.setSentDate(new Date());
101             // MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
102             Multipart mainPart = new MimeMultipart();
103             // 创建一个包含HTML内容的MimeBodyPart
104             BodyPart html = new MimeBodyPart();
105             //设置HTML内容
106             html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
107             mainPart.addBodyPart(html);
108             //将mainPart对象设置为邮件内容
109              mailMessage.setContent(mainPart);
110              // 发送邮件
111              Transport.send(mailMessage);
112              return true;
113         } catch (AddressException e) {
114             e.printStackTrace();
115         } catch (MessagingException e) {
116             e.printStackTrace();
117         }
118         return false;
119     }
120 
121 }

第三个类:MyAuthenticator.java

1 package com.util.mail;
 2 
 3 import javax.mail.*;
 4 
 5 /**
 6  * 身份认证
 7  */
 8 public class MyAuthenticator extends Authenticator {
 9     
10     String userName = null;
11     String password = null;
12     
13     public MyAuthenticator(){
14         
15     }
16     
17     public MyAuthenticator(String username, String password) {
18         this.userName = username;
19         this.password = password;
20     }
21 
22     @Override
23     protected PasswordAuthentication getPasswordAuthentication() {
24         return new PasswordAuthentication(userName, password);
25     }
26 
27 }

下面给出使用上面三个类的代码:

1 package com.util.mail;
 2 
 3 /**
 4  * 发送邮件
 5  */
 6 public class Mail {
 7 
 8     /**
 9      * @param args
10      */
11     public static void main(String[] args) {
12         //这个类主要是设置邮件
13         MailSenderInfo mailInfo = new MailSenderInfo();
14         mailInfo.setMailServerHost("smtp.126.com");
15         mailInfo.setMailServerPort("25");
16         mailInfo.setValidate(true);
17         mailInfo.setUserName("test@126.com");
18         mailInfo.setPassword("test");
19         mailInfo.setFromAddress("test@126.com");
20         mailInfo.setToAddress("test@qq.com");
21         mailInfo.setSubject("设置邮箱标题 如http://www.guihua.org 中国桂花网");
22         mailInfo.setContent("设置邮箱内容 如http://www.guihua.org 中国桂花网 是中国最大桂花网站==");
23         //这个类主要来发送邮件
24         SimpleMailSender sms = new SimpleMailSender();
25         sms.sendTextMail(mailInfo);
26         sms.sendHtmlMail(mailInfo);
27     }
28 
29 }

最后,给出朋友们几个注意的地方:
1、使用此代码你可以完成你的javamail的邮件发送功能。三个类缺一不可。
2、这三个类我打包是用的com.util.mail包,如果不喜欢,你可以自己改,但三个类文件必须在同一个包中
3、不要使用你刚刚注册过的邮箱在程序中发邮件,如果你的163邮箱是刚注册不久,那你就不要使用“smtp.163.com”。因为你发不出去。刚注册的邮箱是不会给你这种权限的,也就是你不能通过验证。要使用你经常用的邮箱,而且时间比较长的。
4、另一个问题就是mailInfo.setMailServerHost("smtp.163.com");mailInfo.setFromAddress("han2000lei@163.com");这两句话。即如果你使用163smtp服务器,那么发送邮件地址就必须用163的邮箱,如果不的话,是不会发送成功的。
5、关于javamail验证错误的问题,网上的解释有很多,但我看见的只有一个。就是我的第三个类。你只要复制全了代码,我想是不会有问题的。