質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • Java

    16164questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Struts

    198questions

    StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

javaでメールアドレスを登録する場合のメール送信宛先エラーがわかりません

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,030

kentros511

score 62

前提・実現したいこと

SendMailクラスでcatchしたSendFailedException をACTIONに戻して
action Message("送信エラー")を表示させたい

発生している問題・エラーメッセージ

半角ならどんなメアドでも送れてしまう

```SEndMail.java  
public class SendMail {  
    /*フィールド*/  
    private String address;  
    private String pwd;  

    public SendMail(String address, String pwd) {/*コンストラクタ*/  
        this.address = address;  
        this.pwd = pwd;  
    }  
    public int doMail(){  
        /*メール送信*/  


        try{/*start*/  
            //property  
            Properties prop = new Properties();  
            /*接続環境指定*/  

            prop.put("mail.smtp.auth", "true");//認証  
            prop.setProperty("mail.smtp.host", "smtp.kagoya.net");//ホストサーバー設定  
            prop.setProperty("mail.smtp.port", "25");//ポート番号指定587でも可  

            /*コンソール*/  
            //サーバとの会話内容を出力してくれる!  
            prop.setProperty("mail.debug", "true");  

          //パスワードを保持するクラスを作る必要がある?  
            class PasswordAuthenticatior extends Authenticator{  
                  private String username;  
                  private String password;  

                  PasswordAuthenticatior(String username, String password) {  
                    this.username = username;  
                    this.password = password;  
                  }  

                  @Override  
                  public PasswordAuthentication getPasswordAuthentication() {  
                    return new PasswordAuthentication(username, password);  
                }  
            }  

          //パスワード認証つきのセッションを作成  
            Session session = Session.getDefaultInstance(  
                            prop,  
                            new PasswordAuthenticatior("infinitys.chinuki","infinitys")  
            );  


            //送信メッセージ  
            MimeMessage mimeMessage1 = new MimeMessage(session);  


            //ToAddressのセット  
            mimeMessage1.setRecipient(Message.RecipientType.TO, new InternetAddress(this.address));  

            //FRomAdressnoセット  
            mimeMessage1.setFrom(new InternetAddress("chinuki@infinitys.co.jp"));  



            new String("Subject");  
            mimeMessage1.setSubject("パスワード発行","iso-2022-jp");/*件名*/  
            new String ("Text");  
            mimeMessage1.setText("あなたのパスワードは" + pwd  + "です","iso-2022-jp");  

            //保存  
             mimeMessage1.saveChanges();  


            //メールの送信  
            Transport.send(mimeMessage1);  
} catch (SendFailedException e) {  
/*ここの中がわからない  
メッセージ ”送信エラー"を表示  
他はすべて送信*/  
        }catch(MessagingException e){/*すべての例外*/  
              e.printStackTrace();  
             return 0;  
            }  
        return 1;  
    }  


}

```

補足情報(言語/FW/ツール等のバージョンなど)

ecipse javamail1.4.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

あて先に指定されたメールアドレスが正しいかどうかを知らせたい。
ということですね。

結論から言うと不可能です。

メール送信に指定されたメールアドレスが、存在するか、送達可能かということは、「送信してみないとわからない」ものです。SendFailedExceptionがそれを示すかというと、そうではありません。SendFaildExceptionは、メールが送信できなかった場合に発生する例外(kentaros511さんの言う異常)です。メールが送信できなかった場合の具体例は、メールサーバにメールを送達依頼をすることができなかったというものです。メールアドレスが正しくともメールが送信できない状態です。
メールが送信可能な状態であれば、不正なメールアドレスであろうとメール送信は行われるものだということです。メール送信がされる以上、メールクライアントであるJavaプログラムにおいて例外は発生しません。なので、kentaros511さんの考え方での実現は不可能なのです。

