Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

エラー

Exception in thread "main" javax.mail.SendFailedException:Invalid Addresses;nested exception is:
Exception in thread "main"         com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay
for xxxxx@xxx.xxxx.xxxx

javamailでテンプレートを読み込みたいのですが上記のエラーがでてしまいます。どうしたらいいのでしょうか?

47

回答

6481

閲覧

47件の回答

評価

0

まずは自分で調べる。それが基本。

評価

0

あとガイドラインも読まないとダメ

評価

0

POP before SMTPが必要だと分かったのですが、
素人な者で何かヒントをいただけたらなと思いまして。

評価

0

そこまでわかってんなら、片付いてるも同然じゃないのさ。

評価

0

そうですね。できてしましました。
送信するときに文字化けしてしますのですが
文字コードがダメなんでしょうか?

評価

0

>ダメなんでしょうか?

聞く前にやってみれば?
ここで聞いたって「やってみなされ」以外の回答なんてつかないでしょ。

その上でうまくいかないなら、
何をどうやってうまくいかなかったのか、
第三者にも、きちんと理解できるように書いて投稿すればいい。

評価

0

聞く前にやってみれば?
-> 聞く前に、できそうなことがあるなら、やってみれば?

だな。

評価

0

UTF-8、ISO-2022-JP、S-JISを試しましたが上手くいきません。送信する時点で文字化けしているということは読み込む時に化けているのでしょうか?

評価

0

コードも掲載してないのに、どうやって原因を知れと言うんだ?
ここの人間がエスパーだと思ってる?

評価

0

すみません。ソースです↓

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailSender {
    private static final String encoding = "ISO-2022-JP";

    public static void main(String[] args) throws Exception {
        Properties props = System.getProperties();
        // SMTPサーバーのアドレスを指定
        props.put("mail.smtp.host","xxx.xxx.xxxx.xxx");
        Session session=Session.getDefaultInstance(props,null);
        MimeMessage mimeMessage=new MimeMessage(session);
        // テンプレートと差込データの読み込み
        String template = readFile(args[0]);
        HashMap vars = readVars(args[1]);
        // テンプレートを使用したメールの整形
        TemplateFormatter formatter = new TemplateFormatter();
        String mail = formatter.format(template, vars);
        // メールの送信
        sendMail(mail);
    }
    
    public static String readFile(String filename) throws IOException {
        Reader in = new InputStreamReader(new FileInputStream(filename), "UTF-8");
        StringWriter out = new StringWriter();
        for (int c = in.read(); c >=0; c = in.read()) out.write(c);
        in.close();
        out.close();
        return out.toString();
    }
    
    public static HashMap readVars(String filename) throws IOException {
        HashMap<String,String> result = new HashMap<String,String>();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(filename), "UTF-8"));
        for (String s = in.readLine(); s != null; s = in.readLine()) {
            if (s.trim().startsWith("#")) continue;
            int off = s.indexOf(":");
            if (off <= 0) continue;
            result.put(s.substring(0,off).trim(), s.substring(off+1).trim());
        }
        in.close();
        return result;
    }
    
    public static void sendMail(String mail) throws MessagingException, IOException {
        Properties props = System.getProperties();
        Session session = Session.getDefaultInstance(props);
        MimeMessage message = new MimeMessage(session);
        StringTokenizer st = new StringTokenizer(mail, "\n");
        while (st.hasMoreTokens()) {
            String s = st.nextToken();
            int off = s.indexOf(":");
            if (off < 0) break;
            String header = s.substring(0,off).trim();
            String value = s.substring(off+1);
            if (header.equalsIgnoreCase("subject")) {
                message.setSubject(value, encoding);
            } else if (header.equalsIgnoreCase("to")) {
                message.setRecipients(MimeMessage.RecipientType.TO, value);
            } else if (header.equalsIgnoreCase("from")) {
                message.setFrom(new InternetAddress(value));
            } else {
                message.setHeader(header, value);
            }
        }
        StringBuffer body = new StringBuffer();
        while (st.hasMoreTokens()) {
            body.append(st.nextToken()).append("\n");
        }
        message.setText(body.toString(), encoding);
        Transport.send(message);        // 実際に送信する場合
        message.writeTo(System.out);    // 課題にあわせて標準出力に
    }
}

class TemplateFormatter {
    private String prefix = "[[";
    private String postfix = "]]";
    public TemplateFormatter() {}
    public TemplateFormatter(String prefix, String postfix) {
        this.prefix = prefix;
        this.postfix = postfix;
    }
    public String format(String tempate, HashMap<String,String> vars) {
        StringBuffer result = new StringBuffer(tempate);
        for (String key : vars.keySet()) {
            String element = prefix + key + postfix;
            while (result.indexOf(element) >= 0) {
                int off = result.indexOf(element);
                result.replace(off, off+element.length(), vars.get(key));
            }
        }
        return result.toString();
    }
}

