Java - 如何从phpMyAdmin获取电子邮件地址并使用javamail发送

时间:2017-10-25 18:32:52

标签: java mysql email phpmyadmin javamail

我在NetBeans IDE 8.2上设计了 ForgotMyPassword.java jFrame表单 其中我使用phpMyAdmin从中获取注册用户的电子邮件地址,并使用JavaMail通过MYSQL数据库将其发送到他们的电子邮件地址

我基本上想从中获取注册用户的电子邮件地址,并使用JavaMail作为一次性密码(OTP)恢复选项通过MYSQL数据库将其发送到他们的电子邮件地址

这是源代码:

    String username = usrnmfield.getText();
    String email = emailID.getText();
    String[] to = {"emailaddr@gmail.com"};

    Connection conn=null;
    PreparedStatement pstn = null;

    try {

        Class.forName("com.mysql.jdbc.Driver");

        Connection db = DriverManager.getConnection("jdbc:mysql://localhost:3307/app" , "xxxx" , "xxxx");
        pstn=db.prepareStatement("select * from register where USERNAME=? and EMAIL=?");

        pstn.setString(1,username);
        pstn.setString(2,email);

        ResultSet i=pstn.executeQuery();

        if(i.next())

        {


    if(JavaMail.send
    ("abc@gmail.com", 
    "xxxx",
    to,
    "Hello world",
    "Thank you for reading my post"))

    {

        JOptionPane.showMessageDialog(null , " Please Check out your Inbox for any Password sent by us to you ");

        }

        }

        else if (usrnmfield != i && emailID != i)

        {

           JOptionPane.showMessageDialog(null, "Wrong Username or E-Mail ID");

        }     

    } catch(HeadlessException | ClassNotFoundException | SQLException e) {
        JOptionPane.showMessageDialog(null, e);

    }


}                                        

1 个答案:

答案 0 :(得分:0)

可能会有所帮助的一些评论和调整:

  1. 关于您的应用程序设计,您应该强烈考虑其他架构。我们不建议让客户端(桌面)应用程序直接使用SQL数据库来处理安全问题。在客户端实现整个安全性显然是一个坏主意(并且很容易被绕过),并且它将无法管理。考虑在远程安全服务器上使用集中式安全数据库,该服务器提供最先进的身份验证和授权机制(例如,通过HTTPS上的REST-API)。服务器端安全框架包括Keycloak,SpringSecurity,Apache Shiro,JaaS ......通过搜索Web,您将看到您的设计并不常见。此外,对于OTP,使用Web服务器或简单地进行远程交换似乎是显而易见的(并且您将需要它们)。您还可以考虑通过集中式LDAP服务器实现日志记录。

  2. 在select语句中为您的字段命名。例如。 "select password from register where ..."以便您在使用select *时知道您的预期或使用字段名称:

    ResultSet rs = ... String myValue = rs.getString(1); String myValueBis = rs.getString("password");

  3. 始终使用try-finally块包围数据库查询,以便关闭ResultSet,准备好的语句以及最终的连接(如果没有重复使用),最好按此顺序关闭。

  4. 我没有看到这个条件的目的:

    else if (usrnmfield != i && emailID != i) { ...

    您正在将文本字段与ResultSet进行比较,但文本中包含的值和ResultSet的当前行的值(参见1)都没有。这毫无意义。

  5. 如果您希望允许用户根据其用户名或电子邮件检索其密码,则应考虑在SQL语句中使用“OR”(而不是“and”)。

  6. 使用JavaMail时,您必须确保Session包含足够的信息来发送电子邮件。这通常是任何JavaMail应用程序中创建javax.mail.Session对象的第一步。因此,您需要配置smtp服务器或中继,最终配置端口和身份验证。由于您没有显示JavaMail类的代码,我建议您将其放在原始问题中,如果您有任何问题并澄清问题是什么(如果有的话)。

  7. 一般来说,如果您考虑将此应用程序用于商业用途或某些严重用途,您还应该快速考虑以加密方式存储密码(例如,作为SHA-256)。并且还考虑不通过电子邮件发送密码(如果您只存储用户密码的哈希值,它会很自然地出现......)而是建议他们以一种安全的方式重置/更新它。

  8. 我认为您应该使用更多代码更新您的问题(更多最终确定和更清洁)并更准确地解决您的问题。主持人将你的问题标记为“一般”或模糊不清,我不会感到惊讶。