用javamail实现注册用户验证邮箱功能。用户注册后随机生成一个uuid作为用户的标识,传递给用户然后作为路径参数。发送html的内容到用户注册的邮箱里,若用户点击后去往的页面提交username和password比对成功,则用户验证成功。

下面介绍代码。我用的是shiro作为安全框架。实际上我只用来做权限控制,这里不介绍shiro。springmvc作前端控制器,hibernate作数据库操作(为什么不用mybatis?我也很后悔没有用mybatis)用户注册代码

    @RequestMapping("base/register")
public String register(User u, Model model) {
if (u != null && StringUtils.isNoneBlank(u.getPassword()) && StringUtils.isNotBlank(u.getUsername())) {
boolean nameExi = userService.checkUserName(u.getUsername());
if (!nameExi) {
// 为用户创建‘用户’角色
u.setPassword(Md5Utils.toMd5(u.getPassword(), u.getUsername(), ));
Role role = roleService.getRoleByRoleName("游客");
u.setRole(role);
u.setRegisterDate(new Date());
u.setActivecode(UUID.randomUUID().toString().replace("-", ""));
userService.register(u);
String ip="";
errorInfo = "请在邮箱中激活您的账户";
try {
InetAddress addr=InetAddress.getLocalHost();
ip =addr.getHostAddress();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
User registerU = userService.checkRealmUserName(u.getUsername());
String subject="发给-"+registerU.getUsername();
String email=registerU.getEmail();
String msg="<h2>hi"+registerU.getUsername()+"</h2><hr><h4>thanks for reading this email and click this link to active your account<a href='http://"+ip+":8080/myone-web/base/activeCount?activecode="+registerU.getActivecode()+"'>点击这里激活您的账户</a></h4>";
MailSender mailSender=new MailSender();
mailSender.sendActiveMail(msg, subject, email, javaMailSender);
model.addAttribute("errorInfo", errorInfo);
return "user_login"; // 用户注册成功
}
// 用户注册失败
errorInfo = "注册失败 用户名已存在 或注册信息有误";
model.addAttribute("errorInfo", errorInfo); }
return "error";
}

如果又看不懂的代码可以不看主要看传递邮箱的参数即可,这里还有一个注入了一个JavaMailSender类。新建发送邮件的项目:

创建maven项目加入依赖

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.</version>
</dependency>

我用了spring这里也给出

<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3..RELEASE</version>
</dependency>

这些依赖只会多不会少 注意我这里没有version参数 因为我在之前做了锁定

<properties>
<spring.version>4.2..RELEASE</spring.version>
<hibernate.version>5.0..Final</hibernate.version>
<jackson.version>2.7.</jackson.version>
</properties>

javamail需要的包都在第一个依赖里

spring的applicationContext.xml部分配置文件

    <!-- 邮件配置 -->
<context:property-placeholder location="classpath:mail.properties" /> <!-- 邮件接口 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.smtp.host}"></property>
<property name="username" value="${mail.smtp.username}"></property>
<property name="password" value="${mail.smtp.password}"></property>
<property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
</props>
</property>
</bean>

mail.properties配置文件

mail.smtp.host=smtp..com

mail.smtp.username=。。。。。@.com

mail.smtp.password=。。。

mail.smtp.defaultEncoding=utf-

mail.smtp.auth=true

mail.smtp.timeout=

放到resouce目录下或者选中文件夹build classpath

下面是我写的已sendMail实现,其实就两个方法,一个单独发送,一个发送多个联系人

package com.dabai.utils;

import java.util.Properties;

import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper; /**
* @author dabai: * 类说明 发送邮件工具类
*/
public class MailSender {
//用户激活邮件
public String sendActiveMail(String msg,String subject,String userEmail,JavaMailSender javaMailSender){
//创建邮件对象
MimeMessage mMessage =javaMailSender.createMimeMessage();
MimeMessageHelper mMessageHelper;
Properties prop=new Properties();
//获取发送邮件参数
try {
prop.load(this.getClass().getResourceAsStream("/mail.properties"));
String from =prop.get("mail.smtp.username")+"";
mMessageHelper=new MimeMessageHelper(mMessage,true,"UTF-8");
//发送邮箱
mMessageHelper.setFrom(from);
//收件人
mMessageHelper.setTo(userEmail);
//邮件标题 主题
mMessageHelper.setSubject(subject);
//设置邮件文本内容为html
mMessageHelper.setText(msg,true); //发送
javaMailSender.send(mMessage);
} catch (Exception e) {
e.printStackTrace();
return " email send fail";
} return "email send success";
}
//生日祝福邮件
public String sendWish(String msg,String subject,InternetAddress[] emails,JavaMailSender javaMailSender){
//创建邮件对象
MimeMessage mMessage =javaMailSender.createMimeMessage();
MimeMessageHelper mMessageHelper;
Properties prop=new Properties();
//获取发送邮件参数
try {
prop.load(this.getClass().getResourceAsStream("/mail.properties"));
String from =prop.get("mail.smtp.username")+"";
mMessageHelper=new MimeMessageHelper(mMessage,true,"UTF-8");
//发送邮箱
mMessageHelper.setFrom(from);
mMessageHelper.setSubject(subject);
mMessageHelper.setText(msg,true);
mMessageHelper.setTo(emails); javaMailSender.send(mMessage);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "email send finished";
} }

两个方法上面是用户注册是发送验证邮箱链接的,下面的方法是根据用户birthday给指定人发送邮件祝福,用quartz实现定时,此处不介绍