評価

0

>送信する時点で文字化けしているということは読み込む時に化けているのでしょうか?

聞く前に、できそうなことがあるなら、やってみれば?

評価

0

テンプレートってなによ、
と思ったら、独自クラスなのか・・・。

評価

0

エンコーディングをこまめに指定しているようだが、
エンコーディングを指定したら、それにあわせて、
処理してくれるわけではないぞ。

エンコーディングに応じた変換(エンコード)を、
文字列に施すのは、人間の役割だ。

評価

0

もうちょっとヒントをください。

評価

0

ちっとも人の投稿を読んでねえな。
「見る」と「読む」は違うぞ。ついでに、読めばお終いとは、一言も言ってねえぞ。

>Reader in = new InputStreamReader(new FileInputStream(filename), "UTF-8");

ここでUTF-8を指定するのがなにを意味するのか、理解してるのか?
読み込もうとしているファイルのエンコーディングは、本当にUTF-8なのかよ。

評価

0

すいません。ファイルの形式を変えても上手くいきません。
日本語が化けてしまいます。
ヒントを

評価

0

どこで化けてるのかは確認したのか?
デバッグってのは、場所が特定できないならひとつひとつ細かく調べるもんだ。
それができなければ、いつまで経っても初心者のままだ。

評価

0

まずは、2008-11-06 10:04で指摘した箇所で、
文字化けせずに読み込めてるのかどうか確認しな。

それと。
初心者なら、InputStreamからOutputStreamに、
直接データを流し込むようなことはするな。
んなやり方してるから、文字化けしてるかどうか確認できんのだ。

文字列用Streamから、直接バイナリを読み出してる箇所もあるし・・・。
んなことするなら、最初からバイナリ用Streamを使えよ。

まずは、InputStreamから、期待通りのStringを取得できるようにしろ。

送信したメールが化けてる云々は、遙か^65536に先の話だ。

評価

0

これ以上ないくらいの良質なヒントをもらってるのに…
「ヒントをください」「ヒントを」って壊れたレコーダーかよw

まず言われた事について確認しろよ

評価

0

「バイナリ用Stream」は的外れか。
相変わらず脇が甘い。orz

評価

0

すみません。ゴミのような質問なんですがeclipseでデバッグするときに実行方法をjava MailSender xxx.txt xxx.txtで
デバッグとする方法はないのでしょうか?

評価

0

右クリックなりしてDebug Configurationsを見ると幸せになれる。

評価

0

すみません。不良社員さん
頑張ってみたんですけど、どうしてもできません。
指摘された所で文字化けしているのは分かったのですが
そこをどうしていいか分かりません。
教えてください。

評価

0

>そこをどうしていいか分かりません。

不良社員さんの

>ここでUTF-8を指定するのがなにを意味するのか、理解してるのか?
>読み込もうとしているファイルのエンコーディングは、本当にUTF-8なのかよ。

これって意味分かったの?

評価

0

出番か、と思ったが、取られちゃったので退場。ノシ

評価

0

テキストファイルのエンコードがutf-8になっていればいいのではないのですか?

評価

0

>指摘された所で文字化けしているのは分かった
っていうのは、
-----
>2008-11-06 10:04
不良社員様が指摘されている
>>Reader in = new InputStreamReader(new FileInputStream(filename), "UTF-8");
-----
ここ↑?

【提案】
イロイロ考えずに、
読み込みたいテキストファイルを、
一行ずつ読み込んで画面に表示してみたらどうかな。
今作ってるプログラムとは別のところで。


----
>ファイルの形式を変えても上手くいきません
----
っとおっしゃっていますが、
形式・・・・?
テキストファイルのエンコードは確認できたのでしょうか。テキストファイルのエンコードを変える方法は、知ってますか?
#知らなかったら調べましょうね

----
>テキストファイルのエンコードがutf-8になっていればいいのではないのですか?
----
って、テキストファイルのエンコードをutf-8にして、
試したけど、できなかったっていう意味ですか?

評価

0

>Reader in = new InputStreamReader(new FileInputStream(filename), "UTF-8");

この行がなにをしているのか、
正しく動作するために必要な条件は何か、
日本語で説明してみたまえ。

>テキストファイルのエンコードがutf-8になっていれば

ちゃんと期待通りに動くはずだよ。
本当に、ファイルのエンコーディングがUTF-8だったら、ね。

評価

0

>Reader in = new InputStreamReader(new FileInputStream(filename), "UTF-8");

