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

Posted 客舍青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

以上是关于JAVA实现找回密码的详细功能的主要内容,如果未能解决你的问题,请参考以下文章

冲刺结果(补补补)——登录界面,找回密码和注册界面

PHP会员找回密码功能的简单实现

java实现邮箱找回密码 简单邮件

Java实现发邮件功能---网易邮箱

Django通用类视图实现忘记密码重置密码功能

php+jQuery+Mysql找回密码----ThinkPHP