JAVA实现找回密码的详细功能

这里,首先向大家简单介绍一下尚邮绑定邮箱的注意事项:

1、请先确认您的邮箱支持pop3
只要支持pop3或者imap4协议的公众邮箱和企业邮箱都可以使用尚邮。
目前大多数免费公众邮箱都支持pop功能,但是部分需要要手动开启(在本文的后面我们会针对几个常见的公众邮箱开通POP服务以及服务器配置方式进行介绍)。确认您的邮箱支持pop3或者imap4协议后您就可以绑定邮箱了。

2、绑定邮箱:
在手机客户端和尚邮网站用户中心的“邮箱管理”中都可以进行绑定邮箱的操作。
绑定邮箱有两个步骤:一,选择公众邮箱或其他邮箱;二,填写邮箱配置信息。
“公众邮箱”指的是常用的免费邮箱(sina、sohu、qq、139、Gmail等),尚邮已对这些常见邮箱进行了配置,因此在绑定时只需填写基础信息即可“绑定,如图所示。

“其他邮箱”指的是除“公众邮箱”列表中列出的邮箱外所有支持pop或imap的邮箱。对于常见邮箱,服务器可以自动对其进行配置,只要填写基础信息后直接“添加”即可;而对于部分配置较为特殊的企业邮箱或国外邮箱则需要手动配置服务器信息,如果直接添加将会提示“请选择邮件类型”,此时需要将“服务器选项”勾选后再手动填写,如图所示。

补充说明:邮箱配置信息中最容易出现错误的还有邮箱登录名的填写,多数情况下邮箱登录名就是邮箱地址@前面的部分,但部分企业邮箱和个别公众邮箱使用地址全称做登录名的,如雅虎、126邮箱。

可能出现的问题:为什么绑定邮箱操作后已出现在邮箱列表中的邮箱消失了?
在手机客户端上绑定邮箱时尚邮要进行两个步骤的工作:一是,向提交邮箱的配置信息;二是,服务器对提交的信息进行验证。因此当您填写并提交邮箱信息后手机客户端会提示提交成功,这时邮箱列表中能够看到您提交的邮箱,但前面显示一个####的问号。服务器接到您提交的信息后会进行验证,如果验证未通过,您邮箱列表中的那个邮箱将会消失;验证成功后,邮箱列表中邮箱前面的####问号将会变成绿色的对勾。由于目前手机客户端对邮箱绑定的提交和验证是异步的,因此建议您直接在网页用户中心中绑定邮箱,更加直观。

新浪(sina)邮箱配置方法及介绍
新浪邮箱自今年(08年)6月分服务器被攻击后开始对pop取件频率进行了严格限制,同时新注册的用户需要手动才能开通pop功能(老用户不需要)。
手动开通pop的方法:
登录新浪邮箱后点击“邮箱设置”-“帐户”-“pop-smtp设置”勾选“开启”后“保存”,如图所示:

服务器配置方法:
类型: POP3

接收邮件服务器: pop.sina.com

接收端口: 110    SSL 否

发送邮件服务器: smtp.sina.com

发送端口: 25    SSL 否

QQ邮箱配置方法及介绍
QQ邮箱需要通过手动的方式开启pop功能,方法如下:
登陆您的QQ邮箱页面后点击页面上方的“设置”-“账号”-“POP3/SMTP服务”勾选“开启POP3/SMTP服务”后“保存修改”,如图所示

服务器配置方法:
类型: POP3

接收邮件服务器: pop.qq.com

接收端口: 110    SSL 否

发送邮件服务器: smtp.qq.com

发送端口: 25    SSL 否

同时QQ邮箱可以同时开通Foxmail邮箱,这样邮箱容量更大,功能更全,而使用的实际上是一个邮箱。

Foxmail配置:

类型: POP3 
接收邮件服务器: pop.qq.com
接收端口: 110    SSL 否 
发送邮件服务器: smtp.qq.com
发送端口: 25    SSL 否
用户名:用户名@Foxmail.com

网易(126\163\yeah.net)邮箱配置方法及介绍
网易免费邮箱对pop取信频率有严格的限制,因此相对取信速度比较慢。网易免费邮箱中126和163邮箱06年后注册的以及yeah.net邮箱07年后的注册用户不再支持pop功能,需要定制其“随身邮服务”方可开通,老用户本身就是支持pop功能的,无需定制。

