通过spring实现javamail发送邮件功能

以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念

首先spring的相关jar包都是要引入的,其次要引入mail.jar

<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
            <dependency>
                <groupId>com.sun.mail</groupId>
                <artifactId>javax.mail</artifactId>
                <version>${javax.mail.version}</version>
            </dependency>

然后需要配置一个spring-mail.xml这样的文件,如果不新建,也可以在service中加入就行,但是为了做更好的分层,还是分开较好

配置spring的javamail发送器,这边配置了qq邮箱和qq企业邮箱的配置,需要注意的是host是不同的,另外如果是个人qq邮箱,需要使用授权码,授权码在qq邮箱中查看即可,而企业邮箱就是企业管理员分配的登录密码即可

    <!-- 使用qq邮箱 -->
    <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!--         <property name="host" value="smtp.qq.com"/> -->
        <property name="host" value="smtp.exmail.qq.com"/>
        <property name="port" value="587"/>
<!--         <property name="username" value="xxxxx@qq.com"/> -->
        <property name="username" value="xxxx@xxxxx.com"/>
        <!-- qq邮箱的授权码,如果是企业邮箱,则使用登录密码 -->
<!--         <property name="password" value="xxxxxxxxxxxxxxx"/> -->
        <property name="password" value="xxxxxxxxxxxxxxx"/>
        <property name="javaMailProperties">
            <props >
                <prop key="mail.smtp.auth">true</prop>
            </props>
        </property>
    </bean>

 

附带一提网易邮箱是多么的坑爹:

    <!-- 使用163邮箱 -->
<!--     <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> -->
<!--         <property name="host" value="smtp.163.com"/> -->
<!--         <property name="port" value="25"/> -->
<!--         <property name="username" value="xxxxxxxxx@163.com"/> -->
<!--         163邮箱的授权码,而不是登录密码 -->
<!--         <property name="password" value="xxxxxxxxxxxx"/> -->
<!--         <property name="javaMailProperties"> -->
<!--             <props > -->
<!--                 <prop key="mail.smtp.auth">true</prop> -->
<!--             </props> -->
<!--         </property> -->
<!--     </bean> -->

使用网易邮箱会莫名报554的错误,也是就是说认定你的邮件是垃圾邮件,重复发送同一份邮件,内容一致,或者带有相关关键字,都会被列为垃圾邮件,然后会禁止30分钟左右,非常不人性化,所以不建议使用163作为发送器

配置邮箱的发送者以及标题,这个不写也可以,可以在发送的时候直接配置都行

    <bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="from" value="xxxxx@xxxx.com" />
<!--         <property name="from" value="xxxxx@qq.com" /> -->
        <property name="subject" value="xxxx" />
    </bean>

最后的配置是freemarker模板,为何要模板,因为我们平时发送邮件会有很多不同的分类,分类配置在枚举中,根据不同的分类去选择不同的模板,一般来说注册码,密码重置,活动页面等等都需要作为一个单独的HTML来发送,而一个HTML我们不可能会以servlet的形式把标签都写在java代码中,所以采用模板来实现,是最好的方式:

<!--FreeMarker模板-->
    <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="classpath:freemarker" />
        <property name="freemarkerSettings">
            <props>
                <prop key="locale">zh_CN</prop>
                <prop key="default_encoding">UTF-8</prop>
            </props>
        </property>
    </bean>

配置模板路径

填充模板内容

<h2><font color="green">${nickName},您好!</font></h2>
<p>注意:30分钟后链接将失效!</p>
<p>请点击以下链接完成密码重置操作:</p>
<p><a href="www.abc.com" target="_blank">www.abc.com/user/reset?userId=test10011</a></p>
<p>${content}</p>

编写邮件发送器,一方面从freemarker中构建邮件内容,一方面再执行mail发送操作

