2012-03-24 14 views
5

Nasza aplikacja internetowa wysyła wiadomość e-mail do każdego użytkownika, który wprowadza swój identyfikator e-mail. Ale w jaki sposób mogę się upewnić, że identyfikator adresu e-mail podany przez użytkownika jest prawidłowy. Co dokładnie robimy, gdy dowolny użytkownik wpisuje identyfikator e-mail, wysyłamy link do jego identyfikatora e-mail, aby aktywować konto. Mam kod do wysyłania e-maili. Ale nie daje mi żadnych błędów, nawet jeśli identyfikator poczty nie istnieje. Czy możesz mi powiedzieć, jak rozwiązać problem? Jeśli identyfikator e-mail nie istnieje, powinien podać błąd.Jak sprawdzić, czy adres e-mail rzeczywiście istnieje, wysyłając wiadomość w języku java

jestem tutaj dołączenie mojego kodu

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("[email protected]", "hello","test" )"); 
} 

} 

Odpowiedz

3

Możesz na najwyższym poziomie używać regex, aby sprawdzić, czy adres jest poprawny pod względem składni i/lub sprawdzać poprawność MX records, jeśli domena jest ważna, ale to nadal nie gwarantuje, że adres e-mail jest zgodny z prawem i należy do rejestrującego. . Tak naprawdę nie ma bardziej niezawodnego sposobu niż wysyłanie e-maili na temat weryfikacji i czekanie na potwierdzenie w krótkim czasie.

+0

ok. Dostałem twoją odpowiedź. w naszej aplikacji wysyłamy również powiadomienia do telefonów komórkowych użytkowników. Następnie mogę przejść do podziału segmentów w celu sprawdzenia poprawności zarówno numeru telefonu komórkowego, jak i adresu e-mail. Wygeneruję losowy ciąg znaków, podzielę go na dwie części, jedna zostanie wysłana na telefon komórkowy nie, a druga zostanie wysłana na adres e-mail id. Następnie podczas aktywacji użytkownik musi wprowadzić oba, łącząc je. Czy będzie to dobry sposób na sprawdzenie poprawności identyfikatora mobilnego i e-mailowego? – kanchan

+0

tak. możesz również wygenerować unikatowy identyfikator i zapisać go w tabeli bazy danych pod numerem telefonu komórkowego użytkownika. i wysłać również do użytkownika. Gdy użytkownik wprowadzi swój unikalny identyfikator, dopasuje go do identyfikatora zapisanego w bazie danych. – kandarp

4

Nie ma idiotoodporny sposób aby to zrobić. Możesz wypróbować kroki opisane w this blog post, ale nie można zagwarantować, że będą działać ze wszystkimi rodzajami konfiguracji serwera poczty/przekaźnika.

Wyślij użytkownikowi klucz aktywacyjny wraz z adresem URL, który będzie wymagał podania poprawnego identyfikatora e-mail, jeśli użytkownik chce się zalogować/używać dostarczanego przez siebie.

+0

Czy nie ma sposobu na obsługę fałszywych identyfikatorów pocztowych, takich jak [email protected] Powyższy kod zapewnia, że ​​poczta jest przesyłana z powodzeniem na adres [email protected], mimo że jest niepoprawna. – kanchan

+0

Jedyną szybką weryfikacją, którą możesz wykonać, jest sprawdzenie formatu wiadomości e-mail - co oznacza, że ​​tekst jest zawarty w gramatyce e-mail. W przeciwnym razie będziesz musiał polegać na mechanizmie wymienionym w poście na blogu, który może działać w niektórych przypadkach. –

2

Jeśli masz zamiar trzymać się z wysyłaniem wiadomości e-mail, aby potwierdzić, chciałbym zachęcić was, aby bardzo jasne wyślesz łącza sprawdzania poczty e-mail przed pozwalając użytkownikowi na dostęp niezależnie od ich rejestracji na zmniejszenie liczby fałszywych adresów e-mail. Przeprowadziliśmy testy, a niektóre niewielkie zmiany w etykietach formularzy rejestracyjnych znacznie zmniejszyły naszą nieprawidłową stawkę e-mail.

Jedno słowo ostrzeżenia. Jeśli korzystasz z wysyłania wiadomości e-mail w celu sprawdzenia, czy wiadomość e-mail jest ważna i wysyłasz dużą liczbę e-maili na nieprawidłowe adresy, szczególnie w domenach zorientowanych na klienta (np. Yahoo, Gmail, AOL itp.), Możesz zostać oznaczony jako spamer, ponieważ ciężkie odbicia (wysłanie na nieprawidłowy adres) wpłyną na Twój wynik reputacji. Kilka miesięcy temu napisałem numer blog entry on the different ways to validate emails, zarówno w celach bezpłatnych, jak i komercyjnych, aby zweryfikować twoich rejestrujących, które mogą okazać się przydatne.

0

Możesz używać interfejsu API poczty Java do sprawdzania poprawności wiadomości e-mail.

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 ("Jesteś w bloku catch - wyjątek dla:" + e-mail); }

można pobrać Java API mail od http://www.oracle.com/technetwork/java/index-138643.html

0

Jednym ze sposobów rozwiązania tego może być śledzenie odbił wiadomość. Ale to podejście ma kilka trudności z powodu nierównych standardów.

Ale może warto zrobić coś ponad nic. Czasami ważne jest, aby wiedzieć, czy użytkownik otrzymał wiadomość e-mail i nie odpowiada LUB sam adres e-mail jest nieprawidłowy.

Możesz chcieć sprawdzić ten link: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

zobaczyć ten fragment linku:

Q: Kiedy wiadomość nie może być dostarczona, jest zwracana wiadomość o błędzie. Jak mogę wykryć te "odrzucone" wiadomości?

A: Chociaż istnieje standard internetowy do zgłaszania takich błędów (typu MIME wieloczęściowego/raportu, patrz RFC1892), nie jest on jeszcze szeroko implementowany. RFC1211 szczegółowo omawia ten problem, w tym liczne przykłady.

W e-mailach internetowych istnienie określonej skrzynki pocztowej lub nazwy użytkownika może być określone tylko przez serwer, który dostarczy wiadomość. Komunikat może przejść przez kilka serwerów przekazujących (które nie są w stanie wykryć błędu) przed dotarciem do serwera końcowego.

Zazwyczaj, gdy serwer końcowy wykryje taki błąd, zwróci komunikat wskazujący przyczynę niepowodzenia dla nadawcy oryginalnej wiadomości. Istnieje wiele standardów internetowych obejmujących takie powiadomienia o stanie dostarczenia, ale duża liczba serwerów nie obsługuje tych nowych standardów, zamiast tego wykorzystuje techniki ad hoc do zwracania takich komunikatów o błędach.

To bardzo utrudnia korelację "odesłanej" wiadomości z oryginalną wiadomością, która spowodowała problem. (Należy pamiętać, że ten problem jest całkowicie niezależny od JavaMail.) JavaMail zawiera teraz obsługę analizowania powiadomień o statusie dostarczania; zobacz plik NOTES.txt w pakiecie JavaMail w celu uzyskania szczegółowych informacji.

Istnieje wiele technik i heurystyki do radzenia sobie z tym problemem - żaden z nich nie jest doskonały. Jedną z technik jest Ścieżka zwrotna zmiennej koperty, opisana pod adresem http://cr.yp.to/proto/verp.txt.

Powiązane problemy