java基于freemarker发送邮件,模板邮件,图片邮件

技术:springboot2 + freemarker +邮件

运行环境:idea + maven + jdk1.8 

概述

基于freemarker发送模板邮件,图片邮件,文本邮件等。基于ftl模板,邮件样式美观。

详细

一,前言

FreeMarker是一种模板引擎:即一种基于模板并且要改变的数据,并同时生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java的类库,是一款程序员可以嵌入他们所开发产品的组件。【百度百科】

二,效果预览

三,程序实现

1,项目结构图

2,相关参数配置

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">弹簧:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

  邮件:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    #设置邮箱主机</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    主持人:smtp.ym.163.com</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    #设置用户名</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    用户名:lnbld@bld365.com</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    #这里不是注册时的密码,而是生成的授权码</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    密码:“ bld123456”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    端口:465</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    默认编码:UTF-8</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    特性:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

      邮件:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        smtp:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

          #设置是否需要认证,如果为true,那么用户名和密码就必须</font></font><font></font>

          auth: true<font></font>

          starttls:<font></font>

            #加密通讯,true开启,false不开启<font></font>

            enable: true<font></font>

            #是否必须通过使用加密通讯进行通讯,true开启,false不开启<font></font>

            required: true<font></font>

          socketFactory:<font></font>

            port: 465<font></font>

            class: javax.net.ssl.SSLSocketFactory<font></font>

            fallback: false

3,测试类

packagecom.sylujia.mail;<font></font>

<font></font>

importcom.sylujia.mail.service.MailService;<font></font>

importlombok.extern.slf4j.Slf4j;<font></font>

importorg.junit.Test;<font></font>

importorg.junit.runner.RunWith;<font></font>

importorg.springframework.beans.factory.annotation.Autowired;<font></font>

importorg.springframework.boot.test.context.SpringBootTest;<font></font>

importorg.springframework.test.context.junit4.SpringRunner;<font></font>

<font></font>

importjava.util.HashMap;<font></font>

importjava.util.Map;<font></font>

<font></font>

@Slf4j<font></font>

@RunWith(SpringRunner.class)<font></font>

@SpringBootTest<font></font>

publicclassMailServiceTest {<font></font>

<font></font>

    @Autowired<font></font>

    privateMailService mailService;<font></font>

<font></font>

    @Test<font></font>

    publicvoidsendTemplateMailTest(){<font></font>

        Map<String, Object> mailContentMap = newHashMap<>();<font></font>

        mailContentMap.put("contactName", "sylujia");<font></font>

        mailContentMap.put("platformAddr", "https://www.baidu.com");<font></font>

        mailContentMap.put("loginName", "sylujia");<font></font>

        mailContentMap.put("loginPswd", "123456");<font></font>

        mailContentMap.put("payPswd", "123456");<font></font>

        mailContentMap.put("contactMail", "xxx@163.com");<font></font>

        mailContentMap.put("contactPhone", "13144112255");<font></font>

        try{<font></font>

            mailService.sendTemplateMail("系统账号开通", "xxx@163.com","AccountOpenMail.ftl", mailContentMap);<font></font>

        } catch(Exception e) {<font></font>

            log.error("账号开通邮件发送失败:{}", mailContentMap , e);<font></font>

        }<font></font>

        log.info("邮件发送成功");<font></font>

    }<font></font>

<font></font>

<font></font>

<font></font>

}

4,邮件服务

packagecom.sylujia.mail.service.impl;<font></font>

<font></font>

importcom.sylujia.mail.service.MailService;<font></font>

importfreemarker.template.Configuration;<font></font>

importlombok.extern.slf4j.Slf4j;<font></font>

importorg.springframework.beans.factory.annotation.Autowired;<font></font>

importorg.springframework.beans.factory.annotation.Value;<font></font>

importorg.springframework.mail.javamail.JavaMailSender;<font></font>

importorg.springframework.mail.javamail.MimeMessageHelper;<font></font>

importorg.springframework.stereotype.Service;<font></font>

importorg.springframework.ui.freemarker.FreeMarkerTemplateUtils;<font></font>

<font></font>

importjavax.mail.internet.MimeMessage;<font></font>

importjava.util.Map;<font></font>

<font></font>

@Slf4j<font></font>

@Service<font></font>

publicclassMailServiceImpl implementsMailService {<font></font>

<font></font>

    @Autowired<font></font>

    privateJavaMailSender mailSender;<font></font>

<font></font>

    @Value("${spring.mail.username}")<font></font>

    privateString from;<font></font>

<font></font>

    @Override<font></font>

    publicbooleansendTemplateMail(String title, String toUser, String templateName, Map<String, Object> params) {<font></font>

        try{<font></font>

<font></font>

            MimeMessage mimeMessage = mailSender.createMimeMessage();<font></font>

            MimeMessageHelper helper = newMimeMessageHelper(mimeMessage, true);<font></font>

            // 发件人<font></font>

            helper.setFrom(from);<font></font>

            //收件人<font></font>

            helper.setTo(toUser);<font></font>

            //邮件标题<font></font>

            helper.setSubject(title);<font></font>

<font></font>

            Configuration configuration = newConfiguration(Configuration.VERSION_2_3_28);<font></font>

            configuration.setClassForTemplateLoading(this.getClass(), "/templates");<font></font>

            String text = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(templateName), params);<font></font>

            //// text:内容,true:为HTML邮件(false则为普通文本邮件)<font></font>

            helper.setText(text, true);<font></font>

            mailSender.send(mimeMessage);<font></font>

<font></font>

        } catch(Exception e) {<font></font>

            log.error("sendTemplateMail 发送模板邮件错误,", e);<font></font>

            thrownewRuntimeException(e);<font></font>

        }<font></font>

        returntrue;<font></font>

    }<font></font>

<font></font>

}

四,总结

邮件发送本地(Windows环境)能测试成功,部署到linux服务器后一直报错 

1个com.sun.mail.util.MailConnectException: Couldn't connect to host异常解决

重要信息失败的消息:com.sun.mail.util.MailConnectException:无法连接到主机和22。首先想到的是linux的端口22没有开通,遂联系相关人员开通,但是可能出于安全考虑没有同意开通。 

没办法,只能更换端口了,需要对配置进行修改,这里我换的465端口,具体看上面的配置信息。

如果注意的是云服务器,例如阿里云,腾讯云等。需要注意,他们出于安全考虑可能会限制邮件端口,这个需要咨询,实在不行就改用465 ssl端口发送邮件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容