javamailでメールを送信しようとすると
エラーが表示されます。
コードとエラー内容http://oshiete.goo.ne.jp/qa/6678667.html
いったい何が原因なのかさっぱりわかりません
パソコンのセキュリティソフトはすべて削除しましたし
ファイアーウォールも無効にしています。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

No3の回答が何故「調査中」なのか不明なのですが(単にjavaのプログラムなのに・・・)、


http://detail.chiebukuro.yahoo.co.jp/qa/question …
に似たようなプログラムがありますので、見てみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
解答の手順どうりに行ったところメール送信を行うことができました。
jakarta-comons-emailでもメール送信を行うことができました。
ちょっと感動しています。
msnのメール送信ではoutlookからも送信できなかったのでそれがおそらく原因
なのかなと思っています。
ありがとうございました。

お礼日時:2011/04/28 17:20

import java.util.*;


import javax.mail.*;
import javax.mail.internet.*;

public class MailTransfer{
public static void main(String[] args) {
try {
// SMTPサーバー設定
Properties props = System.getProperties();
props.setProperty( "mail.smtp.port", "587");
props.setProperty("mail.smtp.socketFactory.port", "587");
props.put( "mail.smtp.host", "smtp.mail.yahoo.co.jp" );
props.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication( "ユーザー名", "パスワード" );
}
});
MimeMessage mimeMessage=new MimeMessage( session );

// 送信元メールアドレスと送信者名を指定
mimeMessage.setFrom( new InternetAddress( "ユーザー名@yahoo.co.jp", "ユーザー名", "ISO-2022-JP" ) );
// 送信先メールアドレスを指定
mimeMessage.setRecipients( Message.RecipientType.TO, "送信先@yahoo.co.jp" );
// メールのタイトルを指定
mimeMessage.setSubject( "メールテスト", "ISO-2022-JP" );
// メールの内容を指定
mimeMessage.setText( "こんにちは\n", "ISO-2022-JP" );
// メールの形式を指定
mimeMessage.setHeader( "Content-Type", "text/html" );
// 送信日付を指定
mimeMessage.setSentDate( new Date() );
// 送信します
Transport.send( mimeMessage );
} catch (Exception e) {
e.printStackTrace();
}
}
}

PasswordAuthenticationのところで指定する、ユーザー名は取得したアカウントでyahooの場合「@yahoo.co.jp」は不要ですので気をつけてください。
ex. xxxxx@yahoo.co.jpというメールアドレスなら、"xxxxx","パスワード"

// 送信元メールアドレスと送信者名を指定
の部分ですが、送信元の "メールアドレス","送信した人の名前" を指定します。
ex. 送る人が山田なら、 "yamada@yahoo.co.jp","山田"

あと、別に無くても良い部分がありますが、カスタマイズしてください。
ちなみに、初回送ると届くのに数分かかる場合があります。
    • good
    • 0

hotmailはちょっと工夫が必要かもしれません。

若しくはサーバーの指定が違うのかもしれません。一応、yahoo、so-net、nifty、OCN、.biglobe等では上手く送受信の実績ありますが。。。
他の回答者様からの回答を待ってください。私はココまでで。

PS.
yahooのメールサーバーではダメなのでしょうか?
OKなら解説できるのですが・・・
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
yahooのメールアドレスを作成しましたのでyahooのメールサーバでの
接続方法を教えていただけませんでしょうか。
よろしくお願いいたします。

お礼日時:2011/04/27 10:05

hotamilのサーバーが、どのような設定になってるか分かりません。

参考までという事で。

1.PopBeforeSMTPな場合。
>>Session session=Session.getDefaultInstance(objPrp,null);
の下の行に、
Store store = session.getStore("pop3");
store.connect(pop3Host, "ユーザー名", "パスワード" );
を追加。


2.hotamilのSMTPサーバーがサブミッション・ポートを使用している場合。
>>Properties objPrp=new Properties();
の下の行に、
objPrp.setProperty( "mail.smtp.port", "587");
を追加。

>>Session session=Session.getDefaultInstance(objPrp,null);
を、
Session session = Session.getInstance(objPrp, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication( "ユーザー名", "パスワード" );
}
});
に変更。

尚、ユーザー名とパスワードは取得したアカウントのものを用います。


ちなみにJakarta Commons-Emailを使うと少々、楽にできますけどね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。解答どうりにコードを修正した結果以下のエラーがでました。
1.のコードの場合
javax.mail.MessagingException: Connect failed;
nested exception is:
java.net.ConnectException: Connection refused: connect


javax.mail.MessagingException: Could not connect to SMTP host: smtp.email.msn.com, port: 25;
nested exception is:
java.net.ConnectException: Connection timed out: connect
というエラーが直ぐに帰ってきた。

2.のコードの場合
javax.mail.MessagingException: Could not connect to SMTP host: smtp.email.msn.com, port: 587;
というエラー



お忙しいところ申し訳ありませんが再度解決策を考えていただけませんでしょうか。

