想必大家在今天这个特殊的日子里,一定热血沸腾了一把。为上午的阅兵点70个赞!

进入Spring Mail的主题:

前后大概花了8个小时的时间来研究Spring封装的javaMail。本来觉得挺简单的应用,但是真正动手实现起来,出现各种各样不知所措的问题。

推荐几篇blog:

1. http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mail.html

2. http://obullxl.iteye.com/blog/703248

3. http://www.codejava.net/frameworks/spring/sending-e-mail-with-spring-mvc

论资料,当然首推Spring的官方文档(参考1)。清晰,简介。只是想动手实现时,发现文档里没有类Order的实现,在几经查看文档并试着拼凑出Order类的实现时,感觉太过浪费时间,想着自己大体实现mail的功能就行,没必要注重细节。可这是,碰到了参考3。 不得不感慨几句,不劳而获总是要付出代价的!

参考3中对Spring Mail的结构,实现等等,做了很清晰的概括+解释。而且也一步步build了一个Spring Mail实现。最后,还附上了源码!在Spring MVC框架下,实现邮件功能。

本人在这个的基础上做了小的改动(主要因为gmail在国内不能用。。。),而就是这个小的改动,给我整出来一个个不知所云的exception!

先把问题和原因总结一下:

1. Spring的版本问题

  提供的源码中Spring的版本是3.2..,自己用的jdk版本是1.8的。这两个版本不匹配,会造成加载xml文件时的错误。

2. 对JavaMailSenderImpl的配置问题

  由于源码中配置的是gmail,所以改成了163的。但是各个邮箱服务器的配置是有差异的。所以根据参考2里的说明,重新配置邮件服务器。但仍然出现让自己纠结了3个多小时的认证失败问题。修改javaMailProperties中的属性多次都无果。有人还说username只保留邮箱@符号的前部分,但尝试后仍然无果。最终认为自己163邮箱的smtp认证有问题吧。

3. 根据2的假想,想重新注册一个163邮箱试试。这个时候163又TMD恶心了我一把:需要下载客户端才能注册! 果断换注册sina邮箱了! 紧接着重新配置JavaMailSenderImpl。最后完成了邮件发送。

上代码 (以备后用):

Spring用4.0版本以上的。最好用Maven管理。

实验用的界面就是用的参考3的。

web.xml未改动

applicationContext.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config />
<mvc:annotation-driven />
<context:component-scan base-package="net.codejava.spring" /> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.email.com" />
<property name="username" value="your_email_address" />
<property name="password" value="******" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">30000</prop>
<prop key="mail.debug">true</prop>
<!-- <prop key="mail.smtp.starttls.enable">true</prop> --> </props>
</property>
</bean> <bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean> <bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">Error</prop>
</props>
</property>
</bean>
</beans>

class SendEmailController:

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; @Controller
@RequestMapping("/sendEmail.do")
public class SendEmailController { @Autowired
private JavaMailSender mailSender; @RequestMapping(method = RequestMethod.POST)
public String doSendEmail(HttpServletRequest request) {
// takes input from e-mail form
String sentFrom = "your_email_address";
String recipientAddress = request.getParameter("recipient");
String subject = request.getParameter("subject");
String message = request.getParameter("message"); // prints debug info
System.out.println("To: " + recipientAddress);
System.out.println("Subject: " + subject);
System.out.println("Message: " + message); // creates a simple e-mail object
SimpleMailMessage email = new SimpleMailMessage();
email.setFrom(sentFrom);
email.setTo(recipientAddress);
email.setSubject(subject);
email.setText(message); // sends the e-mail
mailSender.send(email); // forwards to the view named "Result"
return "Result";
}
}

自己动手,丰衣足食!

Spring Mail的更多相关文章

  1. 通过Spring Mail Api发送邮件

    使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章. [Spring ...

  2. Java邮件服务学习之四:邮箱服务客户端Spring Mail

    一.Spring Mail API Spring邮件抽象层的主要包为org.springframework.mail,Spring提供的邮件发送不仅支持简单邮件的发送.添加附件. 1.邮件发送的核心接 ...

  3. Spring Quartz结合Spring mail定期发送邮件

    文件配置例如以下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  4. Spring mail 邮件发送的简单实现

    package cn.taskSys.utils; import java.util.Properties; import org.springframework.mail.MailException ...

  5. 使用Spring Mail发送QQ邮件

    一.邮箱设置 QQ邮箱设置:http://service.mail.qq.com/cgi-bin/help?id=28, 下面这些服务需要开启(需要设置邮箱独立密码): 二.applicationCo ...

  6. 使用Spring的JAVA Mail支持简化邮件发送(转)

    闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是Mail ...

  7. Spring Boot 揭秘与实战(七) 实用技术篇 - Java Mail 发送邮件

    文章目录 1. Spring Boot 集成 Java Mail 2. 单元测试 3. 源代码 Spring 对 Java Mail 有很好的支持.因此,Spring Boot 也提供了自动配置的支持 ...

  8. spring boot(16)-mail发邮件

    上一篇讲了如何处理异常,并且异常最终会写入日志.但是日志是写在服务器上的,我们无法及时知道.如果能够将异常发送到邮箱,我们可以在第一时间发现这个异常.当然,除此以外,还可以用来给用户发验证码以及各种离 ...

  9. spring boot整合mail

    1.添加依赖 </dependency> <dependency> <groupId>org.springframework.boot</groupId> ...

随机推荐

  1. Kettle 合并记录报错!

    在Kettle的合并记录过程的时候,在“为了转换解除补丁开始 ”这一步的时候报错.具体错误如图所示: Kettle的转换如图所示: 问题原因:可能是你的数据库链接驱动和Kettle的版本不兼容. 解决 ...

  2. C# 随机颜色的方法

    public string GetRandomColor() { Random RandomNum_First = new Random((int)DateTime.Now.Ticks); // 对于 ...

  3. MapReduce框架Partitioner分区方法

    前言:对于二次排序相信大家也是似懂非懂,我也是一样,对其中的很多方法都不理解诶,所有只有暂时放在一边,当你接触到其他的函数,你知道的越多时你对二次排序的理解也就更深入了,同时建议大家对wordcoun ...

  4. javascript的变量,传值和传址,参数之间关系

    先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...

  5. php读取文件时多了个%uFEFF[bom字符],怎样去掉?

    今天从记事本文件中读取静态生成记录时,发现读出来的第一个链接打开的时候总是提示非法操作,把鼠标放到链接上发现链接的前面多了个%uFEFF, 百度一查,原来这是好多人都有遇到过的bom头问题,特地记录下 ...

  6. php设计模式之单例、多例设计模式

    单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...

  7. 第四章 管理程序流(In .net4.5) 之 事件和回调

    1. 概述 本章讲解如何使用 委托.lambda表达式 和 匿名方法 来创建和使用事件. 2. 主要内容 2.1 理解委托 委托是一种用方法签名形式定义的类型.可以让它指向其他方法,可以通过它调用其他 ...

  8. python Django 学习笔记(二)—— 一个简单的网页

    1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...

  9. rails bug

    variable @fontAwesomeEotPath_iefix is undefined rails generate bootstrap:install如果还有错,保证在加载主提之前impor ...

  10. 源码解析之setContentView

    分享一下我以前学习时做到PPT中的一部分. 不难看出其实设置布局是由PhoneWindow来完成的. 然而我们要记住DecorView: 包括:状态栏,标题栏,内容 phoneWindow -> ...