  下面是用户注册逻辑 使用上面的第一个方法发送邮件

这里介绍下传递的参数  第一个方法的:

这一块:没有部署到远程主机上可以不用,url的路径写死即可,如果有域名的话写域名也ok对应这发送的信息  msg

String msg="<h2>hi"+registerU.getUsername()+"</h2><hr><h4>thanks for reading this email and  click this link to active your account<a href='http://"+ip+":8080/myone-web/base/activeCount?activecode="+registerU.getActivecode()+"'>点击这里激活您的账户</a></h4>";

html没问题吧不做解释。subject  :string类型即可 发送邮件的主题

email 接收邮件的邮件地址 单个发可以写成string类型的  多个接收方要换成InternetAddress【】类型,转换也比较烦人。

MailSender  :就是我写的那个 方法类

javaMailSender这就是前面在spring中注入的那个javamailImpl 。前面给出了配置 在你需要用到的地方@Autowired即可。

如果有用网易163的朋友可能会报

• DT:SPM

这样子的错误  通常是因为邮件的subject写的比较繁杂,就是花里胡哨的

其他的错误代码可参照

http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

关于 MailSender工具类  大部分我在注释上给出了 这里说一下  下面setText后面跟的参数的意思  设置为false代表你只在msg中设置字符串,如果你想在msg中写html格式就要改成true  如设置为false 邮件显示msg内容为:    <h1>dabai</h1>

设置为true邮件msg内容就是

dabai

mMessageHelper.setText(msg,true);

关于发送给多个接收者:

就是MailSender类的第二个方法  同样这里给出使用方法

package com.dabai.jobs;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List; import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender; import com.dabai.service.UserService;
import com.dabai.utils.MailSender; /**
* @author dabai: * 类说明 查找当日生日的用户 发送生日祝福邮件类
*/
public class SendBirthdayWish {
@Autowired
private UserService userService;
@Autowired
private JavaMailSender javaMailSender;
public void sendWish() throws AddressException{
Calendar date=Calendar.getInstance();
int month=date.get(Calendar.MONTH)+;
int day = date.get(Calendar.DAY_OF_MONTH); List<String>emails=userService.findBirthdayEmails(month,day);//根据当日的月份和天数从数据库中查询用户邮箱 因为我这里注册需要邮箱所以不存在为空的情况 这里不需判断 但我还是加了上去。。。 实际使用请斟酌一二
if(emails!=null&&emails.size()>){              //这里的一串代码可能看的有些迷糊 但是的确不好省掉 首先注意下我查出来的是List<String>的集合 然后我又把它换成String[]数组形式存储 然后再用List接收经过InternetAddress转换后的emal地址
                                       //最后用InternetAddress[]数组接收
String[]array=new String[emails.size()];
List list=new ArrayList();
InternetAddress[]address=null;
for (int i=;i<emails.size();i++) {
array[i]=emails.get(i);
}
for(int i=;i<array.length;i++){
list.add(new InternetAddress(array[i]));
}
address=(InternetAddress[]) list.toArray(new InternetAddress[list.size()]); String msg="<h2> hi Dear</h2><br><b><pre>today is"+month+"月"+day+"日 and it's your birthday! happy birthday to you </pre></b>";
String subject="祝你生日快乐";
MailSender mailsender=new MailSender();
mailsender.sendWish(msg, subject, address, javaMailSender);      //msg就是发送的信息 内容 subject 邮件主题 string类型即可 address 如果是多个接收者必须用InternetAddress[]
}else{
System.out.println("today nobody birthday"+new Date().toString());
} } }

下面是我踩得一些坑

DEBUG [schedulerFactoryBean_Worker-] - trace com.mchange.v2.resourcepool.BasicResourcePool@7af9a2cc [managed: , unused: , excluded: ] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@231bf06e)
ERROR [schedulerFactoryBean_Worker-] - Job DEFAULT.sendWishJob threw an unhandled Exception:
org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'sendWish' on target class [class com.dabai.jobs.SendBirthdayWish] failed; nested exception is java.lang.ArrayStoreException
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:)
at org.quartz.core.JobRunShell.run(JobRunShell.java:)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:)
Caused by: java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.ArrayList.toArray(ArrayList.java:)
at com.dabai.jobs.SendBirthdayWish.sendWish(SendBirthdayWish.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:)
... more
ERROR [schedulerFactoryBean_Worker-] - Job (DEFAULT.sendWishJob threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'sendWish' on target class [class com.dabai.jobs.SendBirthdayWish] failed; nested exception is java.lang.ArrayStoreException]
at org.quartz.core.JobRunShell.run(JobRunShell.java:)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:)
Caused by: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'sendWish' on target class [class com.dabai.jobs.SendBirthdayWish] failed; nested exception is java.lang.ArrayStoreException
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:)
at org.quartz.core.JobRunShell.run(JobRunShell.java:)
... more
Caused by: java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.ArrayList.toArray(ArrayList.java:)
at com.dabai.jobs.SendBirthdayWish.sendWish(SendBirthdayWish.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:)
... more