お礼日時:2011/04/26 16:11

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjavaを使ってメールがしたい

JAVAを使えば、Outlookを使わなくても、メールを送付できると書いてあったのですが

nested exception is:
class javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;

というエラーが出て送付できません。
JavaMailの環境は何とか用意できたのですが送ることができません。
いったいどうすればよいのでしょうか?

なお、コードは、下記のコピーです。
http://www.hellohiro.com/src/HelloWorldJavaMail.java

宜しくお願い致します。

Aベストアンサー

変数名を間違えていました。

transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());

としてください。

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

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

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

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

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

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

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

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

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

これは認証エラーのようですが,同じSMTPを使用しているので,うまく送信できていることもあることから,方法として間違えているのではなく,何か他の部分が悪さをしているのか...続きを読む

Aベストアンサー

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

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

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QJavaMail,本文中の改行について

現在JavaMailを使用してメールの送信プログラムを作成中です。
メール本文の編集で改行コードを挿入しているのですが、送られたメールは改行されていない状態になっております。
どなたか対処方法をご教示願います。

---------参考コード
StringBuffer contents = new StringBuffer();
contents.append("依頼番号: ").append(reqNo).append(System.getProperty("line.separator"));
String message = contents.toString();
<中略>
mimeMessage.setText(message,"iso-2022-jp");

当方、大変焦っております。なにとぞよろしくお願いします。

Aベストアンサー

参考になるか分かりませんが、
別のクラスを用意して
public static String lineSp(String strA) {
String strB = strA.replaceAll(System.getProperty("line.separator"),"<br />");
return strB;
}

という定番メソッドをつかってます。私の場合。

Qjavamailで複数人にメールを送信する。

現在javamailを使って複数人の人にメールを送るjspページを作っています。
一人の人にメールを送信することはできたのですが、
複数の宛先に送信する方法がわかりません。
本で調べたところ

void setRecipients(
Message.RecipientType type,
Address[] addresses)
というメソッドで配列で複数のアドレスを指定できる。

とのことなのですが、具体的な方法がわかりません。
どのようにすればよいのでしょうか?
具体的な例などがあったら助かります。
よろしくお願いします。

Aベストアンサー

Addressの配列で複数指定してあげれば、問題ないですね。

new InternetAddress(MAIL_ADDRESS,INTERNET_NAME,ENCODING);
MAIL_ADDRESS:メールアドレス
INTERNET_NAME:メールの名前部分
ENCODING:エンコーディング iso-2022-jpになるのかな?と思います。
これを送信する分Address配列を作って、
setRecipientsにセットします。

私の場合には、ArrayList に入れて、配列に変換しています。
list.add((Address)new InternetAddress・・・・・);
で詰めて、
(Address[])list.toArray(new Address[list.size()]);
で配列に変換

こんな感じでいけるかと思います。

QJavaMailでエラーメールの通知

ヤマトです。こんにちは。

JavaMailに関し、質問があります。
JavaMailを作成したのですが、送信時に、
間違った[送信メールアドレス]を設定し送信した場合、
件名:Returned mail: see transcript for details
で送信者へ返信されます。
以上の現象は、普通のメーラーでも起きている現象と同じです。
しかし、以上のエラーメール通知を送信者以外には設定できないのでしょうか?

// 送信者の設定(送信者アドレス・送信者名)
mimeMessage.setFrom(new InternetAddress(FromMailAddress, FromMailName,"iso-2022-jp"));

現状は FromMailAddress のメールアドレスにエラーの通知が来てしまいます。

知ってる方がいらっしゃったら、教えて頂きたいのですが。
宜しくお願いします。

Aベストアンサー

>今なぜそのアドレスに返らないか

Error-to:ヘッダはRFC(メールを定義している文)に記述されていないため、
対応していない MTA(メールサーバ)が多いのです。

つまりMTAによってError-toにreturned mailが送られるかもしれないし
送られないかもしれないと。
メールっていうのはコネクションレス通信
(相手が受け取ったかどうか確認しない通信)
の為、確実にっていうのは不可能です。

QNoClassDefFoundError: javax/mail/Address が発生

いつもお世話になっております。

メール配信のjavaプログラム実行時、以下のエラーが出ており、原因が分からず苦戦している状況です。
もし同じエラーで格闘し解決された経験のある方がいらっしゃいましたら、ご教授いただけると
幸いです。

以下の内容のバッチプログラムとし、Windowsのタスクスケジューラで実行しています。
C:\abc>cd C:\Program Files\Sample
C:\Program Files\Sample>java program.test1
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Address
at program.test1.main(test1.java:131)

エラー箇所のtest1.javaの131行目は以下の一行です。
test1 mail = new test1();

以前はエラーが出なかったのですが、バージョンアップ等でコンパイルし直した後に発生
するようになりました。色々調べてみましたが、答えの核心に繋がるものが見つかりませんでした。
NoClassDefFoundError の javax/mail/Address はどのようなときに発生するものなのでしょうか。

いつもお世話になっております。

