Spring发送邮件

概要

Spring Email抽象的核心是MailSender接口。MailSender的实现能够通过连接Email服务器实现邮件发送的功能。
这里写图片描述
Spring自带了一个MailSender的实现也就是JavaMailSenderImpl,它会使用JavaMail API来发送Email。

开启邮箱SMTP服务

以网易126邮箱为例,QQ、163都差不多的步骤!
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

配置邮件发送器

导入javax.mail-1.5.4.jar
RootConfig.java

        @Bean
        public MailSender mailSender() {
            JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
            mailSender.setHost("smtp.163.com");//指定用来发送Email的邮件服务器主机名
            mailSender.setPort(25);//默认端口,标准的SMTP端口
            mailSender.setUsername("test@163.com");//用户名
            mailSender.setPassword("password");//就是刚刚设置的授权码
            return mailSender;
        }

注入JavaMailSender

@Autowired
private JavaMailSender mailSender;
@RequestMapping("/mail")
public void mail() throws MessagingException
{
     SimpleMailMessage message = new SimpleMailMessage();//消息构造器
     message.setFrom(from@163.com");//发件人
     message.setTo("to@qq.com");//收件人
     message.setSubject("Spring Email Test");//主题
     message.setText("hello world!!");//正文
     mailSender.send(message);
     System.out.println("邮件发送完毕");
 }

这里写图片描述

添加附件

对于简单的事情来讲,纯文本的Email消息是比较合适的。然而Spring的Email功能并不局限于纯文本的Email,我们可以添加附件。
如果发送带有附件的Email,关键技巧是创建multipart类型的消息。对于发送附件的需求来说,SimpleMailMessage 过于简单了。为了发送multipart类型的Email,需要创建一个MIME的消息。

@RequestMapping("/mail")
public void mail() throws MessagingException
{
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message,true);//true表明这个消息是multipart类型的
    helper.setFrom("from@163.com");//发件人
    helper.setTo("to@qq.com");//收件人
    helper.setSubject("Spring Email Test");//主题
    helper.setText("hello world!!");//正文
    FileSystemResource resource = new FileSystemResource("F:\\Users\\yd\\Desktop\\test.png");
    helper.addAttachment("test.png", resource);
    mailSender.send(message);
}

addAttachment()的第一个参数是要添加到Email中附件的名称,第二个参数是图片资源。
这里写图片描述

发送富文本内容的Email

发送富文本的Email与发送简单文本的Email并没有太大区别。关键是将消息的文本设置为HTML。要做到这一点只需要将HTML字符串传递给helper的setText()方法,并将第二个参数设置为true;

@RequestMapping("/mail")
public void mail() throws MessagingException
{
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message,true);
    helper.setFrom("from@163.com");//发件人
    helper.setTo("to@qq.com");//收件人
    helper.setSubject("Spring Email Test");//主题
    helper.setText("<html><body><img src='cid:logo'><h1>hahaha</h1></body></html>", true);
    ClassPathResource image = new ClassPathResource("/image/test.png"); //类路径下
    helper.addInline("logo", image);
    mailSender.send(message);
}

这里写图片描述
为消息添加嵌入式图片与添加附件很类似。不过这次不在使用helper的addAttachment()方法,而是调用addInline()方法:

ClassPathResource image = new ClassPathResource("/image/test.png"); //类路径下
helper.addInline("logo", image);

addInline的第一个参数表明内联图片的标识符——与img标签的src属性所指定的相同。第二个参数是图片的资源引用,这里使用ClassPathResource从应用程序的类路径下获取图片。

使用Velocity模板生成Email

导入velocity-1.7.jar、commons-collections-3.2.1.jar
RootConfig.java

        @Bean
        public VelocityEngineFactoryBean velocityEngine() {
            VelocityEngineFactoryBean velocityEngine = new VelocityEngineFactoryBean();
            Properties props = new Properties();
            props.setProperty("resource.loader", "class");
            props.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
            velocityEngine.setVelocityProperties(props);
            return velocityEngine;
        }

Spring自带了VelocityEngineUtils来简化Velocity模板与模型数据合并成String的工作

@RequestMapping("/mail")
public void mail() throws MessagingException
{
Map<String, Object> modal = new HashMap<String, Object>();
     modal.put("name", "asd");
     modal.put("text", "这是一个用Velocity生成的模板");
     //使用VelocityEngineUtils将Velocity模板与模型数据合并成String
     String emailText = VelocityEngineUtils
             .mergeTemplateIntoString(velocityEngine, "emailTemplate.vm", "UTF-8", modal);

     MimeMessage message = mailSender.createMimeMessage();
     //第三个参数设置编码,否则如果有汉字会出现乱码问题
     MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
     helper.setFrom("from@163.com");
     helper.setTo("to@qq.com");
     helper.setSubject("Spring Email Test");
     helper.setText(emailText, true);
     ClassPathResource image = new ClassPathResource("/image/test.png");
     helper.addInline("logo", image);
     mailSender.send(message);
     System.out.println("邮件发送完毕");
}

首先创建了一个Map用来保存模板使用的模型数据。为了产生合并后的Email文本,我们只需要调用VelocityEngineUtils的mergeTemplateIntoString()方法并将Velocity引擎、模板路径(相对于类路径根)以及模型Map传递进去。
emailTemplate.vm

<!DOCTYPE html>
<html>
<body>
<img src='cid:logo'>
<h4>Hello ${name}</h4>
<h3>${text}</h3>
</body>
</html> 

这里写图片描述
以上只是学习所做的笔记,如有错误,请指正谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值