プロが教えるわが家の防犯対策術!

はじめまして.こんにちわ.
いまjavamailを用いて,メール送信のプログラムを書いています.

しかし,同じアドレスに送信の際に3通に1回程度エラーを返してきます.1通のみですと失敗はないのですが,複数のメールを連続で送るとエラーを返します.
エラーは以下のものになります.
javax.mail.AuthenticationFailedException

これは認証エラーのようですが,同じSMTPを使用しているので,うまく送信できていることもあることから,方法として間違えているのではなく,何か他の部分が悪さをしているのかと思っています.例えば,次のメールがclose する前に connect をかけているのかな,と考えたりしています.そのために,transport.close() が終わった段階で1秒間ほど待つようにしてみたりしたのですが,解決できませんでした.

何か原因として考えられることありましたら,教えていただけないでしょうか.お願いいたします.

また,次に今回用いている送信するクラスをつけます.呼び出す際にはこのクラスのインスタンスをつくり,送信の際にタイトルとメッセージ,添付ファイルを書き換えながら,送信用のメソッドを連続的に呼び出すことで実装しています.

なにぶんjavaはまだ触り初めて日が浅いために,他の部分にて勘違いしている部分などもありましたら,そちらのご指摘もお願いいたします.

A 回答 (2件)

エラーの内容を見る限りでは確かに、認証関連でエラーがでていますね。

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

参考URL:http://www.geocities.co.jp/Playtown/7799/progmem …

この回答への補足

ありがとうございます.ですが,ちょっと私の使いかたが悪いのかもしれませんが
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;
}
}

補足日時:2005/09/26 22:59
    • good
    • 0

SMTPで何か認証機能を利用していませんか?



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

この回答への補足

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

補足日時:2005/09/26 23:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!