2012-03-24 5 views
5

私たちのWebアプリケーションは、電子メールIDを入力するすべてのユーザーに電子メールを送信します。しかし、私はどのようにユーザーが入力した電子メールIDが有効であることを確認することができます。実際には、ユーザーが電子メールIDを入力したときに何をするのですか?電子メールを送信するコードがあります。しかし、メールIDが存在しない場合でも、エラーは発生しません。問題を解決する方法を教えてください。電子メールIDが実際に存在しない場合は、何らかのエラーが発生するはずです。電子メールアドレスを確認する方法は、実際にJavaでメールを送信することによって存在します

私はここにこれを行うにはフールプルーフな方法はありません

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

ドメインが有効である場合は、アドレスが構文的に有効および/またはMX recordsを探している場合は、最高使用regexで確認することができますが、これはまだメールアドレスが正規のものであると、問題の登録者に属していることを保証するものではありません。真実の電子メールを送信し、短い時間で確認を待つよりも、本当に信頼できる方法はありません。

+0

私はあなたの答えを得た。私たちのアプリケーションでは、ユーザーの携帯電話に通知を送信します。それから、私は携帯電話番号と電子メールアドレスの両方を検証するために秘密の分割を行うことができます。私はランダムな文字列を生成し、2つの部分に分割され、1つはモバイルに送信され、他のものはメールIDに送信されます。その後、ユーザーをアクティブにするには、それらを組み合わせて両方を入力する必要があります。モバイルIDと電子メールIDを同時に検証するのに適していますか? – kanchan

+0

はい。一意のIDを生成し、それをユーザーのモバイル番号に対してデータベース表に保管することもできます。ユーザーにも送信してください。ユーザーが一意のIDを入力すると、IDがデータベースに格納されたIDと一致します。 – kandarp

4

私のコードを添付しています。 this blog postで説明されている手順を試すことができますが、すべての種類のメールサーバー/リレーのセットアップで動作することは保証されていません。

アクティベーションキーをURLと共に送信すると、ユーザーがログインしたい/使用している場合に有効な電子メールIDを入力する必要があります。

+0

[email protected]のような偽のメールIDを処理する方法はありませんか?上記のコードでは、[email protected]にメールが正しく送信されているが、有効ではない。 – kanchan

+0

電子メールの形式をチェックするだけです。つまり、テキストが電子メールIDの文法に該当するかどうかを確認することです。それ以外の場合は、ブログ投稿に記載されているメカニズムに頼らざるを得なくなります。 –

2

メールを送信して検証する場合は、を非常ににすることをお勧めします。番号を減らすために登録しているものにユーザーがアクセスできるようにするには、偽の電子メールアドレスのテストを行いましたが、登録フォームのラベルに若干の変更があった場合、無効なメールレートが大幅に低下しました。

警告の1語。電子メールが有効で、無効なアドレス、特に消費者向けドメイン(Yahoo、Gmail、AOLなど)に大量の電子メールを送信しているかどうかを確認するために電子メールを送信している場合、スパマーとして警告される危険性があります。ハードバウンス(無効なアドレスに送信する)があなたの評判スコアに影響します。私は数ヶ月前にあなたの登録者を確認するための無料の方法と商業的な方法の両方について有用なかもしれないblog entry on the different ways to validate emailsを書きました。

0

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

キャッチ(AddressException電子){System.out.printlnは ( "あなたはcatchブロックである - のために発生した例外:" +メール)。 }

あなたはこれを解決する1つの方法は、バウンスメッセージを追跡することができhttp://www.oracle.com/technetwork/java/index-138643.html

0

からのJavaのメールAPIをダウンロードすることができます。しかし、このアプローチは、不均一な基準のためにいくつかの困難を抱えています。

しかし、何もしていないものを行う価値があるかもしれません。時には、ユーザーが電子メールを受信して​​応答していないか、または電子メールアドレス自体が間違っているかどうかを知ることが重要になります。

あなたは、このリンクをチェックすることをお勧めします: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

がリンクから、この抜粋を参照してください:

Q:メッセージが配信できない場合は、エラーメッセージが返されます。これらの「バウンス」メッセージをどのように検出できますか?

A:このようなエラーを報告するためのインターネット標準(multipart/report MIMEタイプ、RFC1892を参照)がありますが、まだ広く実装されていません。 RFC1211では、この問題について多くの例を含めて詳細に説明しています。

インターネットメールでは、特定のメールボックスまたはユーザー名の存在は、メッセージを配信する究極のサーバーによってのみ決定されます。メッセージは、エンドサーバーに到達する前にいくつかのリレーサーバー(エラーを検出できない)を通過することがあります。

通常、エンドサーバーがこのようなエラーを検出すると、失敗の理由を示すメッセージが元のメッセージの送信者に返されます。このような配信ステータス通知をカバーするインターネット標準は数多くありますが、多数のサーバーがこれらの新しい標準をサポートしておらず、代わりにそのような障害メッセージを返すための特別な技術を使用しています。

これにより、「バウンス」メッセージと問題の原因となった元のメッセージとの関連付けが非常に困難になります。 (この問題はJavaMailから完全に独立していることに注意してください)。JavaMailには、配信ステータス通知の解析がサポートされるようになりました。詳細については、JavaMailパッケージのNOTES.txtファイルを参照してください。

この問題に対処するための手法やヒューリスティックスは数多くありますが、どれも完璧ではありません。 1つの技法は、Variable Envelope Return Pathsであり、http://cr.yp.to/proto/verp.txtで説明されています。

関連する問題