【问题标题】:How to verify an email address really exists by sending a mail in java如何通过在java中发送邮件来验证电子邮件地址是否真的存在
【发布时间】:2012-04-08 14:09:25
【问题描述】:

我们的网络应用程序向输入其电子邮件 ID 的每个用户发送电子邮件。但是我如何确保用户输入的电子邮件 ID 是有效的。实际上,当任何用户输入电子邮件 ID 时,我们会发送指向其电子邮件 ID 的链接以激活帐户。我有一个发送电子邮件的代码。但即使邮件 ID 不存在,它也不会给我任何错误。你能告诉我如何解决这个问题吗?如果 email id 确实不存在,它应该给出一些错误。

我在这里附上我的代码

    package csv;
    import javax.mail.PasswordAuthentication;
    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.activation.FileDataSource;
    import javax.mail.BodyPart;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;

    public class email {

public void send(String recipeintEmail, 
        String subject, 
        String messageText,String[] attachments) 
        throws MessagingException, AddressException {
    /*
       It is a good practice to put this in a java.util.Properties 
       file and encrypt password. Scroll down 
       to comments below to see 
       how to use java.util.Properties in JSF context. 
    */
    String senderEmail = "our email address";
    String senderMailPassword = "password";
    String gmail = "smtp.gmail.com";

    Properties props = System.getProperties();

    props.put("mail.smtp.user", senderEmail);
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "465");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.debug", "true");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class", 
          "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");

    // Required to avoid security exception.
    email.MyAuthenticator authentication = 
          new email.MyAuthenticator(senderEmail,senderMailPassword);
    Session session = 
          Session.getDefaultInstance(props,authentication);
    session.setDebug(true);

    MimeMessage message = new MimeMessage(session);

    BodyPart messageBodyPart = new MimeBodyPart();      
    messageBodyPart.setText(messageText);

    // Add message text
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Attachments should reside in your server.
    // Example "c:\file.txt" or "/home/user/photo.jpg"

    for (int i=0; i < attachments.length; i++) {        

        messageBodyPart = new MimeBodyPart();       
        DataSource source = new FileDataSource(attachments[i]);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(attachments [i]);          
        multipart.addBodyPart(messageBodyPart) ;  
    }



    message.setContent(multipart);                
    message.setSubject(subject);
    message.setFrom(new InternetAddress(senderEmail));
    message.addRecipient(Message.RecipientType.TO,
        new InternetAddress(recipeintEmail));

    Transport transport = session.getTransport("smtps");
    transport.connect(gmail,465, senderEmail, senderMailPassword);
    transport.sendMessage(message, message.getAllRecipients());

    transport.close();

}

private class MyAuthenticator extends javax.mail.Authenticator {
    String User;
    String Password;
    public MyAuthenticator (String user, String password) {
        User = user;
        Password = password;
    }

    @Override
    public PasswordAuthentication getPasswordAuthentication() {
        return new javax.mail.PasswordAuthentication(User, Password);
    }
}


public static void main(String args[]) throws MessagingException
{
    // email e=new email();
   // String at[]={"c:/COPYRIGHT.txt"};
  //  e.send("xyz@gmail.com", "hello","test"  )");
}

}

【问题讨论】:

    标签: java email email-verification


    【解决方案1】:

    没有万无一失的方法可以做到这一点。您可以尝试this blog post 中说明的步骤,但不能保证适用于所有类型的邮件服务器/中继设置。

    向用户发送激活密钥以及 URL,如果用户想要登录/使用您提供的内容,则必须提供有效的电子邮件 ID。

    【讨论】:

    • 没有办法处理像 xyz@xyz.com 这样的假邮件 ID。上面的代码告诉我邮件已成功发送到 xyz@xyz.com,即使它无效。
    • 您唯一能做的快速验证是检查电子邮件格式——这意味着文本是否符合电子邮件 ID 的语法。否则,您将不得不依赖博文中提到的机制,这可能在某些情况下有效。
    【解决方案2】:

    您可以使用 java 邮件 API 来验证电子邮件。

        try {
                //
                // Create InternetAddress object and validated the supplied
                // address which is this case is an email address.
                InternetAddress internetAddress = new InternetAddress(email);
                internetAddress.validate();
                isValid = true;
            } 
            catch (AddressException e) {
                System.out.println("You are in catch block -- Exception Occurred for: " + email);
            }
    

    你可以从http://www.oracle.com/technetwork/java/index-138643.html下载java Mail API

    【讨论】:

      【解决方案3】:

      如果您要坚持发送电子邮件进行验证,我建议您非常明确您将在允许用户访问他们注册的任何内容之前发送电子邮件验证链接减少虚假电子邮件地址的数量。我们已经完成了测试,注册表单标签上的一些小改动显着降低了我们的无效电子邮件率。

      一句警告。如果您使用发送电子邮件来验证电子邮件是否有效,并且您正在向无效地址发送大量电子邮件,尤其是在面向消费者的域(例如 Yahoo、GMail、AOL 等)上,您可能会被标记为垃圾邮件发送者,因为硬退回(发送到无效地址)会影响您的声誉得分。几个月前,我写了一封blog entry on the different ways to validate emails,以免费和商业方式验证您的注册人可能有用。

      【讨论】:

        【解决方案4】:

        解决此问题的一种方法是跟踪退回的邮件。但由于标准不统一,这种方法存在一些困难。

        然而,做某事可能是值得的。有时,重要的是要知道用户是否收到了电子邮件并且没有回复或电子邮件地址本身不正确。

        您可能想查看此链接: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

        查看以下链接摘录:

        Q:当消息无法投递时,返回失败消息。如何检测这些“退回”的消息?

        答:虽然有报告此类错误的 Internet 标准(multipart/report MIME 类型,请参阅 RFC1892),但尚未广泛实施。 RFC1211 深入讨论了这个问题,包括大量示例。

        在 Internet 电子邮件中,特定邮箱或用户名的存在只能由传递邮件的最终服务器确定。消息在到达最终服务器之前可能会通过多个中继服务器(无法检测到错误)。

        通常,当终端服务器检测到此类错误时,它会向原始消息的发送者返回一条指示失败原因的消息。有许多 Internet 标准涵盖了此类传递状态通知,但大量服务器不支持这些新标准,而是使用 ad hoc 技术来返回此类失败消息。

        这使得很难将“退回的”消息与导致问题的原始消息关联起来。 (请注意,这个问题完全独立于 JavaMail。)JavaMail 现在包括对解析传递状态通知的支持;有关详细信息,请参阅 JavaMail 包中的 NOTES.txt 文件。

        有许多技术和启发式方法可以解决这个问题 - 没有一个是完美的。一种技术是可变包络返回路径,描述于http://cr.yp.to/proto/verp.txt

        【讨论】:

          猜你喜欢
          • 2012-10-30
          • 2011-02-14
          • 2011-03-04
          • 2011-01-22
          • 1970-01-01
          • 2021-07-03
          • 2011-08-30
          • 1970-01-01
          相关资源
          最近更新 更多