前提・実現したいこと
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();
を入れましたが、状況は変わりませんでした。
解決方法などわかる方いらっしゃいましたら、よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/06 02:46
2021/01/06 03:24