@Component
public class PwdMailSender {

    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private SimpleMailMessage simpleMailMessage;
    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    /**
     *
     * @Description: 从模板中构建邮件内容
     * @param nickName        用户昵称
     * @param content        邮件内容
     * @param email            接受邮件
     *
     * @author leechenxiang
     * @date 2017年2月5日 下午1:22:00
     */
    public void send(String nickName, String content, String email) {
        String to = email;
        String text = "";
        Map<String, String> map = new HashMap<String, String>(1);
        map.put("nickName", nickName);
        map.put("content", content);
        try {
            // 根据模板内容,动态把map中的数据填充进去,生成HTML
            Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");
            // map中的key,对应模板中的${key}表达式
            text = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
        sendMail(to, null, text);
    }

    /**
     *
     * @Description: 执行发送邮件
     * @param to            收件人邮箱
     * @param subject        邮件主题
     * @param content        邮件内容
     *
     * @author leechenxiang
     * @date 2017年2月5日 下午1:22:34
     */
    public void sendMail(String to, String subject, String content) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
            messageHelper.setFrom(simpleMailMessage.getFrom());
            if (subject != null) {
                messageHelper.setSubject(subject);
            } else {
                messageHelper.setSubject(simpleMailMessage.getSubject());
            }
            messageHelper.setTo(to);
            messageHelper.setText(content, true);
           javaMailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

最后在需要调用的地方执行就行

@Autowired
    private PwdMailSender pwdMailSender;

    @RequestMapping("/mail")
    @ResponseBody
    public Object mail(){
        pwdMailSender.send("lee", "在这里填写你所需要的内容", "leechenxiang@163.com");
        return "success";
    }

然后收到的邮件内容就如下

 

需要注意的是,这么做发送邮件由于单线程操作是不可取的,可以参考之前的多线程,执行多线程操作,或者引入消息队列RMQ或者AMQ来发送邮件,异步操作优于同步操作。

 

时间: 2024-09-26 05:03:37

通过spring实现javamail发送邮件功能的相关文章

Spring整合javamail 用gmail发送邮件

Spring整合javamail成功之后,把大量的代码配置到spring的配置文件里了 ,从而降低了Javamail对邮箱.端口.协议.主题.内容-- 的耦合.在客户端上只需要调用一行代码就可以发送邮件了. 首先不需要往项目的lib里导入jar,但是需要在tomcat的lib里导入3个jar文 件activation.jar ,jspsmartupload.jar,mail.jar 导入这3个jar文件,这样 tomcat就不会报错了. SendManagerService .java pack

JavaWeb中使用JavaMail实现发送邮件功能实例详解_java

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp <%@ page language="java" pag

Spring学习笔记3之消息队列(rabbitmq)发送邮件功能_java

rabbitmq简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBM WEBSPHERE MQ. 本节的内容是用户注册时,将邮

javamail发送邮件

发送邮件 /*在java版经常看到有人问如何用javamail发送邮件?如何接收邮件?如何访问多个文件夹等.问题零散,而历史的回复早已经淹没在问题的海洋之中. 本人之前所做过一个java项目,其中包含有WebMail功能,当初为用java实现而对javamail摸索了一段时间,总算有点收获.看到论坛中的经常有此方面的问题,因此把我的一些经验帖出来,希望对大家有些帮助. 此篇仅介绍用javamail实现发送邮件功能,其中涉及smtp认证,邮件附件发送,及HTML内容邮件等.其它有关多邮箱的实现,接

使用JavaMail发送邮件的Java类

使用JavaMail发送邮件需要用到mail.jar和activtion.jar两个包. 该类实现了较完整的邮件发送功能,包括以HTML格式发送,添加附件和抄送人.下面是具体的代码: Mail.java: package cn.cgw.util.mail; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.ma

javamail发送邮件的简单实例(转)

  javamail发送邮件的简单实例 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接复制即可. 第一个类:MailSenderInfo.java  package com.util.mail;    /**    * 发送邮件需要使用的基本信息  *author by wangfun   */     import java.util.Pro

javamail发送邮件可能的异常种类

问题描述 javamail发送邮件可能的异常种类 刚进公司的小白,要做一个邮件反馈的功能, 我用javamail写的,测试都能通过,就是想问下有没有办法能获取到反馈,比如说用户是成功接收邮件还是接收失败. 而且javamail 的包 好像与javaee5有冲突,要把环境换成ee_6,可是我本地换了之后项目发布测试的时候会不会有问题. 因为服务器的项目本身是5的环境 解决方案 有可能被当做垃圾邮件放入垃圾箱 这个不是异常,没办法判断 只能判断你和smtp服务器的通讯是否成功,这个try catch

javamail发送邮件,超链接无法访问

问题描述 javamail发送邮件,超链接无法访问 我用javamail发送html邮件给QQ邮箱,在html中我加入了标签和连接.但是每次发送到那边,链接都无法点击是怎么回事? 解决方案 之前测试mail这个功能的时候,简单的作出了发送email的功能,但是仅仅发给一个人可以,发送多个联系人就会出错,发送失败!请与邮件管理员联系. javax.mail.internet.AddressException: Illegal whitespace in address in string ``sh

javamail发送邮件报错,求指教。

问题描述 javamail发送邮件报错,求指教. 前段时间写了一个简单的javamail发送邮件的功能,测试功能正常后就没管了.今天再次测试的时候,发现居然报错了.求大神指点指点. package com.temp.test; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax