How to verify an email address really exists by sending a mail in java

流过昼夜 提交于 2019-12-06 03:33:43

问题


Our web application sends email to every user who enters their email id. But how can i make sure that email id entered by user is valid one.Actually what we do when any user enters a email id we send link to his email id to activate the acount. I have a code for sending emails. But it doesnot give me any errors even if mail id does not exists. Will you please tell me how to solve the problem ? If email id does not exists really it should give some error.

I am here attaching my code

    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"  )");
}

}

回答1:


There is no fool-proof way to do this. You may try steps explained in this blog post but it is not guaranteed to work with all kinds of mail server/relay set up.

Send the user an activation key along with the URL and that will make it necessary to provide a valid email id if the user wants to log in/use what you are providing.




回答2:


If you are going to stick with sending emails to validate, I would encourage you to make it very clear you will send an email validation link prior to allowing the user to access whatever they are registering for to reduce the number of bogus email addresses. We have done testing and some small changes in the registration form labels dropped our invalid email rate significantly.

One word of warning. If you are using sending emails to verify if an email is valid and you are sending a large quantity of emails to invalid addresses, especially on consumer oriented domains (e.g. Yahoo, GMail, AOL, etc), you risk being flagged as a spammer since hard bounces (sending to an invalid address) will affect your reputation score. I wrote a blog entry on the different ways to validate emails a few months ago for both free and commercial ways to verify your registrants that may be useful.




回答3:


You can use java mail API to validate the email.

    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);
        }

You can download java Mail APIs from http://www.oracle.com/technetwork/java/index-138643.html




回答4:


One way of resolving this could be to track bounced message. But this approach has several difficulties due to uneven standards.

Yet it might be worth doing something over nothing. At times it gets important to know if user has received email and is not responding OR the email address itself is incorrect.

You might want to check this link: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

See this excerpt from link:

Q: When a message can't be delivered, a failure message is returned. How can I detect these "bounced" messages?

A: While there is an Internet standard for reporting such errors (the multipart/report MIME type, see RFC1892), it is not widely implemented yet. RFC1211 discusses this problem in depth, including numerous examples.

In Internet email, the existence of a particular mailbox or user name can only be determined by the ultimate server that would deliver the message. The message may pass through several relay servers (that are not able to detect the error) before reaching the end server.

Typically, when the end server detects such an error, it will return a message indicating the reason for the failure to the sender of the original message. There are many Internet standards covering such Delivery Status Notifications but a large number of servers don't support these new standards, instead using ad hoc techniques for returning such failure messages.

This makes it very difficult to correlate a "bounced" message with the original message that caused the problem. (Note that this problem is completely independent of JavaMail.) JavaMail now includes support for parsing Delivery Status Notifications; see the NOTES.txt file in the JavaMail package for details.

There are a number of techniques and heuristics for dealing with this problem - none of them perfect. One technique is Variable Envelope Return Paths, described at http://cr.yp.to/proto/verp.txt.



来源:https://stackoverflow.com/questions/9848972/how-to-verify-an-email-address-really-exists-by-sending-a-mail-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!