JPHPMailerを使って作ったメールフォームがあります。

http://www.php-seed.net/blog/archives/48

非常に快適に使えているのですが、一部の環境で「ヘッダが化ける」という現象に悩まされています。

私の環境(Mac Mail.app)では正常に受信できているのですが、その環境(Vista+Office2007)では、サブジェクトの途中で切れてしまい、本文にはメールヘッダの一部が以下のように表示されてしまっています。

=?iso-2022-jp?B?GyRCITwlYBsoQg==?=
Date: Thu, 31 Jan 2008 22:14:44 +0900
From: =?iso-2022-jp?B?
<以下略>

文字コードを UTF8からエンコードしているので、それが原因かと思い、EUCに直してからかけるなど、工夫しているのですがどうにも原因が分かりません。

また、稼働させるサーバーを変えると正常に動作したりもします。
サーバーに原因があるのか、プログラムに原因があるのか、メールソフトに原因があるのかが全く分からないのですが、原因らしきものにお心当たりがある方、または原因を切り分けるために行える調査などにつきまして、アドバイスをいただけると幸いです。

回答の条件
  • 1人2回まで
  • 登録:2008/02/05 02:55:11
  • 終了:2008/02/12 03:00:02

回答(2件)

id:tezcello No.1

tezcello回答回数459ベストアンサー獲得回数692008/02/05 12:10:54

ポイント35pt

メールのヘッダ部がこんな感じになっていませんか?(「表示」->「ソース」で見る事ができると思います)

Subject: =?iso-2022-jp?B?.....

=?iso-2022-jp?B?GyRCITwlYBsoQg==?=

Date: Thu, 31 Jan 2008 22:14:44 +0900

From: =?iso-2022-jp?B?

現象の起きているマシン、起きていないマシンで、ソースに差があるとしたら、別な所に原因があるかもしれません。


また、全く同じ件名でもサーバによって差があるのですか?

MTA が勝手に改行を加えるとは思い難いのですが...

何かの条件がそろうと、JPHPMailer が悪さをするって事は?

(一般的な折り返し文字数の処理がSubjectにも適応されていると空行が入ったりして...)

id:selter

なるほど。サブジェクトが改行されてしまっているのですね。

となると、サブジェクトに問題があるのでしょうか。。。もう少し調べて見つつ、サブジェクトを変えてみたりしますね。

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

2008/02/05 12:17:10
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402008/02/05 22:32:45

ポイント35pt

jphpmailer.php

198行目のencodeMimeHeaderの関数

コメントとソースを見る限りでは、サブジェクトが長い文字の場合、

改行が入るようになってるようですが・・。

------

改行コードは、,$linefeed="\r\n"で定義されてます。

------

規格を調べてみると、

http://www.futomi.com/subroutine/encodesubject.html

>RFC2047では、エンコードされた状態で、全体の文字数が(「Subject: 」を含めて)

>76文字を超える場合には、改行する必要があります。

改行コードもCRLFなので正しいですね。

-------

短いSubjectしか使わないのなら、

jphpmailer.phpの改行を入れる処理を書き換えて様子を見てみては?

-------

とりあえず発生条件は、長い日本語文字列のSubjectに間違いがないと思うので

その条件で再現させてから、調査してみてください。

id:selter

ソースを解析していただいたようで、ありがとうございます。

そしたら、改行をしないようにプログラムを改造したりしたらよいのでしょうかね。。

ひとまず、様子を見つつ、いろいろと試行錯誤してみますね。ありがとうございました!

2008/02/05 23:08:56
  • id:tezcello
    意図した通りに書けませんでした。

    Subject: =?iso-2022-jp?B?.....

    =?iso-2022-jp?B?GyRCITwlYBsoQg==?=
    Date: Thu, 31 Jan 2008 22:14:44 +0900
    From: =?iso-2022-jp?B?

    このようになっているのでは?と書きたかったのです。
    Subject: の2行目(またはそれ以降)に空行があるのではないかと
  • id:KUROX
    subjectに短い日本語を指定してたら問題ないと思います。
    短くても改行がはいるなら、バグなので修正する必要はあると思います。

    >そしたら、改行をしないようにプログラムを改造したりしたらよいのでしょうかね。

    長い日本語で、改行を入れない場合、他のメーラで不具合が生じるかもしれません。
  • id:selter
    >tezcelloさん、KUROXさん

    コメントありがとうございました。
    結局、いろいろ試行錯誤を重ねたあげく、RFCからは外れてしまいますが、サブジェクトを折り返さないようにしたところ、正常に表示されました。

    Outlookに原因があるのか、メールサーバーに原因があるのか、真相は分からないままだったのですが、とにかく RFCで正しいはずのサブジェクトを折り返すという処理を、正しく制御してくれない環境があるようです。。

    大変参考になりました。ありがとうございました!
  • id:tezcello
    ポイントありがとうございました。

    Subject を折り返す(複数行にする)だけでは、多分問題にならないと思います。

    Subjectヘッダの内容が長過ぎる場合は、改行し、一つ以上の空白またはタブで始まる継続行を複数行続ける事が出来る事になっているはずだからです。
    ただし、それぞれの行が、76文字(だったっけ?)を超えないようにしなくてはいけません。
    更に、日本語を使う場合は base64 でエンコードしなくてはいけないので、半角英数文字や記号が入っていたりすると文字数を数えるのが複雑になります。
    jphpmailer.php の処理を調べてはいませんが、エンコード後に文字数をチェックするルーチンで勝手に改行された結果、Subject ヘッダの内容に空行(改行文字しか無い行)が存在するようになってしまっているのではないかと疑っています。
    (ひょっとしたら、PHPの mail() 内でやっているのかもしれませんが)

    空行が出来てしまうと、そこがメールヘッダとメール本文の区切りと判断されてしまうので、それ以降のヘッダ行が本文として表示されてしまうのです。
    ヘッダ行の継続行は空白やタブで始めなければいけないのはその為で、偶然改行文字の直前で改行しなければならなくなったからといって単純に改行するだけではダメなんです。

    また、そうならない為にも base64 にエンコードする前にきちんと文字数を数えてからエンコードし、この部分を再度文字数チェックして改行してしまわないようにする(チェックが不要なようにエンコード後想定文字数内になるようにエンコードする)必要があります。

    で、以前やろうとしたんですが、ものすごく面倒だった記憶が...
    規格よりも少し短めで折り返すようにして逃げた様な気がしますので、同じような対策が効くかもしれませんね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません