在Java中向任何消息服务器(Gmail、Yahoo等)发送邮件而无需密码验证

在Java中向任何消息服务器(Gmail、Yahoo等)发送邮件而无需密码验证,java,email,servlets,Java,Email,Servlets,我们正在用JSF开发一个简单的web应用程序,其中需要包含一个“忘记密码”模块。为了演示和简单起见,我在Javaservlet中尝试了以下代码。它可以向Gmail发送邮件,工作正常,根本没有问题。下面是完整的Servlet代码 public class MailClient extends HttpServlet { private class SMTPAuthenticator extends Authenticator { private PasswordAuth

我们正在用JSF开发一个简单的web应用程序,其中需要包含一个“忘记密码”模块。为了演示和简单起见,我在Javaservlet中尝试了以下代码。它可以向Gmail发送邮件,工作正常,根本没有问题。下面是完整的Servlet代码

public class MailClient extends HttpServlet {

    private class SMTPAuthenticator extends Authenticator {

        private PasswordAuthentication authentication;

        public SMTPAuthenticator(String login, String password) {
            authentication = new PasswordAuthentication(login, password);
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return authentication;
        }
    }

    protected void processRequest(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String from = "bhaveshp1980@gmail.com";
            String to = "bhaveshp1980@gmail.com";
            String subject = "A mail from Java.";
            String message = "My first mail from Java.";
            String login = "bhaveshp1980@gmail.com";
            String password = "password";

            Properties props = new Properties();
            props.setProperty("mail.host", "smtp.gmail.com");
            props.setProperty("mail.smtp.port", "587");
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.starttls.enable", "true");

            Authenticator auth = new SMTPAuthenticator(login, password);
            Session session = Session.getInstance(props, auth);
            MimeMessage msg = new MimeMessage(session);

            try {
                msg.setText(message);
                msg.setSubject(subject);
                msg.setFrom(new InternetAddress(from));
                msg.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(to));
                Transport.send(msg);
            } catch (MessagingException ex) {
                Logger.getLogger(MailClient.class.getName()).
                        log(Level.SEVERE, null, ex);
            }
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

现在,第一个问题是,一旦用户输入了有效的电子邮件地址,就应该向特定的消息服务器(Gmail、Yahoo等)提交验证码,而无需询问用户密码(与上述代码不同),这对于实现“忘记密码”至关重要web应用程序中的模块

第二个问题是,上面的代码只能向Gmail发送邮件。如果我想发送邮件到其他信息服务器,比如雅虎,声明

props.setProperty("mail.host", "smtp.gmail.com");
需要改成

props.setProperty("mail.host", "smtp.mail.yahoo.com"); 

[关于其他端口,端口号也是一样]意味着需要正确识别必须向其发送消息的特定消息服务器。哪种方法最好?。解决这些问题的最佳方法是什么。

您是否在每次向其他邮件提供商发送邮件时更改电子邮件客户端中的SMTP设置?不可以。向gmail.com地址发送邮件时,您不会将SMTP服务器设置为gmail。然后在向yahoo.com地址发送邮件时将其设置为yahoo。您将其设置为您的
电子邮件提供程序SMTP服务器,此SMTP服务器将邮件发送到适当的位置

只需选择一个同意从应用程序发送邮件的SMTP服务器。任何SMTP提供商都可以每天发送一打邮件。但是,如果你每天发送数千封邮件,那么你可能会与提供商发生问题。只要问问你的主机服务提供商,它是如何处理发送邮件的(费用是多少,每天接受多少,是否有带宽限制,等等)

  • 您需要生成一个随机令牌,并将其作为 消息将令牌存储在数据库中,并与 用户的配置文件。当用户返回到您的站点时 令牌(通过将其输入表单,或通过单击具有该令牌的链接 令牌作为获取参数)您可以确保用户是真实的并且 提供重置密码对话框
  • 不要将邮件发送到收件人的smtp服务器,而是发送到 您的smtp服务器来自电子邮件地址。那么把它发送到gmail 好的。我会使stmp主机的url,用户名和密码 可配置,例如在属性文件中

  • 所以你不能这么做。这就是防止人们发垃圾邮件、伪装成他们不是的用户以及其他许多令人讨厌的事情的关键所在

    您需要设置SMTP服务器或将域托管在可以通过其发送邮件的邮件服务上。也许您的ISP或主机提供商已经提供了这项服务,您只需注册即可。否则,有很多地方可以让你从你的域名发送邮件。我使用:

    或者你可以让谷歌免费托管你的域名,但他们限制了你每天可以发送的邮件数量,我上次检查的时候是100条。所以,如果你的网站计划发送更多的邮件,你需要升级到像authsmtp这样的付费服务

    基本上,您需要找到一个邮件服务器,负责您的MX记录,这样发送到您的域的电子邮件将被路由到这些服务器,这样您的应用程序就可以从您的域发送电子邮件,而不会因为您做了淘气的事情而被列入垃圾邮件发送者黑名单

    虽然您可以设置自己的smtp服务器,但使用服务要容易得多,这使您在处理客户服务之类的事情时具有专业的外观,当您的邮件来自与您的网站关联的域而不是其他域时,您可以对他人作出响应johnnyappleseed@gmail.com


    您还需要从技术角度对电子邮件的工作原理进行一些基础研究。这将有助于您理解为什么我所说的内容很重要。

    身份验证部分是您无法绕过的。这是在远程服务器中配置的,因此除非您使用自己的邮件服务器,否则您必须执行gmail要求您执行的操作。但是,您可以将登录名/密码存储在(加密的?)属性文件中,而不是硬编码登录名/密码,并在需要使用其他邮件服务器时对其进行修改。

    为什么需要根据电子邮件地址切换发送邮件服务器?通常,您使用内部smtp服务器发送邮件。您的假设是错误的。您可以通过单个SMTP服务器向任何人发送电子邮件。您用来发送电子邮件的帐户与您发送电子邮件的对象无关。在您的情况下,您可能会有一个来自托管提供商的电子邮件服务器,您可以从该服务器发送邮件(可能还可以进行身份验证),但您应该能够发送给任何收件人;您不需要使用目标域的邮件服务器。