126邮箱配置方法:
类型: POP3

接收邮件服务器: pop.126.com

接收端口: 110    SSL 否

发送邮件服务器: smtp.126.com

发送端口: 25    SSL 否 
特别说明:如果您确认您的126邮箱开通了POP功能,但还是不能绑定成功,可以尝试在邮箱用户名处填写126邮箱地址全称,再看是否能绑定成功。通常,126邮箱无论使用@符号前内容或者用邮箱全称来填写“邮箱用户名”都可以成功绑定。您可以多尝试下。

163邮箱配置方法:
类型: POP3

接收邮件服务器: pop.163.com

接收端口: 110    SSL 否

发送邮件服务器: smtp.163.com

发送端口: 25    SSL 否

Yeah.net配置方法:
类型: POP3

接收邮件服务器: pop.yeah.net

接收端口: 110    SSL 否

发送邮件服务器: smtp. yeah.net

发送端口: 25    SSL 否

雅虎(yahoo.com.cn\yahoo.cn)邮箱配置方法及介绍
目前尚邮支持比较好的是雅虎中国邮箱:yahoo.com.cn和yahoo.cn。雅虎中国邮箱需要定制“来信提醒”的服务方可开通pop功能。
方法如下:
登陆雅虎邮箱后点击“pop+来信提醒”-“关联手机”-“定制”-“设置”完毕后即可开通pop,同时有新邮件时雅虎也会给你发送短信提醒,如图所示:

也有网友提供雅虎免费开通pop功能的方法
配置方法:
类型: POP3 
接收邮件服务器: pop.mail.yahoo.com.cn
接收端口: 995    SSL 是 
发送邮件服务器: smtp.mail.yahoo.com
发送端口:465    SSL 是

Gmail邮箱配置方法及介绍
Gmail邮箱也需要手动配置pop或者imap功能。
配置方法如下:
登录Gmail邮箱后点击“设置”-“转发和pop
smtp”-“pop下载”下勾选“对从现在起所收到的邮件启用pop”或者“IMAP访问”中勾选“启用IMAP”然后“保存更改”

POP3配置方法:
类型: POP3 
接收邮件服务器: pop.gmail.com
接收端口: 995    SSL 是 
发送邮件服务器: smtp.gmail.com
发送端口: 465    SSL 是 
IMAP配置方法:
类型: IMAP4 
接收邮件服务器: imap.gmail.com
接收端口: 993    SSL 是 
发送邮件服务器: smtp.gmail.com
发送端口: 465    SSL 是

补充说明:由于Gmail邮箱服务器本身设置的原因,Gmail邮箱邮件只允许邮件客户端软件pop收取一次,因此尚邮取过的邮件,pc客户端如outlook将收不到,反之亦然。另外,Gmail邮箱是将已发送邮件和收到的邮件存放在一起的,所以使用客户端软件收Gmail的邮件会将已发送的邮件一同收取下来。

Hotmail邮箱配置方法及介绍
Hotmail邮箱目前已全面支持pop功能,无需手动开启。
服务器配置方法如下:
类型: POP3

接收邮件服务器: pop3.live.com

接收端口: 995    SSL 是

发送邮件服务器: smtp.live.com

发送端口: 25    TLS/SSL 是 
补充说明:Hotmail的邮箱用户名一定要填写地址全称,否则无法成功绑定。

具体代码实现过程:

下面是程序步骤:

  1. 与邮件发送服务器建立器Socket连接(需要端口号和服务器名称)
  2. 用"HELO"命令注册到服务器上
  3. 用"AUTH LOGIN"命令,根据已有的邮箱账号和密码登陆到服务器
  4. 用"MAIL FROM<..>"命令设置邮件源地址信息
  5. 用"MAIL TO<..>"命令设置邮件目的地址信息
  6. 用"DATA","FROM","TO","SUBJECT"命令分别设置发件人昵称,收件人昵称,主题信息和内容,"."+回车结束内容输入
  7. 最后用"QUIT"命令退出邮件发送服务

——————————————————————————————————————————————————————

下面是程序代码:

定义一个接口,主要是上面步骤方法的声明:

SendMail.java:

package com.sunflower.yuan.sendmail;

import java.io.IOException;

