1.在编程中,我们可以使用JavaMail来进行邮件传输。
我们可以在自己的电脑上安装安装邮件服务器apache-james-2.3.2,或者直接使用门户网站的邮件服务器来进行邮件传输。
本篇讲述使用门户网站的邮件服务器,用java程序来进行邮件传输。
2.邮件传输的协议有SMTP(简单邮件传输协议)和POP3(邮局协议)。
并不是所有的提供邮箱的网站都会对用户开通SMTP服务器。可以使用的SMTP服务器都需要身份验证的,当然是不可以匿名发邮件的啦。下面给出了腾讯和网易公布的SMTP和POP3服务器地址。
2.1QQ邮箱服务器
2.2网易邮箱服务器
3.编程使用SMTP发送邮件(不带附件的)
3.1 MailSenderInfo.java给出要发送邮件的基本信息(类似JavaBean文件),该文件不需要改动
View Code
1 package src;
2 /**
3 * 发送邮件需要使用的基本信息
4 */
5 import java.util.Properties;
6 public class MailSenderInfo {
7 // 发送邮件的服务器的IP和端口
8 private String mailServerHost;
9 private String mailServerPort = "25";
10 // 邮件发送者的地址
11 private String fromAddress;
12 // 邮件接收者的地址
13 private String toAddress;
14 // 登陆邮件发送服务器的用户名和密码
15 private String userName;
16 private String password;
17 // 是否需要身份验证
18 private boolean validate = false;
19 // 邮件主题
20 private String subject;
21 // 邮件的文本内容
22 private String content;
23 // 邮件附件的文件名
24 private String[] attachFileNames;
25 /**
26 * 获得邮件会话属性
27 */
28 public Properties getProperties(){
29 Properties p = new Properties();
30 p.put("mail.smtp.host", this.mailServerHost);
31 p.put("mail.smtp.port", this.mailServerPort);
32 p.put("mail.smtp.auth", validate ? "true" : "false");
33 return p;
34 }
35 public String getMailServerHost() {
36 return mailServerHost;
37 }
38 public void setMailServerHost(String mailServerHost) {
39 this.mailServerHost = mailServerHost;
40 }
41 public String getMailServerPort() {
42 return mailServerPort;
43 }
44 public void setMailServerPort(String mailServerPort) {
45 this.mailServerPort = mailServerPort;
46 }
47 public boolean isValidate() {
48 return validate;
49 }
50 public void setValidate(boolean validate) {
51 this.validate = validate;
52 }
53 public String[] getAttachFileNames() {
54 return attachFileNames;
55 }
56 public void setAttachFileNames(String[] fileNames) {
57 this.attachFileNames = fileNames;
58 }
59 public String getFromAddress() {
60 return fromAddress;
61 }
62 public void setFromAddress(String fromAddress) {
63 this.fromAddress = fromAddress;
64 }
65 public String getPassword() {
66 return password;
67 }
68 public void setPassword(String password) {
69 this.password = password;
70 }
71 public String getToAddress() {
72 return toAddress;
73 }
74 public void setToAddress(String toAddress) {
75 this.toAddress = toAddress;
76 }
77 public String getUserName() {
78 return userName;
79 }
80 public void setUserName(String userName) {
81 this.userName = userName;
82 }
83 public String getSubject() {
84 return subject;
85 }
86 public void setSubject(String subject) {
87 this.subject = subject;
88 }
89 public String getContent() {
90 return content;
91 }
92 public void setContent(String textContent) {
93 this.content = textContent;
94 }
95 }
3.2 SimpleMailSender.java,设置邮件的通常数据。不需要改动
View Code
1 package src;
2
3 import java.util.Date;
4 import java.util.Properties;
5 import javax.mail.Address;
6 import javax.mail.BodyPart;
7 import javax.mail.Message;
8 import javax.mail.MessagingException;
9 import javax.mail.Multipart;
10 import javax.mail.Session;
11 import javax.mail.Transport;
12 import javax.mail.internet.InternetAddress;
13 import javax.mail.internet.MimeBodyPart;
14 import javax.mail.internet.MimeMessage;
15 import javax.mail.internet.MimeMultipart;
16
17 /**
18 * 简单邮件(不带附件的邮件)发送器
19 */
20 public class SimpleMailSender {
21 /**
22 * 以文本格式发送邮件
23 * @param mailInfo 待发送的邮件的信息
24 */
25 public boolean sendTextMail(MailSenderInfo mailInfo) {
26 // 判断是否需要身份认证
27 MyAuthenticator authenticator = null;
28 Properties pro = mailInfo.getProperties();
29 if (mailInfo.isValidate()) {
30 // 如果需要身份认证,则创建一个密码验证器
31 authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
32 }
33 // 根据邮件会话属性和密码验证器构造一个发送邮件的session
34 Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
35 try {
36 // 根据session创建一个邮件消息
37 Message mailMessage = new MimeMessage(sendMailSession);
38 // 创建邮件发送者地址
39 Address from = new InternetAddress(mailInfo.getFromAddress());
40 // 设置邮件消息的发送者
41 mailMessage.setFrom(from);
42 // 创建邮件的接收者地址,并设置到邮件消息中
43 Address to = new InternetAddress(mailInfo.getToAddress());
44 mailMessage.setRecipient(Message.RecipientType.TO,to);
45 // 设置邮件消息的主题
46 mailMessage.setSubject(mailInfo.getSubject());
47 // 设置邮件消息发送的时间
48 mailMessage.setSentDate(new Date());
49 // 设置邮件消息的主要内容
50 String mailContent = mailInfo.getContent();
51 mailMessage.setText(mailContent);
52 // 发送邮件
53 Transport.send(mailMessage);
54 return true;
55 } catch (MessagingException ex) {
56 ex.printStackTrace();
57 }
58 return false;
59 }
60
61 /**
62 * 以HTML格式发送邮件
63 * @param mailInfo 待发送的邮件信息
64 */
65 public static boolean sendHtmlMail(MailSenderInfo mailInfo){
66 // 判断是否需要身份认证
67 MyAuthenticator authenticator = null;
68 Properties pro = mailInfo.getProperties();
69 //如果需要身份认证,则创建一个密码验证器
70 if (mailInfo.isValidate()) {
71 authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
72 }
73 // 根据邮件会话属性和密码验证器构造一个发送邮件的session
74 Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
75 try {
76 // 根据session创建一个邮件消息
77 Message mailMessage = new MimeMessage(sendMailSession);
78 // 创建邮件发送者地址
79 Address from = new InternetAddress(mailInfo.getFromAddress());
80 // 设置邮件消息的发送者
81 mailMessage.setFrom(from);
82 // 创建邮件的接收者地址,并设置到邮件消息中
83 Address to = new InternetAddress(mailInfo.getToAddress());
84 // Message.RecipientType.TO属性表示接收者的类型为TO
85 mailMessage.setRecipient(Message.RecipientType.TO,to);
86 // 设置邮件消息的主题
87 mailMessage.setSubject(mailInfo.getSubject());
88 // 设置邮件消息发送的时间
89 mailMessage.setSentDate(new Date());
90 // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
91 Multipart mainPart = new MimeMultipart();
92 // 创建一个包含HTML内容的MimeBodyPart
93 BodyPart html = new MimeBodyPart();
94 // 设置HTML内容
95 html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
96 mainPart.addBodyPart(html);
97 // 将MiniMultipart对象设置为邮件内容
98 mailMessage.setContent(mainPart);
99 // 发送邮件
100 Transport.send(mailMessage);
101 return true;
102 } catch (MessagingException ex) {
103 ex.printStackTrace();
104 }
105 return false;
106 }
107 }
3.3 MyAuthenticator.java,需要根据自己的邮箱地址,发送的内容,发送地址,使用的服务器的SMTP网址改动
View Code
1 package src;
2
3 import javax.mail.*;
4
5 public class MyAuthenticator extends Authenticator{
6 String userName=null;
7 String password=null;
8
9 public MyAuthenticator(){
10 }
11 public MyAuthenticator(String username, String password) {
12 this.userName = username;
13 this.password = password;
14 }
15 protected PasswordAuthentication getPasswordAuthentication(){
16 return new PasswordAuthentication(userName, password);
17 }
18
19 public static void main(String[] args){
20 //这个类主要是设置邮件
21 MailSenderInfo mailInfo = new MailSenderInfo();
22 mailInfo.setMailServerHost("smtp.qq.com");
23 mailInfo.setMailServerPort("25");
24 mailInfo.setValidate(true);
25 mailInfo.setUserName("1111111@qq.com"); //自己的邮箱
26 mailInfo.setPassword("QQ88888");//自己的邮箱密码,用于验证
27
28 mailInfo.setFromAddress("1111111@qq.com"); ///自己的邮箱
29 mailInfo.setToAddress("66666666@qq.com"); ///对方的邮箱
30 mailInfo.setSubject("设置邮箱标题");
31 mailInfo.setContent("设置邮箱内容");
32
33 //这个类主要来发送邮件
34 SimpleMailSender sms = new SimpleMailSender();
35 sms.sendTextMail(mailInfo);//发送文体格式
36 sms.sendHtmlMail(mailInfo);//发送html格式
37
38 }
39 }
40
4.使用注意情况
4.1 发送方的邮箱(自己的)必须与程序中使用的服务器的SMTP是一致的。邮件接收方的邮件可以任意。
4.2 因为这只是最简单的邮件传输,不包附件,只有正文部分,并且只是负责邮件的发送,因此只需要SMTP(简单邮件传输协议)。当要读取邮件的时候就必须要使用POP3(邮局协议)。
4.3 程序发邮件可以减少大量的体力劳动。我们也要合理使用,不能捣乱,给其他人大量的发送重复邮件。例如,当用程序给一个邮箱发大量邮件时,可能会被相应的服务器认为是外界攻击。
我给自己的QQ邮箱,用上面的程序做了一个40次的发送循环。在我自己去QQ邮箱手动删除那些邮件的时候,QQ邮箱可能怀疑这是通过恶意程序发来的。下面是QQ邮箱的提示:
4.4 通过程序自己的邮件给多个邮箱发信息,应该能行吧,自己也没有尝试,没有那么多邮箱了。有兴趣的大家可以试试,呵呵。
参考:
http://www.iteye.com/topic/352753