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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Struts

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

Q&A

解決済

3回答

12257閲覧

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

kentros511

総合スコア122

Java

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

Struts

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

0グッド

0クリップ

投稿2015/12/22 04:47

編集2015/12/22 07:28

###前提・実現したいこと
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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

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

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

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

投稿2015/12/22 14:23

Hiroshi-Aoki

総合スコア804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentros511

2015/12/24 00:31

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

0

こんにちは。

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

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

投稿2015/12/22 05:13

kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentros511

2015/12/22 05:24

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

2015/12/22 05:31 編集

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

2015/12/22 05:32

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

2015/12/22 05:54 編集

ごめんなさい、何が分からないのかがちょっと見えないです。 書き方は↓のようになります。 SendFailedException は MessagingException の子クラスなので、先にキャッチしてあげてください。 あとは「e」から情報を取り出してメッセージを作成して、出力するなり、呼び出し元へthrowするなりすればいいのではないかと。 try{ Transport.send(mimeMessage1); }catch(SendFailedException e){ // 送信時例外 }catch(MessagingException e){ // その他メールに関する例外 } 取得方法など、先ほどのサイトに記載されていますよ。 APIも確認してみてください。
kentros511

2015/12/22 06:38

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

0

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

投稿2015/12/22 06:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentros511

2015/12/22 06:53

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

退会済みユーザー

2015/12/22 07:00

使用するメールサーバーによってSendFailedExceptionが発生しない可能性があるらしいですよ。 http://d.hatena.ne.jp/taka_2/20060207 MAILER-DAEMONはメールサーバーから返される情報なので、送信不可のアドレスについてはWebとは別にバッチ処理とか考えたほうがいいかもですね。
kentros511

2015/12/22 07:05

そうなんですか わざわざありがとうございます
退会済みユーザー

退会済みユーザー

2015/12/22 07:27

質問内容にある「実現したいこと」と「発生している問題」の内容がかみ合ってないので聞きたいことを整理したほうがいいかもですね。 今の質問内容だと何が知りたいのかが正直わからないです。 (登録する場合と登録しない場合って何?私はエスパーじゃないからわからない…) 問題となっているのは何か ・SendFailedExceptionが発生しないため存在しないアドレスでも送信処理がされてしまう? ・MessagingExceptionが発生しているのにメールが送信される? ・メール送信処理でエラーとなっているのにAction側で正常として扱われてしまう? 正常に動作していなくて気持ちに余裕がないのは分かりますが、問題解決には正確な情報が必要となりますので 知りたいことを整理して質問内容を編集することをおすすめします。
kentros511

2015/12/22 07:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問