Как проверить, что адрес электронной почты действительно существует, отправив письмо в Java - PullRequest
5 голосов
/ 24 марта 2012

Наше веб-приложение отправляет электронное письмо каждому пользователю, который вводит свой электронный идентификатор.Но как я могу убедиться, что идентификатор электронной почты, введенный пользователем, действителен. На самом деле, что мы делаем, когда любой пользователь вводит идентификатор электронной почты, мы отправляем ссылку на его идентификатор электронной почты, чтобы активировать учетную запись.У меня есть код для отправки писем.Но это не дает мне никаких ошибок, даже если почтовый идентификатор не существует.Подскажите, пожалуйста, как решить проблему?Если идентификатор электронной почты на самом деле не существует, он должен выдать ошибку.

Я прилагаю свой код

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

}

Ответы [ 4 ]

4 голосов
/ 24 марта 2012

Нет надежного способа сделать это. Вы можете попробовать шаги, описанные в этом сообщении в блоге , но не гарантируется работа со всеми видами настройки почтового сервера / ретранслятора.

Отправьте пользователю ключ активации вместе с URL-адресом, и для этого потребуется указать действительный идентификатор электронной почты, если пользователь хочет войти в систему / использовать предоставленные вами данные.

2 голосов
/ 27 марта 2012

Если вы собираетесь придерживаться отправки электронных писем для проверки, я рекомендую вам сделать так, чтобы очень ясно, что вы отправите ссылку для проверки электронной почты до того, как пользователь сможет получить доступ ко всему, что он регистрирует для уменьшить количество поддельных адресов электронной почты. Мы провели тестирование, и некоторые небольшие изменения в ярлыках регистрационной формы значительно упали.

Одно слово предупреждения. Если вы используете отправку электронных писем для проверки действительности письма и отправляете большое количество писем на недействительные адреса, особенно на домены, ориентированные на потребителя (например, Yahoo, GMail, AOL и т. Д.), Вы рискуете быть помечены как спамер, поскольку жесткий отскок (отправка на неверный адрес) повлияет на ваш рейтинг репутации. Несколько месяцев назад я написал запись в блоге о различных способах проверки писем для бесплатных и коммерческих способов проверки ваших владельцев регистрации, которые могут оказаться полезными.

1 голос
/ 06 августа 2015

Вы можете использовать API Java-почты для проверки электронной почты.

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

Вы можете загрузить API java Mail с http://www.oracle.com/technetwork/java/index-138643.html

0 голосов
/ 06 августа 2015

Одним из способов решения этой проблемы может быть отслеживание отклоненного сообщения.Но у этого подхода есть несколько трудностей из-за неодинаковых стандартов.

Тем не менее, может быть, стоит что-то сделать из ничего.Иногда важно знать, получил ли пользователь электронное письмо и не отвечает ИЛИ сам адрес электронной почты неверен.

Возможно, вы захотите проверить эту ссылку: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

См. Этот отрывок по ссылке:

Q: Если сообщение не может быть доставлено, сообщение об ошибкевернулся.Как я могу обнаружить эти "отклоненные" сообщения?

A: Хотя существует Интернет-стандарт для сообщения о таких ошибках (MIME-тип multipart / report, см. RFC1892), он пока не получил широкого применения.RFC1211 подробно обсуждает эту проблему, включая многочисленные примеры.

В электронной почте через Интернет существование определенного почтового ящика или имени пользователя может быть определено только конечным сервером, который доставит сообщение.Сообщение может пройти через несколько серверов ретрансляции (которые не могут обнаружить ошибку) до достижения конечного сервера.

Как правило, когда конечный сервер обнаруживает такую ​​ошибку, он возвращает отправителю исходного сообщения сообщение о причине сбоя.Существует множество интернет-стандартов, охватывающих такие уведомления о состоянии доставки, но большое количество серверов не поддерживают эти новые стандарты, вместо этого используются специальные методы для возврата таких сообщений об ошибках.

Это очень затрудняет корреляцию "отскочившего" сообщения с исходным сообщением, вызвавшим проблему.(Обратите внимание, что эта проблема полностью независима от JavaMail.) JavaMail теперь включает поддержку анализа уведомлений о состоянии доставки;подробности смотрите в файле NOTES.txt в пакете JavaMail.

Существует ряд методов и эвристик для решения этой проблемы, но ни один из них не является идеальным.Одним из методов является путь возврата переменной огибающей, описанный в http://cr.yp.to/proto/verp.txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...