メール配信のjavaプログラム実行時、以下のエラーが出ており、原因が分からず苦戦している状況です。
もし同じエラーで格闘し解決された経験のある方がいらっしゃいましたら、ご教授いただけると
幸いです。

以下の内容のバッチプログラムとし、Windowsのタスクスケジューラで実行しています。
C:\abc>cd C:\Program Files\Sample
C:\Program Files\Sample>java program.test1
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Address
...続きを読む

Aベストアンサー

エラーは、実行しているJavaVMからjavax.mail.Addressクラスが「見つからない」ので、
それが「見つかる」ようにすればいいわけです。
そのために「クラスパスを通す」必要があるわけですが、やり方として、
・実行時にパスを通す
・環境変数に指定する
という2つの方法があります。

JavaMailの場合、mail.jarとactivation.jarにクラスパスを通す必要があります。
例えば、これらのファイルがC:\javaフォルダに入っている場合
javac -classpath .;C:\java\mail.jar;C:\java\activation.jar program.test1
とすると、test1のプログラムを実行する時に2つのjarファイルにクラスパスが通り、
クラスが見つかるようになります。

ただ、いちいちこれをタイプして実行するのは面倒なので、一般には環境変数に追加します。
WindowsXPの場合、システムのプロパティの環境変数から、
CLASSPATHを選び(なければ新規作成またはPATHを選んでもいい)
値に、mail.jarとactivation.jarを(フルパスで)追加すればJavaVMからは常に、
このパスが「見つかる」ようになります。

参考URL:http://www.hellohiro.com/appli.htm

エラーは、実行しているJavaVMからjavax.mail.Addressクラスが「見つからない」ので、
それが「見つかる」ようにすればいいわけです。
そのために「クラスパスを通す」必要があるわけですが、やり方として、
・実行時にパスを通す
・環境変数に指定する
という2つの方法があります。

JavaMailの場合、mail.jarとactivation.jarにクラスパスを通す必要があります。
例えば、これらのファイルがC:\javaフォルダに入っている場合
javac -classpath .;C:\java\mail.jar;C:\java\activation.jar program.test...続きを読む

QJavaMailの受信処理で質問

ヤマトです。

JavaMailを使用してメールの送受信ができるようにしました。
メールの送信も受信も基本的には問題なく動作します。
しかし、一点問題がありまして、メール受信時なのですが、受信したメールをメールサーバから取得した後、
そのメールをメールサーバに残したままにしてしまいます。
(なのでもう一度実行すると同じメールを受信してしまいます)
受信した後メールサーバから削除したいのですが、調べたのですが、分かりません。
どなたか、以上の件に関し、ご教授願えますでしょうか?

以下に、作成したメール受信のソースを載せます。
javamail-1_2.zip とjaf1_0_1.zip をダウンロードして使用しています。JDK1.3です。
宜しくお願い致します。

== メール受信ソース(一部抜粋)

// メールサーバーへ接続
Session session = Session.getDefaultInstance(System.getProperties(), null);
Store store = session.getStore("pop3");
store.connect(PopServerAddress, -1, MailUser, MailPassword);

// メールサーバのフォルダーを開く
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);

// フォルダーのメール件数を取得
int totalMessages = folder.getMessageCount();
if (totalMessages == 0) {
System.out.println("メールは0件です");
folder.close(false);
store.close();
return;
}

// フォルダーのメールを取得
Message[] messages = folder.getMessages();

// フォルダーを閉じます
folder.close(false);
store.close();

ヤマトです。

JavaMailを使用してメールの送受信ができるようにしました。
メールの送信も受信も基本的には問題なく動作します。
しかし、一点問題がありまして、メール受信時なのですが、受信したメールをメールサーバから取得した後、
そのメールをメールサーバに残したままにしてしまいます。
(なのでもう一度実行すると同じメールを受信してしまいます)
受信した後メールサーバから削除したいのですが、調べたのですが、分かりません。
どなたか、以上の件に関し、ご教授願えますでしょうか?

以...続きを読む

Aベストアンサー

kero-piです。

たしか、こんな感じでできたと思います。。。

Message[] messages = folder.getMessages();
for(int i=0;i<messages.length;i++){

// メールに削除フラグをたてる
messages[i].setFlag(Flags.Flag.DELETED, true);
}
folder.close(false);
store.close();

Qjavamail ポート指定

javamailを使ってメール送信を行いたいと思っています。
送信先のSMTPですが、ポート番号が25番ではありません。
どのように指定すればよいのでしょうか?
URLNameを使うのかとも思ったのですが、マニュアルを見ても使い方が良く分からず・・・
どなたかご教授願います。

参考にしたサイト
http://www.hellohiro.com/javamail.htm

Aベストアンサー

Storeクラスのconnectメソッドで引数-1が指定されていると思いますが、
これがポート番号のようです。
ここを修正してください。
ちなみに、-1を指定した場合はデフォルトのポート番号を指定するそうです。

参考URL:http://sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/javax/mail/Service.html

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報