介绍
我们有时候需要在注册的时候对用户加以限制,这样的话,就可以有效地避免恶意注册,也可以有效地核实用户身份。那么我们就可以利用SMTP(Simple Mail Transfer Protocal)简单邮件传输协议来向用户发送这一条激活邮件。
SMTP协议属于TCP/IP协议簇,使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器,具体的知识有关于计算机网络。在这里我们要知道监听端口是25,其工作模式有两种:发送SMTP,接收SMTP。下面我们来看怎么用Java代码实现向目的邮箱发送一条邮件。
准备
首先我们需要一个jar,叫做mail.jar。
然后我们要开启一个邮箱的SMTP服务当做我们的服务器,这里我用的是我的@163网易邮箱
如上图:圈起来的部分是需要注意的地方,下面会有提到
实现
首先我们要知道要想发送邮件,协议,目标人,发件人,标题,内容等都有需要有,那么我们来将它封装成为一个JavaBean:
要注意的是,我们的收件人,是可以为多个的,这里我们可以将收件人定义为一个字符串数组
/**
* MailBean
* @author lsy
*
*/
public class MailBean {
private String[] aidPerson; //目标邮件人
private String sendPerson; // 发件人
private String host; //SMTP主机
private String username; //发件人的用户名
private String password; //发件人的授权码
private String subject; //邮件主题
private String content; //邮件正文
public MailBean() {
}
public MailBean(String[] aidPerson, String sendPerson, String host, String username, String password,
String subject, String content) {
super();
this.aidPerson = aidPerson;
this.sendPerson = sendPerson;
this.host = host;
this.username = username;
this.password = password;
this.subject = subject;
this.content = content;
}
public String[] getAidPerson() {
return aidPerson;
}
public void setAidPerson(String[] aidPerson) {
this.aidPerson = aidPerson;
}
public String getSendPerson() {
return sendPerson;
}
public void setSendPerson(String sendPerson) {
this.sendPerson = sendPerson;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "MailBean [aidPerson=" + Arrays.toString(aidPerson) + ", sendPerson=" + sendPerson + ", host=" + host
+ ", username=" + username + ", password=" + password + ", subject=" + subject + ", content=" + content
+ "]";
}
}
执行发送邮件的类:
password不是你邮箱的登录密码,而是你开通服务的时候。你设置的第三方邮件客户端的授权码。我曾经就一直在用邮箱密码作为password,结果一直报错,后来才知道用授权码。
/**
* 发送邮件
* @author lsy
*
*/
public class SendMail {
public boolean sendMail(MailBean mb) {
String host = mb.getHost(); //SMTP主机
String username = mb.getUsername();
String password = mb.getPassword(); //授权码
String[] aidPerson = mb.getAidPerson(); //目标人数组
String sendPerson = mb.getSendPerson();
String subject = mb.getSubject();
String content = mb.getContent();
try {
Properties props = System.getProperties();
props.put("mail.smtp.host", host); // 设置SMTP的主机
props.put("mail.smtp.auth", "true"); // 需要经过验证
//获取发送邮件的Session对象 username 是你的用户名 password 是你的授权码
Session session = Session.getInstance(props, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
//根据session对象,获取待发送的邮件消息
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(sendPerson));
// 要发送的用户邮件地址,可以设置数组 这里将它循环放入地址数组中
InternetAddress[] address = new InternetAddress[aidPerson.length];
for(int i = 0 ; i < aidPerson.length ; i++){
address[i] = new InternetAddress(aidPerson[i]);
}
msg.setRecipients(Message.RecipientType.TO, address);
//邮件的标题
msg.setSubject(subject);
//内容 设置内容的格式为html格式
msg.setContent(content , "text/html;charset=utf-8");
msg.setSentDate(new Date());
//发送
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
return false;
} catch (MessagingException e) {
e.printStackTrace();
return false;
}
return true;
}
}
写一个测试:
/**
* 测试
* @author lsy
*/
public class TestJavaMail {
public static void main(String[] args) {
MailBean mail = new MailBean();
mail.setHost("smtp.163.com"); //SMTP主机
mail.setUsername("xxx"); //你的邮箱用户名
mail.setPassword("xxx"); // 你的授权码
mail.setSendPerson("xxx@163.com"); //你的邮箱
String[] strs = { "xxx"}; //目标邮件数组
mail.setAidPerson(strs);
mail.setSubject("欢迎注册");
//生成一个令牌
long time = System.currentTimeMillis();
String token = PasswordUtil.getMd5("154653380" + "sss" + time);
StringBuffer sb = new StringBuffer("<table align=\"center\" width=\"600\"><tbody><tr>"
+ "<td align=\"left\" style=\" color:#FFFFFF; padding: 5px 0px 5px 25px; font-size:30px; background-color: #2dbe60;\">"
+ "欢迎注册</td></tr><tr><td style=\" font-size:18px; line-height:26px; font-weight:100; padding: 5px 0px 5px 25px \">"
+ "您好, LIUSONGYI2<br><br> \"购物中国网上商城\" 欢迎您的注册!<br><br> 请点击下面链接激活账号,24小时生效,否则重新注册账号,链接只能使用一次,请尽快激活!<br /><br />");
sb.append("<a href=\"http://localhost:8080/MyShopApp/checkMail.do?id=");
sb.append(1); // id
sb.append("&token=");
sb.append(token); // token 激活码/令牌
sb.append("\">http://localhost:8080/MyShopApp/checkMail.do?id=" + 1 + "&token=" + token
+ "</a><br/><br>如果以上链接无法点击,请把上面网页地址复制到浏览器地址栏中打开</td></tr>");
sb.append("<tr><td width=\"100%\" align=\"center\" style=\"padding:10px 0 10px 0px; font-size: 10px;\">");
sb.append(
"<hr /> 这封邮件由作者发出<br> 联系电话: xxx; E-mail : Lojze_email@163.com<br> ©2017- Lojze</td></tr></tbody></table>");
//设置邮件正文
mail.setContent(sb.toString());
//发送
boolean send = new SendMail().sendMail(mail);
if (send) {
System.out.println("发送成功");
} else {
System.out.println("发送失败");
}
}
}
结果:
当然这是最简单的一种,也可以发送带有附件的邮件,在这里我只用做一个注册激活邮箱,激活链接是一个在用户注册的时候生成的激活码。
可能遇到的问题:
有很大的可能会报这个错误:
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
从报错可知,无法连接SMTP服务主机,端口号25
首先检查一下 ping
打开cmd 输入: ping smtp.163.com
如果出现以下内容,证明可连接
其他报这个的错误可能是你的授权码之类的错误,好好检查一下代码。