首页>JAVA>正文

【上海Java培训】SpringBoot邮件发送服务

时间:2018-03-13 20:59:19   来源:上海尚学堂   阅读:

 

         发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。最早期的时候我们会使用JavaMail相关api来写发送邮件的相关代码,后来spring退出了JavaMailSender更加简化了邮件发送的过程,在之后springboot对此进行了封装就有了现在的spring-boot-starter-mail,本章文章的介绍主要来自于此包。

 

简单使用

 

1、pom包配置

pom包里面添加spring-boot-starter-mail包引用

<dependencies>
    <dependency> 
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency> 
</dependencies>

 

2、在application.properties中添加邮箱配置

spring.mail.host=smtp.qiye.163.com //邮箱服务器地址
spring.mail.username=xxx@oo.com //用户名
spring.mail.password=xxyyooo    //密码
spring.mail.default-encoding=UTF-8

mail.fromMail.addr=xxx@oo.com  //以谁来发送邮件

 

3、编写mailService,这里只提出实现类。

@Component
public class MailServiceImpl implements MailService{

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender mailSender;

    @Value("${mail.fromMail.addr}")
    private String from;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);

        try {
            mailSender.send(message);
            logger.info("简单邮件已经发送。");
        } catch (Exception e) {
            logger.error("发送简单邮件时发生异常!", e);
        }

    }
}

 

4、编写test类进行测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {

    @Autowired
    private MailService MailService;

    @Test
    public void testSimpleMail() throws Exception {
        MailService.sendSimpleMail("ityouknow@126.com","test simple mail"," hello this is simple mail");
    }
}

        至此一个简单的文本发送就完成了。

        以上是简单邮件发送,接下来我们在看看带附件邮件以及模板邮件,其中包括 html转pdf,且html中嵌入图片。


       首先需要这两个包,spring-boot-starter-mail:这个是主要负责邮件发送功能。spring-boot-starter-freemarker 这个是负责邮件模板功能。如果需要把html模板转换成PDF格式,需要引入 itextpdf、xmlworker、itext-asian包。

      发送模板与带附件的邮件

public boolean sendDetectedMail(MailFileDto mailDto) throws Exception {
        MimeMessage message = null;
        boolean flag = true;
        try {
           String[] sendTo = {'张三','李四','王五'};//接受者可以有多个,以数组的形式传入参数
            message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(“邮件发送者”);
            helper.setTo(“邮件接收者”);
            helper.setSubject(“邮件主题”);
            // 邮件参数
            Map<String, Object> model = new HashMap<String, Object>();
            model.put("producttype", mailDto.getProductType());
            model.put("warrantyType", mailDto.getWarrantyType());
        
            //获取静态文件流资源
            Resource resource = new ClassPathResource("images/logo.png");
            model.put("logoImg", "data:image/png;base64," + Html2PdfUtil.img2Base64(resource));//对于模板中的静态图片、需要先把图片流转换Base64,才能带入到邮件中去
            // 读取附件html模板:运单附件格式为PDF
            Template attachmentTempl = freeMarker.getConfiguration().getTemplate("checkReport.html");
            final String attachmentHtml = FreeMarkerTemplateUtils.processTemplateIntoString(attachmentTempl, model);
            // 转换PDF格式的附件
            final byte[] contents = Html2PdfUtil.buildPdf(attachmentHtml);//将html邮件模板转换成PDF
            helper.addAttachment("diagnosticReport.pdf", new InputStreamSource() {
                @Override
                public InputStream getInputStream() throws IOException {
                    return new ByteArrayInputStream(contents);
                }
            });
            // PDF附件上传文件服务器
            String filePath = upload2FileServer(mailDto.getRefNumber() + ".pdf", contents, mailDto.getFileServiceUrl());
            model.put("downloadFilePath", filePath);
            // 读取邮件 html 模板
            Template template = freeMarker.getConfiguration().getTemplate("detected.html");
            String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
            helper.setText(html, true);
            // 带有静态图片资源
            //FileSystemResource file = new FileSystemResource(new File(fileSrc));//此方法项目打包发布后获取不到静态资源
            helper.addInline("logo", resource);
            // 开始发送
            mailSender.send(message);
        } catch (Exception e) {
            flag = false;
            logger.error("检测报告邮件发送异常:{}", e);
            e.printStackTrace();
        }
        return flag;
    }

 

    /**
     * 把Html转换pdf文件
     */
    public static byte[] buildPdf(String ctx) throws DocumentException, IOException{
            
            ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(document, baos);
            document.open();

            CssAppliers cssAppliers = new CssAppliersImpl();
            cssAppliers.setChunkCssAplier(new MyChunkCssApplier());  
            
            HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
            DefaultTagProcessorFactory tpf=(DefaultTagProcessorFactory)Tags.getHtmlTagProcessorFactory();
            tpf.addProcessor(Tag.IMG, ImageProcessor.class.getName());
            htmlContext.setTagFactory(tpf);
            
            CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
            Pipeline<?> pipeline = new CssResolverPipeline(cssResolver,new HtmlPipeline(htmlContext, new PdfWriterPipeline(document,writer)));
            
            XMLWorker worker = new XMLWorker(pipeline, true);
            XMLParser xmlParser = new XMLParser(worker);
            ByteArrayInputStream bais=new ByteArrayInputStream(ctx.getBytes());
            xmlParser.parse(new InputStreamReader(bais));
            xmlParser.flush();
            document.close();
            byte[] result=baos.toByteArray();
            baos.flush();
            baos.close();
        return result;
    }
    
    
    /**
     * 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
     * @param imgpath
     * @return
     */
    public static String img2Base64(Resource resource) {
        byte[] data = null;
        // 读取图片字节数组
        try {
            InputStream inputStream = resource.getInputStream();
            data = new byte[inputStream.available()];
            inputStream.read(data);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(Base64.encodeBase64(data));
    }

 

  邮件配置:

  # JavaMailSender 邮件发送的配置
       #spring.mail.host=smtp.exmail.qq.com
       #spring.mail.username=邮箱名
       #spring.mail.password=密码
       #spring.mail.properties.mail.smtp.auth=true
       #spring.mail.properties.mail.smtp.starttls.enable=true
       #spring.mail.properties.mail.smtp.starttls.required=true
       #如果服务器25端口被禁用,请用以下配置
       spring.mail.host=smtp.exmail.qq.com
       spring.mail.port=465
       spring.mail.username=邮箱名
       spring.mail.password=密码
       spring.mail.properties.mail.smtp.auth = true
       spring.mail.properties.mail.smtp.starttls.enable = true
       spring.mail.properties.mail.smtp.starttls.required=true
       spring.mail.properties.mail.smtp.ssl.enable = true


感谢您阅读上海尚学堂文章,更多相关内容或获取支持请点击 上海Java培训

参考文章:http://www.cnblogs.com/ityouknow/p/6823356.html;https://www.cnblogs.com/lvkaiyu/p/7873377.html


 

分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