メール送信に指定されたメールアドレスが間違っている場合、メールはどうなるかというと、メールそのものはメールサーバに送信依頼が何の問題もなく実施されます。まったく異常は発生しません。例外も発生しません。メールはそのままメールサーバで送信処理が行われていきます。その中で、メールアドレスが存在しない等の問題が検出されます。メールアドレスが間違っていた場合、「メールアドレスが不正なメールはエラーメールとしてエラーメール送達先に送信されます」。Outlookなどのメーラで不正なメールアドレスにメール送信すると受信ボックスにエラーメールが届くことがありますね。あれです。(エラーメール送達先が発信元に指定されていたのでそうなる)
kentaros511さんのやりたいことを実現するには、メールの受信を行いエラーメールを把握することが必要です。

メール送達あたりについては、SMTPについて知識を得ると良いと思います。
SMTPをコマンドで実行できるようになると私の言うことや背景がわかるでしょう。
目的を達成するにはSMTPの知識を得ることが近道と思います。
(JavaMailはSMTPコマンドの発行をJavaで行えるようにしているようなものなので)

なお、メールアドレスが全角の時にしか異常にならない点は、メールアドレスの書式の判定によるものです。
逆に全角はメールアドレスの書式として不正なので異常になるのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 09:31

    くわしくありがとうございます
    javaでどこまでできるのか理解してませんでした

    キャンセル

+2

こんにちは。

どのAPIを参照しているのかがいまいち分かりませんが、
こちらのサイトが参考になるんではないかと思います。
JavaMailの罠 - Qiita

APIドキュメントを確認して、RuntimeException系の例外をthrowする等かかれてないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/22 14:24

    Transport.send(mimeMessage1);
    }catch(MessagingException e){/*すべての例外*/ ってメール送信のクラスには書いているんですけどね

    キャンセル

  • 2015/12/22 14:30 編集

    SendFailedException も発生するようなので、
    別でcatchしてみてはいかがでしょうか?

    キャンセル

  • 2015/12/22 14:32

    それがわからないんですよ
    エラーメッセージにしたいんですけど
    もはや無法でなんでも登録されます

    キャンセル

  • 2015/12/22 14:53 編集

    ごめんなさい、何が分からないのかがちょっと見えないです。

    書き方は↓のようになります。
    SendFailedException は MessagingException の子クラスなので、先にキャッチしてあげてください。
    あとは「e」から情報を取り出してメッセージを作成して、出力するなり、呼び出し元へthrowするなりすればいいのではないかと。

    try{
    Transport.send(mimeMessage1);
    }catch(SendFailedException e){
    // 送信時例外
    }catch(MessagingException e){
    // その他メールに関する例外
    }

    取得方法など、先ほどのサイトに記載されていますよ。
    APIも確認してみてください。

    キャンセル

  • 2015/12/22 15:38

    メールクラスからactionに戻して
    ActionMessageでエラーを表示させたいです

    キャンセル

+1

Action側でdoMailの戻り値から正常/異常を判断すればいいだけでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/22 15:53

    しかし異常になることがメールアドレスが全角の時以外ないんですよ

    キャンセル

  • 2015/12/22 16:00

    使用するメールサーバーによってSendFailedExceptionが発生しない可能性があるらしいですよ。
    http://d.hatena.ne.jp/taka_2/20060207

    MAILER-DAEMONはメールサーバーから返される情報なので、送信不可のアドレスについてはWebとは別にバッチ処理とか考えたほうがいいかもですね。

    キャンセル

  • 2015/12/22 16:05

    そうなんですか
    わざわざありがとうございます

    キャンセル

  • 2015/12/22 16:27

    質問内容にある「実現したいこと」と「発生している問題」の内容がかみ合ってないので聞きたいことを整理したほうがいいかもですね。
    今の質問内容だと何が知りたいのかが正直わからないです。
    (登録する場合と登録しない場合って何?私はエスパーじゃないからわからない…)

    問題となっているのは何か
    ・SendFailedExceptionが発生しないため存在しないアドレスでも送信処理がされてしまう?
    ・MessagingExceptionが発生しているのにメールが送信される?
    ・メール送信処理でエラーとなっているのにAction側で正常として扱われてしまう?

    正常に動作していなくて気持ちに余裕がないのは分かりますが、問題解決には正確な情報が必要となりますので
    知りたいことを整理して質問内容を編集することをおすすめします。

    キャンセル

  • 2015/12/22 16:40

    治しました
    何が問題なのかよく把握できてませんでした

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16164questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Struts

    198questions

    StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。