/**
 * @author zhang
 *
 */
public interface SendMail {

    /**
     * 向服务器发送命令
     *
     * @param order
     *            向服务器发送的命令行
     * @return 返回服务器状态
     * */
    public int sendToServer(String order);

    /**
     * 解析服务器返回的应答信息
     *
     * @return 返回服务器状态
     * */
    public int getResult();

    /** 与服务器发起会话 */
    public void regist() throws IOException;

    /** 登录到服务器 */
    public void login() throws IOException;

    /** 设置邮件源地址 */
    public void setMailFrom() throws IOException;

    /** 设置邮件目的地址 */
    public void setMailTo() throws IOException;

    /** 设置邮件内容 */
    public void setData() throws IOException;

    /** 退出邮箱服务 */
    public void quit() throws IOException;

    /** 发送邮件的主程序 */
    public boolean sendMail() throws IOException;

}

接口的实现类。

SendMailImp.java:

package com.sunflower.yuan.sendmail;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;

import sun.misc.BASE64Encoder;

/**
 * @author zhang
 */
public class SendMailImp implements SendMail {
    public static final int SINA = 0;
    public static final int QQ = 1;
    public static final int FOXMAIL = 2;
    public static final int WANGYI163 = 3;
    public static final int WANGYI126 = 8;
    public static final int YEAH = 4;
    public static final int HOTMAIL = 5;
    public static final int YAHOO = 6;
    public static final int GMAIL = 7;

    /** 用于向服务器发起连接 */
    private Socket socket = null;
    /** 与服务器连接后的输入流 */
    private BufferedReader input = null;
    /** 与服务器连接后的输出流 */
    private BufferedWriter output = null;
    /** 发送邮件服务器名称 */
    private String server = null;
    /** 发送端口号 */
    private int port;
    /** 邮件信息 */
    private MailMessage message;

    public MailMessage getMessage() {
        return message;
    }

