投稿日:2005年10月06日 作成鷹の巣

No.19698 javamailで送信先に「.(ドット)」が@の前にあるアドレスを指定すると、エラーになる。



javamailで送信先に「.(ドット)」が@の前にあるアドレスを指定すると、エラーになる。

No.19698 投稿時間:2005年10月06日(Thu) 18:30 投稿者名:仕事人 URL:

javamailで送信先に「.(ドット)」が@の前にあるアドレスを指定すると、エラーになって、
送信できません。
送信する方法をどなたか教えてください。
よろしくお願いいたします。

ソースは以下のようになっています。
public static void send (
String smtphost,
String from, // 送信元メールアドレス
String fromname, //送信元表示名
String to, // 宛先メールアドレス
String subject,// メール題名
String body) throws BaseException{ // メール本文


try {
// メール送信準備
Properties props = new Properties();
props.put("mail.smtp.host", smtphost);
//props.put("mail.smtp.from", from);
//props.put("mail.host", smtphost);
//props.put("mail.from", from);
//Session session = Session.getDefaultInstance(props, null);
Session session = Session.getInstance(props, null);


// メール作成
MimeMessage mimeMessage = new MimeMessage(session);
//mimeMessage.addFrom(InternetAddress.parse(from));
mimeMessage.setFrom(new InternetAddress(from,fromname,"ISO-2022-JP"));
mimeMessage.setReplyTo(InternetAddress.parse( from, false ));
mimeMessage.setSender(new InternetAddress(from,fromname,"ISO-2022-JP"));
mimeMessage.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(to,false));
mimeMessage.setSubject(subject, "ISO-2022-JP");
mimeMessage.setHeader("Content-Type","text/plain");
mimeMessage.setText(body, "ISO-2022-JP");
mimeMessage.setSentDate(new Date());


// 送信
Transport.send(mimeMessage);

} catch (MessagingException mex) {
//e.printStackTrace();
log.debug("MessagingException(MailSender.send)" + mex);
mex.printStackTrace();
BaseException bex = new BaseException();
bex.setKey("error.sql"); //KEYセット
bex.setErrorMessage(mex.toString()); //エラー内容セット
throw bex;
} catch(java.io.UnsupportedEncodingException uex){
log.debug("AddressException(MailSender.send)" + uex);
uex.printStackTrace();
BaseException bex = new BaseException();
bex.setKey("error.sql"); //KEYセット
bex.setErrorMessage(uex.toString()); //エラー内容セット
throw bex;
}
}


不正なメールアドレス

No.19699 投稿時間:2005年10月07日(Fri) 08:45 投稿者名:通-行-人 URL:

> javamailで送信先に「.(ドット)」が@の前にあるアドレスを指定すると、エラーになって、
> 送信できません。

メールアドレスの形式は RFC 2822 ・ RFC 2823 等の文書で規定がなされていますが、 この中で 「.」 は、 local-part (= 「@」 の左側) に使う文字として特別な扱いを受けています。
「.」 は他の文字と文字の間でのみ使用できるため、 次のようなものは不正となります。

◎ 「.」 で始まる。
◎ 「.」 で終わる。
◎ 「..」 のように連続させる。

システム上の都合でそのような文字列が来てしまう場合は、 両端を 「"」 で囲んだものを local-part とすることになっています。

実際に稼動しているシステムの中には、 この規定に合わないアドレスへ宛てたメールの発信 (中継) を拒否するケースがあります (postfix、 Exchange Server 等)。
しかし、 以上はすべてメールを受け取る側の問題です。
不正な local-part を後から 「"」 で囲んで回避したとしても、 それを受け取り側サーバが同一相手に届けるとは限りません。

解決にはなりませんが、 参考まで。

# 「images\tsuu-kou-nin」 も、 そのままでは使えない文字 「\」 があるため引用符で囲む必要があります。


運用で気をつけるようにいたします。

No.19721 投稿時間:2005年10月12日(Wed) 13:04 投稿者名:仕事人 URL:

通行人様

ありがとうございました。
送信対象のアドレスに
> ◎ 「.」 で始まる。
> ◎ 「.」 で終わる。
> ◎ 「..」 のように連続させる。
が存在しないことを確認し、そのようなメールアドレスを使用しないように、
運用で気をつけるようにいたします。

ちなみに、ご存知でしたら教えてください。

JAVAでは「"」で囲むと、その間の文字を文字列と認識してしまって、
STRINGで定義した変数に「"」を文字列としてセットできないのですが、
文字列として「"」をセットする方法はあるのでしょうか?

素人的な質問で、申し訳ありませんが、
よろしくお願いいたします。

> > javamailで送信先に「.(ドット)」が@の前にあるアドレスを指定すると、エラーになって、
> > 送信できません。
>
> メールアドレスの形式は RFC 2822 ・ RFC 2823 等の文書で規定がなされていますが、 この中で 「.」 は、 local-part (= 「@」 の左側) に使う文字として特別な扱いを受けています。
> 「.」 は他の文字と文字の間でのみ使用できるため、 次のようなものは不正となります。
>
> ◎ 「.」 で始まる。
> ◎ 「.」 で終わる。
> ◎ 「..」 のように連続させる。
>
> システム上の都合でそのような文字列が来てしまう場合は、 両端を 「"」 で囲んだものを local-part とすることになっています。
>
> 実際に稼動しているシステムの中には、 この規定に合わないアドレスへ宛てたメールの発信 (中継) を拒否するケースがあります (postfix、 Exchange Server 等)。
> しかし、 以上はすべてメールを受け取る側の問題です。
> 不正な local-part を後から 「"」 で囲んで回避したとしても、 それを受け取り側サーバが同一相手に届けるとは限りません。
>
> 解決にはなりませんが、 参考まで。
>
> # 「images\tsuu-kou-nin」 も、 そのままでは使えない文字 「\」 があるため引用符で囲む必要があります。


文字リテラル ・ 文字列リテラルで用いるエスケープシーケンス

No.19765 投稿時間:2005年10月20日(Thu) 19:05 投稿者名:通-行-人 URL:

> JAVAでは「"」で囲むと、その間の文字を文字列と認識してしまって、
> STRINGで定義した変数に「"」を文字列としてセットできないのですが、
> 文字列として「"」をセットする方法はあるのでしょうか?

Java 言語仕様: 文字リテラル ・ 文字列リテラルで用いるエスケープシーケンス
http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.6

どんなに体系的でない方法であっても、 Java を学習する限りは必ず通過する項目だと思うのですが。


勉強になりました。

No.19768 投稿時間:2005年10月21日(Fri) 17:09 投稿者名:仕事人 URL:

ありがとうございました。

\nや\rは使っていたのですが、これまで意外と、"って、使おうと思うこともなかったもので・・・。
勉強になりました。


> > JAVAでは「"」で囲むと、その間の文字を文字列と認識してしまって、
> > STRINGで定義した変数に「"」を文字列としてセットできないのですが、
> > 文字列として「"」をセットする方法はあるのでしょうか?
>
> Java 言語仕様: 文字リテラル ・ 文字列リテラルで用いるエスケープシーケンス
> http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.6
>
> どんなに体系的でない方法であっても、 Java を学習する限りは必ず通過する項目だと思うのですが。


目次掲示板過去ログ目次▲頁先頭