Reader型の変数inにfilenameを読み込んで文字コードをutf-8に指定するということではないのですか?
正しく動作するための条件は分からないです‥

ファイルのエンコードって右クリックのプロパティから変更するのでは間違っていますか?

評価

0

>filenameを読み込んで文字コードをutf-8に指定する
filenameで示されたファイルからの読み込みストリームを形成する。
このとき、ファイルのエンコードをutf-8と見なして自動的にunicodeへの変換を実施する。

>右クリックのプロパティ
いったいどこの右クリックだ…。

評価

0

>ファイルのエンコードって右クリックのプロパティ

違うソフトウェアで作った文書を、拡張子だけ変更して、
文書が開けないって騒いでるのと同じだな。

プロパティの意味を理解していないようだな。
プロパティの設定を変更しても、
ファイルの実体そのものが変換されるわけではないぞ。

評価

0

>テキストファイルです。
そうじゃなくて。
アプリケーションはなんだってこと。

>↑こんな感じになってしまいます。
これは何。そのテキストファイルを直接開いたもの?
内容がメールそのままみたいだけど、どこがutf-8?

評価

0

アプリケーションはeclipseです。

>message.writeTo(System.out);    

送信をしないで送信ログを残したものです。

評価

0

Eclipseでも使ってるんじゃないの。
エンコーディングを勝手に変更したら、
システム・エディタでも化けちまうから、すぐわかりそうなものだが。

10:33のは、出力結果か。
ファイルを読み込んでる段階で化けてるんだから意味ない。

評価

0

Eclipseのファイルプロパティにある文字コードは、そのファイルを何の文字コードで読み込むかってこと。
InputStreamReaderに渡してるものと同じで、元ファイルに変更はない。

>送信をしないで送信ログを残したものです。
うん、だからそれはUTF-8じゃないでしょと。

評価

0

System.out.println(System.getProperty("file.encoding"));を使って確認してみたらms932となっていました。テキストファイルそのもののエンコードを変えろということですか?

評価

0

テキストファイルそのものに、エンコードはありません。

用は、何で書いて、何で読むか、です。
因みに、ecipseのテキストファイルエンコーディングで、
UTF-8にしても、eclipseの表示で文字化けしないのであれば、テキストファイルに問題はありません。

>message.writeTo(System.out); 
で引数に渡してるoutの文字コードを変更するのをオススメしますよ。

評価

0

>テキストファイルそのもののエンコードを変えろということですか?

んなこと誰がいってるのよ。
逆だよ。
テキストファイルのエンコーディングにあわせろ、っつってんの。
少なくとも、UTF-8じゃない。

評価

0

「テキストファイルそのもののエンコーディング」
と書かなきゃならんか。

評価

0

連投ばっかしだな・・・。
このままじゃ、コロ氏の投稿と矛盾しちまうし。

テキストファイルそのものは、
プロパティとしてエンコーディングを持っているわけではない。
が、テキストファイルを正しく読み込むために、
適切なエンコーディングを指定しなければならない。

評価

0

いわゆる「文字化け」にはいくつか種類があって。

・他の文字コードで読んでいるだけ
・他の文字コードで読んで書いた結果、認識できない文字が違う文字になった
・文字コード以外のエンコードがかかっている(MIME、実体参照等)

評価

0

テキストファイルのエンコードms932でReader in = new InputStreamReader(new FileInputStream(filename),"ms932");ってことですか?

評価

0

まずはやってみれば?

ちなみに、'S-JIS'なんてエンコーディング名は存在しない。

評価

0

>Windows-31J
なんじゃそりゃ…。

>ISO-2022-JP
せっかくまともなエンコーディングだったのに。

評価

0

今まで、変更の結果を確認するのに、
その方法でやってたのか?

それは、構築されたMimeMessageから
取得したものだということはわかってるんだろうな。
おまいさんがやってる通り、
MimeMessageにテキストを設定するときも、
エンコーディングを指定する必要がある。
つまり、ここでそのやり方が間違ってたら、
変更の結果が確認できないということだ。

俺は、ファイルから、正しくStringが取得できるかどうか、
まずはそれをできるようになれ、と書いたはずだ。

つまらんシロモノを噛ますんじゃねえ。
出力するなら、すっぴんのStringにしろ。

一度に考えることは、ひとつだけにしたまえ。

評価

0

2008-11-14 17:15の時点で
>どこで化けてるのかは確認したのか?
と書いてるんだが、いまだに最初と最後だけ見て「だめだ」って言ってるのか。

>String template = readFile(args[0]);
確認すべきはここでしょ。

評価

0

>String template = readFile(args[0]);
>確認すべきはここでしょ。

すみません。デバッグしたところ値はしっかり取れてました。
ということは出力する時にバグってるということですね!

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。