    //设置邮件的信息内容,以方法链的方式实现
    public SendMailImp setMessage(MailMessage message) {
        this.message = message;
        return this;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    public BufferedReader getInput() {
        return input;
    }

    public void setInput(BufferedReader input) {
        this.input = input;
    }

    public BufferedWriter getOutput() {
        return output;
    }

    public void setOutput(BufferedWriter output) {
        this.output = output;
    }

    public String getServer() {
        return server;
    }

    public void setServer(String server) {
        this.server = server;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    /**
     * 根据邮箱类型,设置发送邮件服务器和端口号
     */
    public static SendMailImp getInstance(int sendMailType) {
        SendMailImp sendMailImp = new SendMailImp();
        switch (sendMailType) {
        case SINA:
            sendMailImp.setServer("smtp.sina.com");
            sendMailImp.setPort(25);
            break;
        case QQ:
        case FOXMAIL:
            sendMailImp.setServer("smtp.qq.com");
            sendMailImp.setPort(25);
            break;
        case WANGYI126:
            sendMailImp.setServer("smtp.126.com");
            sendMailImp.setPort(25);
            break;
        case WANGYI163:
            sendMailImp.setServer("smtp.163.com");
            sendMailImp.setPort(25);
            break;
        case YEAH:
            sendMailImp.setServer("smtp.yeah.net");
            sendMailImp.setPort(25);
            break;
        case YAHOO:
            sendMailImp.setServer("smtp.mail.yahoo.com");
            sendMailImp.setPort(465);
            break;
        case GMAIL:
            sendMailImp.setServer("smtp.gmail.com");
            sendMailImp.setPort(465);
            break;
        case HOTMAIL:
            sendMailImp.setServer("smtp.live.com");
            sendMailImp.setPort(25);
            break;
        default:
            break;
        }

        try {
            // 与发送邮件服务器建立Socket连接,并得到输入输出流
            Socket socket = new Socket(sendMailImp.getServer(), sendMailImp
                    .getPort());
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            BufferedWriter output = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()));

            sendMailImp.setSocket(socket);
            sendMailImp.setInput(input);
            sendMailImp.setOutput(output);
        }
        catch (UnknownHostException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        return sendMailImp;
    }

    public int sendToServer(String order) {
        try {
            this.getOutput().write(order);
            this.getOutput().newLine();
            this.getOutput().flush();

            System.out.println("已发送命令:" + order);
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        return getResult();
    }

    public int getResult() {
        String line = "";
        try {
            line = this.getInput().readLine();
            System.out.println("服务器返回状态:" + line);
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        // 从服务器返回消息中取得状态码,并转换成整数返回
        StringTokenizer get = new StringTokenizer(line, " ");
        return Integer.parseInt(get.nextToken());
    }

    public void regist() throws IOException {
        int result = getResult();
        // 连接上服务器后,服务器给出220应答
        if (result != 220)
            throw new IOException("连接服务器失败");

        result = sendToServer("HELO " + this.getServer());
        // HELO命令成功后,服务器返回250应答
        if (result != 250)
            throw new IOException("注册邮件服务器失败");
    }

    public void login() throws IOException {
        BASE64Encoder encode = new BASE64Encoder();

        int result = sendToServer("AUTH LOGIN");
        // 登陆服务成功,服务器返回334应答
        if (result != 334)
            throw new IOException("登陆服务失败");

        // 对邮箱用户名进行验证
        result = sendToServer(encode.encode(this.message.getUser().getBytes()));
        if (result != 334)
            throw new IOException("用户名错误");

        // 对邮箱密码进行验证
        result = sendToServer(encode.encode(message.getPassword().getBytes()));
        if (result != 235)
            throw new IOException("用户验证错误");
    }

    public void setMailFrom() throws IOException {
        int result = sendToServer("MAIL FROM:<" + this.getMessage().getFrom()
                + ">");
        if (result != 250)
            throw new IOException("邮件源地址错误");
    }

    public void setMailTo() throws IOException {
        int result = sendToServer("RCPT TO:<" + this.getMessage().getTo() + ">");
        if (result != 250)
            throw new IOException("邮件目的地址错误");
    }

    public void setData() throws IOException {
        int result = sendToServer("DATA");
        // 输入date回车后,若收到354应答后,继续输入邮件内容
        if (result != 354)
            throw new IOException("不能发送数据");

        this.getOutput().write("FROM:" + this.getMessage().getDatafrom());
        this.getOutput().newLine();
        this.getOutput().write("TO:" + this.getMessage().getDatato());
        this.getOutput().newLine();
        this.getOutput().write("SUBJECT:" + this.getMessage().getSubject());
        this.getOutput().newLine();
        this.getOutput().newLine();
        this.getOutput().write(this.getMessage().getContent());
        this.getOutput().newLine();

        // 句点加回车结束邮件内容输入
        result = sendToServer(".");
        if (result != 250)
            throw new IOException("发送数据错误");
    }

    public void quit() throws IOException {
        int result = sendToServer("QUIT");
        if (result != 221)
            throw new IOException("未能正确退出");

        this.getInput().close();
        this.getOutput().close();
    }

    public boolean sendMail() {
        boolean success = true;
        try {
            // 注册到发送邮件服务器
            regist();
            // 登陆到服务器
            login();
            // 设置邮件源地址
            setMailFrom();
            // 设置邮件目的地址
            setMailTo();
            // 设置邮件体
            setData();
            // 退出邮件
            quit();
        }
        catch (Exception e) {
            e.printStackTrace();
            success = false;
        }
        return success;
    }
}

邮件信息的实体类:

MailMessage.java:

package com.sunflower.yuan.sendmail;

/**
 * @author zhang
 *
 */
public class MailMessage {
    // 发件人
    private String from;
    // 收件人
    private String to;
    // 发件人,在邮件中显示
    private String datafrom;
    // 收件人,在邮件中显示
    private String datato;
    // 主题
    private String subject;
    // 内容
    private String content;
    // 日期
    private String date;
    // 发送邮箱用户名,邮箱名的前缀
    private String user;
    // 发送邮箱密码
    private String password;

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getDatafrom() {
        return datafrom;
    }

    public void setDatafrom(String datafrom) {
        this.datafrom = datafrom;
    }

    public String getDatato() {
        return datato;
    }

    public void setDatato(String datato) {
        this.datato = datato;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

测试类

Test.java:

package com.sunflower.yuan.test;

import java.io.IOException;

import com.sunflower.yuan.sendmail.MailMessage;
import com.sunflower.yuan.sendmail.SendMail;
import com.sunflower.yuan.sendmail.SendMailImp;

/**
 * @author zhang
 *
 */
public class Test {
    public static void main(String[] args) {
        MailMessage message = new MailMessage();
        message.setFrom("caih****@163.com");
        message.setTo("57*****@qq.com");
        message.setSubject("这个是一个邮件发送测试");
        message.setUser("caih****");
        message.setContent("Hello,this is a mail send test\n你好这是一个邮件发送测试");
        message.setDatafrom("caih****@163.com");
        message.setDatato("57****@qq.com");
        message.setPassword("*****");

        SendMail send = SendMailImp.getInstance(SendMailImp.WANGYI163).setMessage(message);
        try {
            send.sendMail();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
时间: 2024-10-06 16:24:17

JAVA实现找回密码的详细功能的相关文章

java web实现 忘记密码(找回密码)功能及代码

(一).总体思路 (二).部分截图 (三).部分代码 (一).总体思路: 1.在 找回密码页面 录入 姓名.邮箱和验证码,录入后点击[提交]按钮,此时发送一封邮件,邮件中带有加密后的链接. 2.点开 邮件中链接,解密并判断链接是否有效,验证通过后 到 修改密码页面. 3.在修改页面中 录入新密码, 点击[修改按钮]修改密码,操作完成. (二).部分截图: (三).部分代码: 代码1(对应上面总体思路1):此处关键是 生成加密链接,而且此链接 参数需要在浏览器中get方式传递,不能支持“+”,"/

Java实现邮箱找回密码

[来源网络:http://www.cnblogs.com/zyw-205520/p/3738439.html] 通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url.

SpringMVC通过邮件找回密码功能的实现

1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 3.加密能防止伪造攻击,一次url只能验证一次,

Java实现邮箱找回密码 --转载

通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱 3.加密能防止

找回密码功能的实现(考虑安全性,加密方面)

最近负责公司的登陆与注册模块,大部分已经实现了,这找回密码功能实现的思路是这样的 1.用户忘记密码,需要找回密码 2.后台通过一系列的加密处理,将通过后台邮件将重置密码的页面发送到该用户的邮箱 3.用户通过邮箱里烦人链接就可以重置密码. 以下是代码 /* ------------------------------------------忘记密码,发送邮件------------------------------------------------- */ //找回密码发送邮件功能 @Requ

PHP会员找回密码功能实现实例介绍

设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3.系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678). 4.系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名.临时密码.提醒用户及时修改临时密码的提示语). 5.用户用临时密码即可登录. HTML 我们在找回密码的页面上放置

WordPress 使用 Pie-Register 添加前台注册、登录、找回密码和编辑个人资料功能

Pie-Register 是一个功能比较完善的 WordPress 才能,使用它可以很方便添加和定制前台用户注册.登录.找回密码和编辑个人资料的功能.此外,还内置了邀请码功能以及用户验证功能. Pie-Register 功能 强大的注册表单生成器 用户验证机制(邮件验证或管理员审核) 具备邀请码功能 自定义电子邮件模板 内置验证码功能 用户导入/导出 通过PayPal支付网关可设置付费注册 一次性会员费用 Pie-Register 预览 在这里就不提供前台页面预览了. Pie-Register

网站开发之用户重设密码 找回密码功能的实现原理

网站开发之用户重设密码 找回密码功能的实现原理,这个东西基本在现在每个系统中都带有的功能,但是实现的方式也是挺多的,这个是跟数据库没多大关系的方法嘞. 用户流程: 1.用户忘记密码,来到密码重设界面 2.用户输入Email地址,点击重设密码按钮 3.用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间 4.用户点击链接,来到密码重设页面,输入新密码,完成 这个流程并没有什么创新,很多网站都是用这套流程 后端实现方式: 1.当用户输入Email地址后,验证这个Email,如果存在于数据

给自己项目添加注册、登陆、改密码、邮箱找回密码等功能,出现大坑!

1.使用django验证框架的登陆.注销功能,必须settings设置如下: LOGIN_REDIRECT_URL = 'shop:product_list' LOGOUT_REDIRECT_URL = 'shop:product_list' LOGIN_URL = 'shop:login' LOGOUT_URL = 'shop:logout' LOGIN_REDIRECT_URL = 'shop:product_list'-----------登录成功后,转到哪个页面的url,在此设置. LO