前面已经介绍过使用163邮箱发送邮件激活账号的例子了,本来想着应该千篇一律的,但是这里使用阿里邮箱发送邮件略有不同,更改配置之后总是报错,所以这里记录一下,为以后再次搭建方便,同时如果遇到同样问题的你看到这篇博客解决了,那就更好了。
什么是POP3、SMTP?
1、什么是POP3:
POP3是Post Office Protocol3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3协议的接收邮件服务器,用来接收电子邮件的。
2、什么是SMTP:
SMTP 的全称是“Simple MailTransfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
(SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。)
1,引入的包:
javax.mail
mail
1.4.7
2,邮箱信息在Properties中的相关配置:
smtpServer=smtp.aliyun.com
port=465
fromUserName=你的阿里邮箱账号
fromUserPassword=你的邮箱密码
这里注意了,很容易出错,网上一搜基本的教程都是这样的:smtpServer=smtp.aliyun.com
也就是properties.put("mail.smtp.host", smtp.aliyun.com);
但如果你使用的是阿里的企业邮箱,这样把邮箱的配置服务器地址照搬过来的做法是有问题的。
这里应该使用自己企业的域名地址,比如我的域名是amuxia.com(当然这个也是假的,举个例子,哈哈),这里就应该配置smtp.amuxia.com。否则报错:
这里应该注意一下。
3,邮箱实体类(设置邮箱、邮件的相关信息)
public class EmailInfo {
private final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
private String smtpServer;
// SMTP服务器地址
private String port; // 端口
private String fromUserName;
// 登录SMTP服务器的用户名,发送人邮箱地址
private String fromUserPassword;
// 登录SMTP服务器的密码
private String toUser; // 收件人
private String subject; // 邮件主题
private String content; // 邮件正文
public EmailInfo() {
}
public EmailInfo(String toUser, String subject, String content) {
this.toUser = toUser;
this.subject = subject;
this.content = content;
this.smtpServer = Global.getConfig("smtpServer");
this.port = Global.getConfig("port");
this.fromUserName = Global.getConfig("fromUserName");
this.fromUserPassword = Global.getConfig("fromUserPassword");
}
//get、set方法略
}
4,发送邮件的实现类(工具类):
public class EmailUtil {
/**
* 进行base64加密,防止中文乱码
*/
private static String changeEncode(String str) {
try {
str = MimeUtility.encodeText(new String(str.getBytes(), "UTF-8"), "UTF-8", "B"); // "B"代表Base64
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return str;
}
public static boolean sendHtmlMail(EmailInfo emailInfo) {
Properties properties = new Properties();
properties.put("mail.smtp.host", emailInfo.getSmtpServer());
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // 使用JSSE的SSL
properties.put("mail.smtp.socketFactory.fallback", "false"); // 只处理SSL的连接,对于非SSL的连接不做处理
properties.put("mail.smtp.port", emailInfo.getPort());
properties.put("mail.smtp.socketFactory.port",emailInfo.getPort());
Session session = Session.getInstance(properties);
session.setDebug(true);
MimeMessage message = new MimeMessage(session);
try {
// 发件人
Address address = new InternetAddress(emailInfo.getFromUserName());
message.setFrom(address);
// 收件人
Address toAddress = new InternetAddress(emailInfo.getToUser());
message.setRecipient(MimeMessage.RecipientType.TO, toAddress); // 设置收件人,并设置其接收类型为TO
// 主题message.setSubject(changeEncode(emailInfo.getSubject()));
message.setSubject(emailInfo.getSubject());
// 时间
message.setSentDate(new Date());
Multipart multipart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(emailInfo.getContent(), "text/html; charset=utf-8");
multipart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
message.setContent(multipart);
message.saveChanges();
} catch (Exception e) {
e.printStackTrace();
return false;
}
try {
Transport transport = session.getTransport("smtp");
transport.connect(emailInfo.getSmtpServer(), emailInfo.getFromUserName(), emailInfo.getFromUserPassword());
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
public static void main(String[] args) {
EmailUtil util = new EmailUtil();
String content =Global.getConfig("email_user_add_content");
content = content.format(content, "111","222");
System.out.println(content);
EmailInfo info = new EmailInfo("[email protected]", Global.getConfig("email_user_add_subject"), "这是一个测试邮件
");
util.sendHtmlMail(info);
}
应用中配置使用邮箱接收发送邮件,经常会因为各个邮箱配置的细微差异出现错误,多半是认证不通过,而认证不通过的原因无非是:
1、服务器错误
2、用户名错误
3、用户名密码不匹配。
遇到错误从这几方面下手就可以了,在代码中使用邮箱发送邮件时要先在客户端试一次,确保邮箱在客户端是可接可收的。
1,点击文件——》添加账户
2,选择配置方式
3,填写账户信息:
4,点击“其他设置”
最后就完成了配置,发送一封邮件测试一下就妥妥的了。