🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

Q&A

解決済

2回答

3893閲覧

Javaのメール送信で送信元を切り替えると認証エラーになる

Begi

総合スコア56

Java

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

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

1グッド

1クリップ

投稿2020/12/22 06:17

前提・実現したいこと

Javaでメールを送信するシステムを運用しています。
そのシステムに、送信先ユーザの追加と、そのユーザに対して送信する送信元メールアドレス(別ドメイン)を追加することになりました。

送信元メールアドレスを切り替えてメール送信すると、javax.mail.AuthenticationFailedExceptionが発生しました。
これを発生させずに、メール送信先に対して送信元メールアドレスを変更しても認証エラーにならずに
送信されるようにしたいと思っています。

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

javax.mail.AuthenticationFailedException at javax.mail.Service.connect(Service.java:306) at javax.mail.Service.connect(Service.java:156) at javax.mail.Service.connect(Service.java:105) at javax.mail.Transport.send0(Transport.java:168) at javax.mail.Transport.send(Transport.java:98) at utils.MailUtil._sendMail(MailUtil.java:243) …

該当のソースコード

メール送信部分のソースです。
呼び出し側で下記ソースのクラスのコンストラクタでsmtpの情報など渡しています。

public boolean _sendMail(boolean popauth, boolean smtpauth, boolean startTls) throws Exception{ try{ Properties props = System.getProperties(); props.put("mail.smtp.host", this.SMTP_HOST); props.put("mail.smtp.port", this.SMTP_PORT); //gmail対応 if (startTls) { props.put("mail.smtp.starttls.enable", "true"); } Session session = null; if(smtpauth){ props.put("mail.smtp.auth", "true"); session = Session.getDefaultInstance(props, new smtpAuth(SMTP_ACCOUNT, SMTP_PASSWORD)); }else{ session = Session.getDefaultInstance(props, null); } if(popauth){ props.setProperty("mail.pop3.disabletop", "true"); Store store = session.getStore("pop3"); store.connect(POP3_HOST, POP3_ACCOUNT, POP3_PASSWORD); } MimeMessage mimeMessage = new MimeMessage(session); mimeMessage.setFrom(new InternetAddress(FROM_ADDRESS, FROM_NAME, ENCODING)); mimeMessage.setRecipients(Message.RecipientType.TO, TO_ADDRESS); if(CC_ADDRESS!=null && !CC_ADDRESS.equals("")){ mimeMessage.setRecipients(Message.RecipientType.CC, CC_ADDRESS); } if(BCC_ADDRESS!=null && !BCC_ADDRESS.equals("")){ mimeMessage.setRecipients(Message.RecipientType.BCC, BCC_ADDRESS); } mimeMessage.setSubject(TITLE, ENCODING); mimeMessage.setSentDate(Calendar.getInstance().getTime()); MimeMultipart mm = new MimeMultipart(); MimeBodyPart mbText = new MimeBodyPart(); mbText.setText(BODY, ENCODING); mm.addBodyPart(mbText); for(int i=0; i<TEMP_PATH.size(); i++){ String filepath = TEMP_PATH.get(i); MimeBodyPart mbFile = new MimeBodyPart(); FileDataSource fds = new FileDataSource(filepath); DataHandler dh = new DataHandler(fds); mbFile.setDataHandler(dh); filepath = filepath.replace("\", "/"); if(filepath.lastIndexOf('/') == -1){ mbFile.setFileName(filepath); }else{ mbFile.setFileName(filepath.substring(filepath.lastIndexOf('/')+1, filepath.length())); } mm.addBodyPart(mbFile); } for(int i=0; i<TEMP_DATA.size(); i++){ ArrayList<Object> temp = TEMP_DATA.get(i); byte[] data = (byte[])temp.get(0); String name = (String)temp.get(1); MimeBodyPart mbFile = new MimeBodyPart(); if(name.indexOf(".pdf") > 0) mbFile.setDataHandler(new DataHandler(new ByteArrayDataSource(data, "application/pdf"))); else if(name.indexOf(".xls") > 0) mbFile.setDataHandler(new DataHandler(new ByteArrayDataSource(data, "application/vnd.ms-excel"))); else if(name.indexOf(".csv") > 0) mbFile.setDataHandler(new DataHandler(new ByteArrayDataSource(data, "text/csv"))); else if(name.indexOf(".dat") > 0) mbFile.setDataHandler(new DataHandler(new ByteArrayDataSource(data, "text/plain"))); else mbFile.setDataHandler(new DataHandler(new ByteArrayDataSource(data, "text/plain"))); mbFile.setFileName(name); mm.addBodyPart(mbFile); } mimeMessage.setContent(mm); try{ Transport.send(mimeMessage); }catch(SendFailedException sfe){ return false; } return true; }catch(AuthenticationFailedException afe){ return false; //throw afe; }catch(MessagingException me){ return false; //throw me; }catch(Exception e){ return false; //throw e; } }

試したこと

※元から使用していたメール送信元:A
追加したメール送信元:B
と記載します

先日Bを追加するまではAからはメール送信できなかったことはありませんでした。
また、Aはgmailのメールサーバを利用しています。
Bはgmailではないサーバです。
Aで送信後、Bからメールを送ると上述したエラーが発生します。Aを連続で送信する分には問題ありません。
また、エラー発生後、tomcatを再起動するとBから送れるようになります。
逆も然りです。
そのため、メール送信後に認証情報が残ってしまっていると思い、

Properties props = System.getProperties();

の後に

props.crear();

を入れましたが、状況は変わりませんでした。

解決方法などわかる方いらっしゃいましたら、よろしくお願いします。

A-pZ👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

getDefaultInstance()の場合、2度目以降の属性情報は使用されないと明記されているので、getInstance()を使うべきなように思えます。

Properties オブジェクトは、このメソッドが初めて呼び出されたときにのみ、新しい Session オブジェクトが作成されたときに使用されることにも注意してください。以降の呼び出しでは、最初の呼び出しで作成された Session オブジェクトが返され、渡された Properties オブジェクトは無視されます。getInstance メソッドを使用して、メソッドが呼び出されるたびに新しい Session オブジェクトを取得します。

javax.mail.Session#getDefaultInstance()

Sessionの再利用の機能は、ご提示いただいたコードのクラスに、staticでMapを持つなどして、自前で管理することが必要となるでしょうが。

投稿2021/01/05 16:56

編集2021/01/05 16:59
YT0014

総合スコア1748

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

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

Begi

2021/01/06 02:46

コメントありがとうございます。 getInstance() に差し替えて動作確認してみます!結果はまた記載させていただきます。
Begi

2021/01/06 03:24

お陰様で無事解決いたしました! この度はありがとうございました。
guest

0

gmailでは、あらかじめ設定されていないメールアドレスからのメールは送信できないようになってます

投稿2020/12/22 06:21

y_waiwai

総合スコア88040

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

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

Begi

2020/12/22 06:23

コメントありがとうございます。 Aと記述した送信元メールサーバはgmailでして、Bに切り替えたりしない限りAからは問題なく送信出来ています。
y_waiwai

2020/12/22 06:24

ああ、 > Bはgmailではないサーバです。 って書いてありますね。失礼しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問