今天学习了一下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验证错误的问题,网上的解释有很多,但我看见的只有一个。就是我的第三个类。你只要复制全了代码,我想是不会有问题的。