用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. [20190328]简单探究sql语句相关mutexes.txt

    [20190328]简单探究sql语句相关mutexes.txt --//摘要:http://www.askmaclean.com/archives/understanding-oracle-mute ...

  2. [20170604]12c Top Frequency histogram补充.txt

    [20170604]12c Top Frequency histogram补充.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING                 ...

  3. postgre中类似oracle的sql%rowcount用法

    get diagnostics cnt := row_count; 现在有两个表tab1和tab2,两个表的格式相同,tab1中有1000条数据,tab2中0条数据 创建测试功能函数 create o ...

  4. Java中输入字符的排列以及按从小到大的顺序输出

    今天笔试,遇到一个问题,大意就是输入一行字符,例如a b c ,按从小到大的顺序输出它们排列而成的字符串,输出就是abc acb bac bca cba cab.求这个程序怎么实现. 其实这个题很简单 ...

  5. PHP is much better than you think

    Rants about PHP are everywhere, and they even come from smart guys.When Jeff Atwood wrote yet anothe ...

  6. MY Views on Doctor-patient relationship 英语医患关系议论文

    MY Views on Doctor-patient relationship Author:Pleiades_Antares(www.cnblogs.com/irischen) 1. In rece ...

  7. HTTP Health Checks

    This article describes how to configure and use HTTP health checks in NGINX Plus and open source NGI ...

  8. P1279 字串距离 dp 洛谷

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...

  9. UVA129-Krypton Factor(搜索剪枝)

    Problem UVA129-Krypton Factor Accept:1959  Submit:10261 Time Limit: 3000 mSec  Problem Description 通 ...

  10. CSAPP:第三章程序的机器级表示3

    程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低 ...