zoukankan      html  css  js  c++  java
  • 使用Spring发送Email

    配置Spring发送邮件

    Spring发送邮件底层还是使用JavaMail,我在http://www.cnblogs.com/lz2017/p/6882925.html 中记录过关于JavaMail的基础知识,这里就不再复述了。Spring Email需要导入的j关键ar包:

    spring-context-support.jar
    javax.mail.jar

    Spring  Emaile 抽象的核心是MailSender接口,MailSender接口的实现能够通过链接Email服务器实现发送邮件的功能(MailSender接口的实现把Emaile发送给邮件服务器,再由邮件服务器进行邮件投递)。Spring只带了一个MaileSender的实现:JavaMailSenderImpl,它底层就是在使用JavaMail 的API来发送Email。我们第一步先把这个实现类装配为Spring应用上下文的一个bean。

        @Bean
        public MailSender mailSender() {
            JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
            
            //发送方smtp邮箱地址,账号,密码
            mailSender.setHost("smtp.163.com");
            mailSender.setUsername("18337953723");
            mailSender.setPassword("return0;");
            
            //设置编码
            mailSender.setDefaultEncoding("utf-8");
            
            return mailSender;
        }

    我们可以使用mailSender提供的setter方法进行一些设置,这里最基本的设置是发送端邮箱的SMTP地址,发送端邮箱账号和密码,编码方式。默认JavaMailSenderImpl假设邮件服务器监听25端口(标准SMTP端口),如果使用的邮件服务器使用不同的端口,可以设置port属性进行指定。

    JavaMailSenderImpl配置好之后,它可以自动创建自己的邮件会话(javax.mail.MailSession)。如果使用了JNDI在服务器中设置了,我们就可以不用JavaMailSenderImpl的属性了,使用JndiObjectFactoryBean或<jee:jndi-lookup>去引用JNDI中的邮件会话,邮件会话就绪之后,通过JavaMailSenderImpl的setSession装配进去即可。

    装配和使用邮件发送器

    邮件发送器配置好之后,就下来就需要将其装配到使用它的bean中,使用@Autowired注解自动装配就好:

        @Autowired
        private MailSender mailSender;

    接下来做的第一件事就是构造一个SimpleMailMessage实例,这个对象可以发送Email消息。

        public void sendSimpleSpittleEmail(String to,String text) {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom("18337953723@163.com");
            message.setTo(to);
            message.setText(text);
            mailSender.send(message);
        }

    setForm()和setTo()方法指定了Email的发送方和接收方。还可以通过setSubject()设置主题(邮件的标题),调用setText()方法来设置消息的内容。最后一步通过将消息发送给邮件发送器的send()方法,这封简单点的邮件就发出去了。

    构建丰富内容的Email内容

    在上边我们只是构建了一个可以发送简单文本的邮件,如果你需要发送带有附件的文件,或者是使用HTML来美化内容,那么就需要更进一步。

    添加附件

    发送带有附件的邮件关键在于创建Multipart内心的消息——Email由多个部分构成,其中一部分是Email体,其他部分是附件。我们先把MailSender强转为JavaMailSender类型,因为添加附件需要使用JavaMailSender中的方法:

    JavaMailSender sender=(JavaMailSender)mailSender;

    因为这里使用的是MailSender接口,如果直接使用其子接口JavaMailSender,这里就不用强转了。

    为了能发送multipart类型的Email,SimpleMailMessage有些太简单了,我们需要创建一个MIME的消息,使用邮件发送器的createMimeMessage()方法:

    MimeMessage message = sender.createMimeMessage();

    javax.mail.internet.MimeMessage 本身的API一般我们不去直接使用,Spring提供了MimeMessageHelper可以帮助我们,我们需要实例化它并将MimeMessage传递给其构造器:

    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    构造器的第二个参数为true,表明这个消息是multipart类型的。在这里我使用ClassPathRessource加载一个位于类路径下的资源(或者使用FileSystemResource根据文件路径去加载文件

        public void sendEmailAndAttachment(String to,String text) throws MessagingException {
            JavaMailSender sender=(JavaMailSender)mailSender;
            MimeMessage message = sender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom("18337953723@163.com");
            helper.setTo(to);
            helper.setSubject("New Email");
            helper.setText(text);
            //FileSystemResource image=new FileSystemResource("D:/12.png");
            ClassPathResource image=new ClassPathResource("/images/12.png");
            helper.addAttachment("12.png", image);
            sender.send(message);
        }

    /images/12.png是我放在类路径下的一张图片,Maven项目具体位置为src/main/resources/images/12.png

    发送富文本内容的HTML

    只是发送富文本的内容与简单文本并没有太大不同,使用的都是setText()方法,只不过是将第二个参数设置为true,调用这个方法的时候,传给的值是HTML的内容就行了。在这里我们想将一个图片嵌入到内容中,也就是说给富文本(HTML)中的<img>标签的src属性赋值。

    添加附件的方法使用的是addAttachment(),这里需要使用addInline()方法内联图片。

        /**
         * 富文本以及内联图片
         * @param to
         * @param text
         * @throws MessagingException
         */
        public void sendEmailInlineImage(String to,String text) throws MessagingException {
            JavaMailSender sender=(JavaMailSender)mailSender;
            MimeMessage message = sender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom("18337953723@163.com");
            helper.setTo(to);
            helper.setSubject("New Email");
            helper.setText(text,true);
            ClassPathResource image=new ClassPathResource("/images/12.png");
            helper.addInline("logo", image);
            sender.send(message);
        }

    我们在调用的时候给一个HTML的字符串:

        @Test
        public void test03() {
            try {
                String text="<html><body><img src='cid:logo'><h3>来自Spring</h3></body></html>";
                mailService.sendEmailInlineImage("1105062331@qq.com", text);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }

    注意这个img标签的src属性值为cid:logo,前缀cid: 不要修改,“logo”这个名字需要与addInline()方法中指定的名保持一致。

    将HTML内容作为字符串传递过去即操作不方便又无法看到效果,所以可以使用一些模板技术:JSP,FreeMarker,Velocity之类的。或者使用Spring中比较推荐的Thymeleaf,用这些技术布局Email的内容,然后将模板转换为String并传递给helper的setText()方法。

  • 相关阅读:
    JavaScript 简介
    数据库的链接语句
    sqlserver 大杂烩
    数据库操作
    Filter Big Picture
    struts2配置有命名空间的Action: 解决No configuration found for the specified action错误
    Firefox的Firebug调试
    jQuery判断元素显示或隐藏, is 函数
    Jsp Tag
    java revisit
  • 原文地址:https://www.cnblogs.com/lz2017/p/9078646.html
Copyright © 2011-2022 走看看