• ベストアンサー

javamailにて連続送信の際のエラー

はじめまして.こんにちわ. いまjavamailを用いて,メール送信のプログラムを書いています. しかし,同じアドレスに送信の際に3通に1回程度エラーを返してきます.1通のみですと失敗はないのですが,複数のメールを連続で送るとエラーを返します. エラーは以下のものになります. javax.mail.AuthenticationFailedException これは認証エラーのようですが,同じSMTPを使用しているので,うまく送信できていることもあることから,方法として間違えているのではなく,何か他の部分が悪さをしているのかと思っています.例えば,次のメールがclose する前に connect をかけているのかな,と考えたりしています.そのために,transport.close() が終わった段階で1秒間ほど待つようにしてみたりしたのですが,解決できませんでした. 何か原因として考えられることありましたら,教えていただけないでしょうか.お願いいたします. また,次に今回用いている送信するクラスをつけます.呼び出す際にはこのクラスのインスタンスをつくり,送信の際にタイトルとメッセージ,添付ファイルを書き換えながら,送信用のメソッドを連続的に呼び出すことで実装しています. なにぶんjavaはまだ触り初めて日が浅いために,他の部分にて勘違いしている部分などもありましたら,そちらのご指摘もお願いいたします.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

エラーの内容を見る限りでは確かに、認証関連でエラーがでていますね。送信時のエラーに関してはSMTPサーバがAUTH認証を要求してるってことはないでしょうか? 参考URLにJavaMailを利用したAUTH認証を行い送信するサンプルがありますので、一度、実装してみてはいかがでしょうか?それでもエラーがでる様であれば、singletonモデルでテストしてみるのもいいかもしれません。

参考URL:
http://www.geocities.co.jp/Playtown/7799/progmemo/javamail_send.htm
panero
質問者

補足

ありがとうございます.ですが,ちょっと私の使いかたが悪いのかもしれませんが Session session = Session.getInstance( props, new myAuth() ); の部分で型が違うとエラーが出てしまいます.ただ,デバッグモードでみてみると,connectは成功しているようですが,以下のように出力されます. DEBUG: setDebug: JavaMail version 1.3.3 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "smtp.***.***.jp", port 25, isSSL false 220 ***.***.***.**.jp ESMTP DEBUG SMTP: connected to host "smtp.***.***.jp", port: 25 EHLO KATANA2 250-***.***.***.***.jp 250-AUTH LOGIN PLAIN 250-PIPELINING 250 8BITMIME DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" DEBUG SMTP: Found extension "PIPELINING", arg "" DEBUG SMTP: Found extension "8BITMIME", arg "" DEBUG SMTP: Attempt to authenticate AUTH LOGIN 334 %%%%%%%%%%% ********* 334 %%%%%%%%%%% ********* 535 authorization failed (#5.7.0) javax.mail.AuthenticationFailedException また参考までに,現在自分の使っているプログラムを載せます.どうぞよろしくお願いいたします. ■呼び出し側■ import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class MailSendFile { private String smtp; private String sendfrom; private String sendto; private String name; private String title; private String filename; private String message; private boolean RET; MailSendFile(){} MailSendFile(String _smtp, String _sendfrom, String _sendto, String _name, String _title, String _filename, String _message){ smtp = _smtp; sendfrom = _sendfrom; sendto = _sendto; name = _name; title = _title; filename = _filename; message = _message; } public boolean sendFile(String user, String pass) throws MailSendFileException{ try { Properties props = new Properties(); props.put("mail.smtp.host",smtp); props.put("mail.smtp.auth","true"); Session session=Session.getDefaultInstance(props,null); MimeMessage mimeMessage=new MimeMessage(session); // 送信元メールアドレスと送信者名を指定 mimeMessage.setFrom(new InternetAddress(sendfrom,name,"iso-2022-jp")); mimeMessage.setRecipients(Message.RecipientType.TO,sendto); mimeMessage.setSubject(title,"iso-2022-jp"); /** 1つ目のボディパートを作成 **/ MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText(message, "iso-2022-jp"); mimeMessage.setHeader("Content-Type","text/html"); /** 2つ目のボディパートを作成 **/ MimeBodyPart mbp2 = new MimeBodyPart(); FileDataSource fds = new FileDataSource(filename); mbp2.setDataHandler(new DataHandler(fds)); mbp2.setFileName(MimeUtility.encodeWord(fds.getName())); // 複数のボディを格納するマルチパートオブジェクトを生成 Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); // マルチパートオブジェクトをメッセージに設定 mimeMessage.setContent(mp); // 送信日付を指定 mimeMessage.setSentDate(new Date()); // 送信 Transport transport = session.getTransport("smtp"); transport.connect(null, user, pass); //ユーザとパスワードを指定する transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); transport.close(); RET = true; } catch (Exception e) { System.out.println(e); RET = false; MailSendFileException msfe = new MailSendFileException(); throw msfe; } return RET; } public void setsmtp(String _smtp){ smtp = _smtp; } public void setsendfrom(String _sendfrom){ sendfrom = _sendfrom; } public void setsendto(String _sendto){ sendto = _sendto; } public void setname(String _name){ name = _name; } public void settitle(String _title){ title = _title; } public void setfilename(String _filename){ filename = _filename; } public void setmessage(String _message){ message = _message; } }

その他の回答 (1)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

SMTPで何か認証機能を利用していませんか? 認証機能を利用していないのならば、Ethereal等のパケットキャプチャを利用して、SMTPの流れを確認してみてはいかがでしょうか? 正常な時と失敗した時を比べると何かわかるかもしれません。

panero
質問者

補足

SMTPで認証を行っています.それとパケットキャプチャなどは使ったことも無く,ちょっと厳しいかと思っています.申し訳ありません. ありがとうございます.

関連するQ&A