Java发送邮件验证码,javax.mail实战简易教程

最近维护的游戏项目遇到了一些安全方面的问题,后台的账号密码被海外黑客破解登录,造成了一些损失。
一般的GMT后台登录我们都只是简单的做一层校验,就是账号密码验证,只要账号密码验证通过,基本就能进后台进行操作。当然基于安全处理,所有的基于后台的请求都会带上token,这个token就是后台登录的时候返回给前端的一个校验码。
不知道是由于账密太简单还是什么其他原因,反正证实了确实被人非法在其他IP登录了后台,所以急需提升登录安全性校验
常见的安全校验是通过手机短信,就是通过发送手机验证码来进行双重校验。但是由于这只是一个小范围内部使用的后台,出于成本考虑,我决定选用邮件来发送验证码,以达到同样的双重校验目的。
Ok,言归正传,下面就是简单的一个入门教程,教大家如何使用Java发送邮件验证码,来完成一整套完整的校验流程。
第一步,按照惯例给出maven配置,我采用的是javax.mail库1.4.7版本。这已经是比较新的一个版本,目前最新的是1.5.0-b01,个人建议学习可以用新版本,如果是项目急需的最好选用老的成熟的稳定版本。

      
            javax.mail
            mail
            1.4.7
        

下面我就以126邮箱为例,进行一个流程讲解。首先申请一个126邮箱,这一步完成后就可以开始写代码了。
首先,我们写一个对外的发邮件方法。

    private val props = Properties()
    private val auth = MyAuthenticator()

    init {
        //设置邮件服务器地址,连接超时时限等信息
        props["mail.smtp.host"] = "smtp.126.com"
        props["mail.smtp.auth"] = "true"
        props["mail.smtp.connectiontimeout"] = "10000"
        props["mail.smtp.timeout"] = "25000"
    }

    /**
     * 邮件发送
     *
     * @param receiver
     * @param subject
     * @param content
     */
    fun send(receiver: String, subject: String, content: String) {
        if (receiver == "") {
            return
        }

        //创建缺省的session对象
        val session = Session.getDefaultInstance(props, auth)

        //创建message对象
        val msg = MimeMessage(session)

        //设置发件人和收件人
        try {
            // 设置发件人
            val internetAddress = InternetAddress("[email protected]")
            internetAddress.personal = "SAO2 GAME"
            msg.setFrom(internetAddress)

            // 设置收件人
            val addressTo = InternetAddress(receiver)
            msg.setRecipient(Message.RecipientType.TO, addressTo)

            //设置邮件主题
            msg.subject = subject
            msg.setText(content)

            // 设置传输协议
            val transport = session.getTransport("smtp")
            transport.connect("smtp.126.com", "[email protected]", "password")
            transport.sendMessage(msg, msg.allRecipients)
            transport.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    class MyAuthenticator: Authenticator() {
        override fun getPasswordAuthentication(): PasswordAuthentication {
            return PasswordAuthentication("xxxxxx", "auth_key")
        }
    }

所有的源码都在上面,我简单讲一下几个参数配置。
首先是这部分邮箱服务器的基本信息,包括使用的协议和超时时间等,这些都可以根据自己的实际开发要求设置。


参数配置

其次是,大家可以看到一个MyAuthenticator,这个auth其实是最新的邮箱校验码,它的配置方式如图:

授权验证

这个xxxxxx是你自己的邮箱地址不含@后面部分,后面的auth_key要特别注意,这个不是你的邮箱密码,而是要登陆邮箱后去申请第一个校验码。在邮箱设置里,找到协议设置。
image.png

image.png

然后点击开启,打开对应的服务,根据提示,你会得到一个校验码。校验码只会显示一次,如果忘记了,你也可以在下面重新申请。
新增授权码

Ok,如上就基本完成了邮件发送的所有准备工作。
接下来就是实现发送邮件校验码了,首先新增一个对外接口,叫用户校验user_verify,用户点击获取校验码后就会发送该接口到服务器,服务器就会根据收到的账号找到用户,并根据用户的邮件地址发送一个全局校验码,同时服务器会临时存储这个校验码,比如建一个map,映射到用户身上。
获取验证码

在用户点击登录的时候,就会同时校验密码和验证码的准确性,只要一方出现错误就不允许登录。同时登录成功后就会删除老的验证码,这样用户使用同一个验证码重复登录是无效的。
这样,一个简单的邮件验证码校验机制就完成了,由于邮箱与用户账号深度绑定,除非黑客破解数据库,才有更改邮箱的权限,否则他收不到校验码,一般就很难通过破解账密登陆了。

你可能感兴趣的:(Java发送邮件验证码,javax.mail实战简易教程)