本文主要介绍利用JavaMailSenderImpl发送邮件。首先介绍了发送一般邮件,然后介绍了发送富文本(html)邮件及以velocity为模板发送邮件。
邮件发送分为为三步:创建邮件发送器、编写邮件、发送邮件。
Spring的JavaMailSenderImpl提供了强大的邮件发送功能,可发送普通文本邮件、带附件邮件、html格式邮件、带图片邮件、设置发送内容编码格式、设置发送人的显示名称。
下面就进行介绍,示例代码中很多都是字符串硬编码,实际使用时推荐使用spring的配置文件进行配置。
1、创建邮件发送器
首先定义JavaMailSenderImpl对象,并对其进行smtp相关信息设置,相当于我们自己的邮箱,如下:
1. JavaMailSenderImpl mailSender = new
2. mailSender.setHost("smtp.qq.com");
3. mailSender.setUsername("mosaic@qq.com");
4. mailSender.setPassword("asterisks");
当然更好的方法是使用配置文件进行配置,这里只是进行介绍,忽略硬编码先。
以上主机为邮箱服务商的smtp地址,用户名、密码为用户自己的邮箱。除以上外还可以设置
setPort(int port) 、setProtocol(String protocol) 等,可暂时不考虑。
这样我们便类似创建好了一个邮件发送器
2、 开始写邮件,编写邮件内容
MimeMessages和
SimpleMailMessages。
MimeMessages为复杂邮件模板,支持文本、附件、html、图片等。
SimpleMailMessages实现了MimeMessageHelper,为普通邮件模板,支持文本。
下面先以SimpleMailMessages为例进行介绍
1. SimpleMailMessage smm = new
2. // 设定邮件参数
3. smm.setFrom(mailSender.getUsername());
4. smm.setTo("mosaic@126.com");
5. smm.setSubject("Hello world");
6. smm.setText("Hello world via spring mail sender");
7. // 发送邮件
8. mailSender.send(smm);
如此,我们便完成了一个简单邮件的编写,对于复杂邮件,编写及发送如下
1. //使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
2. MimeMessage msg = mailSender.createMimeMessage();
3. //创建MimeMessageHelper对象,处理MimeMessage的辅助类
4. MimeMessageHelper helper = new MimeMessageHelper(msg, true);
5. //使用辅助类MimeMessage设定参数
6. helper.setFrom(mailSender.getUsername());
7. helper.setTo("mosaic@126.com");
8. helper.setSubject("Hello Attachment");
9. helper.setText("This is a mail with attachment");
10. //加载文件资源,作为附件
11. ClassPathResource file = new ClassPathResource("Chrysanthemum.jpg");
12. //加入附件
13. helper.addAttachment("attachment.jpg", file);
14. // 发送邮件
15. mailSender.send(smm);
其中MimeMessageHelper为的辅助类MimeMessages。以上包含了以资源文件为附件进行发送。对于普通文件发送方式如下:
1. FileSystemResource file = new FileSystemResource("C:\\Users\\image1.jpg");
2. helper.addInline("file", file);
3、发送邮件
2中已经包含了发送的代码,只需使用JavaMailSenderImpl的send接口即可。支持类型为
1. void
2. Send the given JavaMail MIME message.
3. void
4. Send the given array of JavaMail MIME messages in batch.
5. void
6. Send the JavaMail MIME message prepared by the given MimeMessagePreparator.
7. void
8. Send the JavaMail MIME messages prepared by the given MimeMessagePreparators.
9. void
10. Send the given simple mail message.
11. void
12. Send the given array of simple mail messages in batch.
下面介绍下怎么发送富文本文件以及以velocity为模板发送邮件。
4、发送html文件
只需要在MimeMessageHelper setText时将是否是html设为true即可。setText介绍如下:
1. setText(String text, boolean html)
2. Set the given text directly as content in non-multipart mode or as default body part in multipart mode.
示例代码(包括附件)如下:
1. //第二个参数true,表示text的内容为html
2. //注意<img/>标签,src='cid:file','cid'是contentId的缩写,'file'是一个标记,需要在后面的代码中调用MimeMessageHelper的addInline方法替代成文件
3. helper.setText("<body><p>Hello Html Email</p><img src='cid:file'/></body>", true);
4. FileSystemResource file = new FileSystemResource("C:\\Users\\image1.jpg");
5. helper.addInline("file", file);
5、以velocity为模板发送邮件
使用Velocity模板,需要Velocity的jar包,可以在官方网站下载,并加入ClassPath。
以velocity为模板发送邮件的原理如下:
a 类似web编程,将velocity作为前端,在java中设置vm中需要显示的变量值
b 使用VelocityEngineUtils的mergeTemplateIntoString函数将vm内容转换为文本
c 同4的发送html邮件一样发送邮件
最重要的过程将是将vm的内容转换为string,即设置邮件内容,其他同上面并无差异
5.1 新建vm文件,命名为index.vm
1. <html>
2. <head>
3. </head>
4. <body>
5. <div>${user} </div>
6. <div>${content}</div>
7. </body>
8. </html><span style="white-space: normal; background-color: #ffffff;"> </span>
为了方便省略了html头定义。
其中${user} 为Velocity的语法,相当于一个变量,在java程序中可以设置这个变量的值在前端显示。
5.2 创建VelocityEngineFactoryBean对象,并设置属性
1. // Velocity的参数,通过VelocityEngineFactoryBean创建VelocityEngine,也是推荐在配置文件中配置的
2. Properties properties = System.getProperties();
3. properties.put("resource.loader", "class");
4. properties.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
5. VelocityEngineFactoryBean v = new
6. v.setVelocityProperties(properties);
5.3 转换vm内容为普通String
1. // 声明Map对象,并填入用来填充模板文件的键值对
2. Map<String, String> model = new
3. model.put("user", "ooo");
4. model.put("content", "nihao");
5. // Spring提供的VelocityEngineUtils将模板进行数据填充,并转换成普通的String对象
6. String emailText = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "index.vm", model);
这样我们便将vm中的变量值填充好,并且将内容转换为了string
5.4 设置邮件内容,同4
1. helper.setText(emailText, true);
其他内容同上面的1、2、3过程。
注意:vm文件格式需要与邮件编码一致否则会出现乱码