こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPのsendmailでの文字化けについて

PHPのsendmailでの文字化けについて

PHPのsendmailをしています。
ソースの概略は以下のような感じです。
mb_language("Japanese");
mb_internal_encoding("SHIFT-JIS");
mb_send_mail($to, $subject, $body, $header);

質問1
(1)とか(株)などの特殊文字を送信すると?に変換されます。
それは良いのですが、PHPのsendmailによるメール送信の
定石としては、そのまま送信して?に変換されるのが良いのでしょうか?
それとも、何かの文字に変換して送信する。だとか
送信前にチェックして、警告を出すべきなのでしょうか?
出来れば方法論とソースも教えて頂きたく存じます。

質問2
全角で493文字以上の本文を送信すると、493文字以降が
文字化けしてしまいます。何か文字数制限みたいなものがあるのでしょうか?

投稿日時 - 2010-04-30 16:18:04

QNo.5861989

暇なときに回答ください

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

> 質問1
mb_language("Japanese")で使われる文字コード「ISO-2022-JP」では、(1)や(株)は使えません。
そういう文字をメールにどうしても使いたいのでしたら、mb_language("uni")して
ISO-2022-JPではなくUTF-8でメールを送るようにしてください。
それと、その場合は mb_internal_encodingも"SHIFT-JIS"ではなく"SJIS-WIN"にする必要があります。

> 質問2
インターネットメールの規格では、1行は「998バイトを超えていけない」「78バイト以内が望ましい」ことになってます。
http://srgia.com/docs/rfc5322j.html#p2.1.1

ISO-2022-JPの場合は、全角文字1文字が2バイトで、全角文字と半角文字の間に3バイトのシーケンスが必要になりますので、496文字弱が1行の文字数の上限になります。
(半角全角を織り交ぜると、これより短くなる)

UTF-8を選んだ場合は、全角1文字は3バイトですので、333文字ぐらいが上限に。

できれば、ちゃんと、78バイト(39文字)以内で改行するように整形しましょう。

投稿日時 - 2010-04-30 18:53:00

お礼

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

投稿日時 - 2010-05-01 03:48:54

ANo.2

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

質問1
(1)とか(株)などは特殊文字ではなく、SJIS-WINで定義されている外字です。送信したとしても相手側で読めるとは限りませんので、送信前に警告を出すのがセオリーです。
mb_convert_encoding関数を使って、対象文字列をISO-2022-JPへ変換した際、変換できない文字については警告を出すべきでしょう。

質問2
改行コードはLFで、70文字以内で改行していますか?
ご確認ください。

投稿日時 - 2010-04-30 16:41:54

お礼

ご回答ありがとうございます。

> mb_convert_encoding関数を使って、対象文字列をISO-2022-JPへ変換した際、変換できない文字については警告を出すべきでしょう。
具体的にはどうやって、変換できる、できないを判断するのでしょうか?

> 改行コードはLFで、70文字以内で改行していますか?
改行なしで、500文字くらいで送信しようとした時に文字化けしました。
1行○○文字以内みたいな制約があるのでしょうか?

投稿日時 - 2010-04-30 18:58:16

あなたにオススメの質問