如果地址不经转换就会报上面那个错误

还一个就是

 java.lang.ArrayIndexOutOfBoundsException: 

在最初的转换中我用String[]array=new String[]{};

接收  再逐个放入然后逐个放入的代码报了上面那个越界错误需要改成:犯这种错实在不应当,

String[]array=new String[emails.size()];

javaMail发邮件,激活用户账号的更多相关文章

  1. Java - JavaMail - 利用 JavaMail 发邮件的 小demo

    1. 概述 面试的时候, 被问到一些乱七八糟的运维知识 虽然我不是干运维的, 但是最后却告诉我专业知识深度不够, 感觉很难受 又回到了一个烦人的问题 工作没有深度的情况下, 你该如何的提升自己, 并且 ...

  2. struts2集成javamail发邮件(带附件)实践记录

    一.代码预览 这两天在做struts2上的邮件发送.以前的项目有用到spring,用spring提供的邮件支持类很方便可以完成这个功能,但是现在只用struts2的话,就碰到了一系列的问题. 代码是从 ...

  3. javamail发邮件

    使用JavaMail发送一封简单邮件的步骤:(1)创建代表邮件服务器的网络连接信息的Session对象.(2)创建代表邮件内容的Message对象(3)创建Transport对象.连接服务器.发送Me ...

  4. 【知识积累】JavaMail实现发邮件功能

    一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...

  5. JavaMail之-通过邮件激活账号

    关键点就在于: 根据用户的给出的email,给这个email发送一个邮件.这个邮件中应该带有一个激活码?(32位UUID,64位UUID). 大概步骤: 1,  注册功能 - 只要用户注册成功,就给他 ...

  6. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

  7. 使用JavaMail创建邮件发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  8. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  9. (转载)JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    博客源地址:http://www.cnblogs.com/xdp-gacl/p/4216311.html 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封 ...

随机推荐

  1. mssql sqlserver SQL 位运算举例权限应用

    摘要: 下文通过举例的方式讲述sqlserver中位运算的相关知识,如下所示: 实验环境:sqlserver 2008 R2 在sqlserver的权限设置,我们通常使用1.2.4.8.16.32.6 ...

  2. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

  3. Dapp已来,如何把握区块链创富模式变化的趋势

    区块链技术持续升温,Dapp迅速成为焦点,未来区块链市场上新的蓝海.这么说当然不是空想出来的,而是从区块链市场的发展趋势中推断而来.区块链市场由最初的挖矿炒币到如今尝试投入行业应用,随着技术和应用模式 ...

  4. c++ 右值引用,move关键字

    c++ move关键字 move的由来:在 c++11 以前存在一个有趣的现象:T&  指向 lvalue (左传引用), const T& 既可以指向 lvalue 也可以指向 rv ...

  5. android调试工具adb命令大全

    转载: 一.adb介绍SDK的Tools文件夹下包含着Android模拟器操作的重要命令adb,adb的全称为(Android Debug Bridge就是调试桥的作用.通过adb我们可以在Eclip ...

  6. C++借助curses库实现俄罗斯方块

    主要要实现如下几个功能:方块的移动控制.方块变形.判定方块是否接触边界和进行方块堆积.对方块进行消除. 1.方块的移动控制上下左右四个方向上-->变形,下-->加速下落,左-->向左 ...

  7. Ubuntu 12.04上安装HBase并运行

    Ubuntu 12.04上安装HBase并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.HBase的安装 在官网上下载HBase-1.1.2 ...

  8. [福大软工] Z班 团队Alpha阶段成绩汇总

    团队成绩汇总表 团队 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 总分 Dipper 9 85 90 26 42 27.5 120 74 25 111 19 628.5 SW ...

  9. Nmap参考指南(Man Page)

    Table of Contents 描述 译注 选项概要 目标说明 主机发现 端口扫描基础 端口扫描技术 端口说明和扫描顺序 服务和版本探测 操作系统探测 时间和性能 防火墙/IDS躲避和哄骗 输出 ...

  10. 【C编程基础】C编译链接命令gccc

    1.gcc安装 rpm -qa|grep gcc ==>检查gcc是否安装 gcc -v ==>检查gcc版本 yum -y install gcc ==>安装gcc  2.基本语法 ...