跟多文章访问我的博客网站:http://www.caoyong.xin:8080/blogger
SpringEmail
今天来说一说使用Spring来发送邮件,在一些项目中会遇到用户注册的时候,需要提供邮箱地址,提供邮箱地址的目的在于,进行邮箱验证,所以我们需要在用户点击注册的时候,发送一封邮件给用户,然后用户点击邮箱中的邮件里的地址。我们这样就可以确认该用户,同意注册。
目录
:准备环境
:了解API
:代码展示
1:准备环境
今天使用的是Spring+QQ。使用Spring给我们的QQ发送一封邮件。SpringEmail封装了JavaEmail的API,在此基础上开发的。所以使用更加方便。
首先,我们要有一些理论知识,发送邮件的大体过程是什么样的。
通俗来说就是发送方邮件服务器和收件方邮件服务器之间的通信。在我们这里,QQ邮件服务器,既是发送方邮件服务器也是收件方邮件服务器(听不懂,接着往下看)。我们使用SpringEmail来演示,自己的QQ邮箱给别人发送一封QQ邮件,我们发送邮件是在QQ邮件服务器上发送的,而别人接受邮件也是通过QQ邮件服务器的。所以,QQ邮件服务器,既是发送方邮件服务器也是收件方邮件服务器。
接下来我们要去我们的QQ邮箱去设置一些东西。
1.1:登录自己的QQ邮箱,点击设置》账户
开启POP3/SMTP服务,这个时候会生成授权码,记住这个授权码,稍后会用。
1.2:准备架包
使用Spring的Email功能除Spring核心jar之外还需要Spring-support、javax.mail等jar包支持,需要构建到项目中。
<!-- springMVCEmail -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2:了解API
Spring中将Javaemail的API封装好了,我们只需要拿来使用,所以我们要了解一下,有哪些API。
JavaMailSenderImpl类
该类是JavaMailSender的实现类在spring-context-support架包中,用于设置邮件服务器的一些参数,比如服务器地址,端口,发送人用户名,授权码等等。下面我们就来了解一下
setJavaMailProperties:需要一个Properties类型的参数,设置一些安全协议。
setHost:设置邮件服务器地址
setPort:设置端口号
setUserName :发件人的用户名
setPassword:发件人的密码或者授权码
send():我们可以看到重载了很多的send()方法,已发送不同类型的邮件,有普通邮件,有带附件的邮件,有带html的邮件。
MailMessage接口,
这是一个借口用于设置发送的邮件的内容,收件人信息等内容,他有两个实现类MimeMailMessage和SimpleMailMessage
MailMessage定义的方法
setFrom();发送人邮箱
setCc():抄送地址
setBcc():暗送地址
setTo():收件人邮箱地址,可以群发多人,使用字符串数组存储,收件人的邮件地址
setSubject():设置邮件主题
setText():设置文本格式的邮件内容
MimeMessageHelper类
是Spring封装用于发送邮件的工具类,可以发送带附件的,带图片的,带HTML格式的邮件
3:代码展示
3.1:发送文本格式的邮件
public void senderEmail() {
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost("smtp.qq.com");//邮件服务器 如qq smtp.qq.com 163网易 smtp.163.com
senderImpl.setUsername("15*****[email protected]");//发送人服务器的用户名
senderImpl.setPassword("h*********jg");//此处为qq邮箱的授权码,而非邮箱密码。
senderImpl.setPort(465);//端口 默认25 ,或者587
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("29****[email protected]");//收信人邮箱
message.setFrom("15*****[email protected]");//发送人邮箱
message.setSubject("这是邮件主题");//邮件主题
message.setText("这是邮件内容");//邮件内容
Properties prop = new Properties();
MailSSLSocketFactory sf = new MailSSLSocketFactory();//安全协议
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
prop.put("mail.smtp.auth", "true");//自动验证发送人邮箱用户名和授权码
prop.put("mail.smtp.timeout", "25000");//超时时间
senderImpl.setJavaMailProperties(prop);
senderImpl.send(message);
System.out.println("发送成功");
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
}
结果:
3.2:发送带附件的邮件
public void senderEmailAttachment() {
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost("smtp.qq.com");//邮件服务器 如qq smtp.qq.com 163网易 smtp.163.com
senderImpl.setUsername("15******[email protected]");//发送人服务器的用户名
senderImpl.setPassword("h**********hjg");//此处为qq邮箱的授权码,而非邮箱密码。
senderImpl.setPort(465);//端口 默认25 ,或者587
MimeMessage message = senderImpl.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("15*****[email protected]");//发送方
helper.setTo("29******[email protected]");//收件人
helper.setSubject("Spring Email Test1");//主题
helper.setText("这是一个带有附件的邮件1");//内容
File file = new File("E:\\attachment.txt");
FileSystemResource attachment = new FileSystemResource(file);
helper.addAttachment("您的附件", attachment);//附件
Properties prop = new Properties();
MailSSLSocketFactory sf = new MailSSLSocketFactory();//安全协议
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
prop.put("mail.smtp.auth", "true");//自动验证发送人邮箱用户名和授权码
prop.put("mail.smtp.timeout", "25000");//超时时间
senderImpl.setJavaMailProperties(prop);
senderImpl.send(message);
System.out.println("邮件发送完毕");
} catch (Exception e) {
e.printStackTrace();
}
}
结果:
3.3:发送HTML格式的邮件
public void senderEmailHtml() {
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost("smtp.qq.com");//邮件服务器 如qq smtp.qq.com 163网易 smtp.163.com
senderImpl.setUsername("15********[email protected]");//发送人服务器的用户名
senderImpl.setPassword("h**********jg");//此处为qq邮箱的授权码,而非邮箱密码。
senderImpl.setPort(465);//端口 默认25 ,或者587
MimeMessage message = senderImpl.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("15******[email protected]");//发送方
helper.setTo("29*******[email protected]");//收件人
helper.setSubject("Spring Email Test2");//主题
StringBuilder info = new StringBuilder();//编写HTML
info.append("<html><body><img src='cid:image'>");
info.append("<h2>Hello Word!</h2>");
info.append("</body></html>");
helper.setText(info.toString(),true);
ClassPathResource image = new ClassPathResource("01.jpg");
helper.addInline("image", image);//添加图片
Properties prop = new Properties();
MailSSLSocketFactory sf = new MailSSLSocketFactory();//安全协议
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
prop.put("mail.smtp.auth", "true");//自动验证发送人邮箱用户名和授权码
prop.put("mail.smtp.timeout", "25000");//超时时间
senderImpl.setJavaMailProperties(prop);
senderImpl.send(message);
System.out.println("邮件发送完毕");
} catch (Exception e) {
e.printStackTrace();
}
}
结果: