2012-03-24 2 views
5

웹 응용 프로그램은 전자 메일 ID를 입력 한 모든 사용자에게 전자 메일을 보냅니다. 그러나 사용자가 입력 한 전자 메일 아이디가 유효한 아이디인지 확인하려면 어떻게해야합니까? 실제로 어떤 사용자가 전자 메일 아이디를 입력 할 때 우리는 전자 메일 아이디에 대한 링크를 보내어 아이디를 활성화합니다. 전자 메일을 보내는 코드가 있습니다. 그러나 메일 ID가 없어도 오류를주지 않습니다. 문제 해결 방법을 알려주시겠습니까? 이메일 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("[email protected]", "hello","test" )"); 
} 

} 

답변

3

regex을 사용하면 구문 적으로 유효한지 확인하고 도메인이 유효 할 경우 MX records을 조회 할 수 있지만 여전히 해당 이메일 주소가 합법적이며 해당 등록자에게 속한다는 보장을하지 못합니다 . 사실 확인 이메일을 보내고 짧은 시간 내에 확인을 기다리는 것보다 더 신뢰할 수있는 방법이 없습니다.

+0

확인. 나는 너의 대답을 얻었다. 우리의 응용 프로그램에서는 사용자 모빌에 알림을 보냅니다. 그런 다음 모바일 분할 번호와 이메일 주소를 모두 확인하기 위해 비밀 분할을 할 수 있습니까? 임의의 문자열을 생성하고, 2 부분으로 나눠서 모바일에 전송하고 다른 부분은 이메일 ID로 전송합니다. 그런 다음 사용자를 활성화하는 과정에서이를 결합하여 입력해야합니다. 모바일 ID와 전자 메일 ID를 동시에 확인하는 것이 좋은 방법일까요? – kanchan

+0

예. 당신은 또한 고유 ID를 생성하고 사용자의 모바일 번호에 대해 데이터베이스 테이블에 저장할 수 있습니다. 사용자에게도 보내십시오. 사용자가 자신의 고유 ID를 입력하면 데이터베이스 ID와 일치시킵니다. – kandarp

4

을이 작업을 수행하는 바보 - 증거 방법이 없다 부착하고있다. this blog post에 설명 된 단계를 시도해 볼 수는 있지만 모든 종류의 메일 서버/릴레이 설정 작업이 보장되지는 않습니다.

활성화 키를 URL과 함께 보내면 사용자가 로그인/사용하려는 경우 유효한 이메일 ID를 제공해야합니다.

+0

[email protected]과 같은 가짜 메일 ID를 처리 할 방법이 없습니까? 위의 코드는 그 메일이 [email protected]에 성공적으로 보내 졌음을 보여줍니다. – kanchan

+0

당신이 할 수있는 빠른 유효성 검사는 전자 메일 형식을 확인하는 것입니다. 즉, 텍스트가 전자 메일 ID의 문법에 해당하는지 확인하는 것입니다. 그렇지 않으면 특정 경우에 작동 할 수있는 블로그 게시물에 언급 된 메커니즘에 의존해야합니다. –

2

유효성을 검사하기 위해 이메일을 보내려한다면, 매우으로 만들어 주시면됩니다. 번호를 줄이기 위해 등록하는 모든 항목에 사용자가 액세스 할 수있게하려면 이메일 확인 링크를 보내주십시오. 가짜 이메일 주소. 테스트를 마쳤으며 등록 양식 라벨에 약간의 변경을 가하면 유효하지 않은 이메일 비율이 크게 떨어졌습니다.

한 단어의 경고입니다. 전자 메일이 유효한지, 유효하지 않은 주소, 특히 소비자 중심 도메인 (예 : Yahoo, GMail, AOL 등)에 많은 양의 전자 메일을 보내고 있는지 확인하기 위해 전자 메일을 보내는 경우, 스팸 발송자로 신고 될 위험이 있습니다. 하드 반송 (잘못된 주소로 전송)은 평판 점수에 영향을 미칩니다. 몇 달 전에 등록자를 유용하고 유용하게 사용할 수 있는지 확인하기 위해 무료 및 상업적 방법으로 blog entry on the different ways to validate emails을 작성했습니다.

0

자바 메일 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; 
    } 

캐치 (AddressException 전자) { 에서 System.out.println ("당신은 catch 블록에 - 발생한 예외 :"+ 이메일); 이 문제를 해결 http://www.oracle.com/technetwork/java/index-138643.html

0

한 가지 방법에서 }

당신은 다운로드 할 수 있습니다 자바 메일 API는 반송 메시지를 추적 할 수 있습니다. 그러나이 방법은 표준이 고르지 않아 여러 가지 어려움이 있습니다.

아직 아무 것도하지 않는 것이 가치가 있습니다. 때때로 사용자가 전자 메일을 받았지만 응답하지 않거나 전자 메일 주소 자체가 잘못되었는지를 아는 것이 중요합니다.

당신은이 링크를 확인 할 수 있습니다

: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

링크에서이 발췌를 참조하십시오

Q : 메시지를 배달 할 수 없을 때 오류 메시지가 반환됩니다. 어떻게 이러한 "반송 된"메시지를 감지 할 수 있습니까?

A : 이러한 오류를보고하기위한 인터넷 표준 (multipart/report MIME 형식, RFC1892 참조)이 있지만 아직 널리 구현되지 않았습니다. RFC1211은이 문제에 대해 많은 예제를 포함하여 심도있게 논의합니다.

인터넷 전자 메일에서 특정 사서함 또는 사용자 이름의 존재 여부는 메시지를 배달하는 최종 서버에 의해서만 결정될 수 있습니다. 메시지는 최종 서버에 도달하기 전에 여러 릴레이 서버 (오류를 감지 할 수 없음)를 통과 할 수 있습니다.

일반적으로 최종 서버에서 이러한 오류를 감지하면 오류의 원인을 나타내는 메시지를 원본 메시지의 보낸 사람에게 반환합니다. 이러한 배달 상태 알림을 다루는 많은 인터넷 표준이 있지만 많은 수의 서버가 이러한 새로운 표준을 지원하지 않고 대신 이러한 오류 메시지를 반환하는 임시 방편 기술을 사용합니다.

이렇게하면 "반송 된"메시지와 문제를 일으킨 원래 메시지를 서로 연관시키는 것이 매우 어렵습니다. (이 문제는 JavaMail과 완전히 독립적입니다.) 이제 JavaMail은 전달 상태 알림을 구문 분석 할 수있는 지원을 포함합니다. 자세한 내용은 JavaMail 패키지의 NOTES.txt 파일을 참조하십시오.

이 문제를 처리하는 데있어 여러 가지 기술과 경험적 방법이 있지만 완벽한 것은 아닙니다. 한 기술은 가변 봉투 반환 경로 (Variable Envelope Return Paths)이며 http://cr.yp.to/proto/verp.txt에 설명되어 있습니다.

관련 문제