QA@IT

メール本文の先頭に空行が入らないようにする方法を教えてください

3692 PV

PHP 5.4、FuelPHP 1.6を使っています。
FuelPHPのEmailパッケージをsmtpドライバで使っています。
メール本文の先頭に空行が入ってしまうのですが、そういう仕様なんでしょうか。
空行が入らないようにする方法がありましたら教えてください。

また、coreのクラスを調べてみまして、次のどちらかが不要ではないかと思ったのですが、いかがでしょうか。
他に影響がないかどうかは確認していません。

https://github.com/fuel/email/blob/1.6/master/classes/email/driver.php#L952

952行目

$headers .= $newline;

https://github.com/fuel/email/blob/1.6/master/classes/email/driver/smtp.php#L82

82行目

$lines = explode($this->config['newline'], $message['header'].$this->config['newline'].preg_replace('/^\./m', '..$1', $message['body']));

この行の$message['header'].$this->config['newline']$this->config['newline']

  • 回答に追記しました。 -
  • Issueへの作者へのコメントについて追記しました。 -

回答

ソースは全然みていませんが、SMTPの仕様としてヘッダの後、ボディの前には空行がなければならかったと思います。

82行目の$this->config['newline'] はそのためのものでしょう。
一方952行目のnewlineはヘッダの文字列が改行で終わってない場合のためのものと思います。

例としては

(略、その他ヘッダ)
subject: title \r\n ← 952行目のnewline
\r\n ← 82行目のnewline
messagebody
(略)
\r\n.\r\n

(これは件名がヘッダの最後にあるという仮定の元にあります。SMTPの仕様上それは決められていませんのでただの仮定です。)
こういう想定だったとしてどちらかのnewlineを無条件に消すと問題になりますので、
そもそもヘッダの最後に何が来ているのかを見ないといけないでしょうね。

たとえば、上の例のように最後に件名が来ている場合設定している件名の最後に改行文字が含まれていないか、件名を空で送るとどうなるかなどもチェックされた方が良いでしょう。
件名ではなくても自分で設定している項目であれば同様です。

昔からそうならissueになにかしら上がりそうな気もするのでパラメータの設定ミスまたは最近の修正でおきたのかもしれませんね。調べてみて向こうの問題の様であればissueにあげてみるのもいいかもしれません。

追記しました

軽く見てみましたが直すとすれば

https://github.com/fuel/email/blob/1.6/master/classes/email/driver.php#L952

952行目

$headers .= $newline;

を $headersが改行文字で終わってない場合に変更するのがよさそうですね。

944行目から828行目(get_header)に飛んだ場合も改行は付加されるようですし、
948行目でも改行文字は追加されるようです。

ただし、foreach文にかからずヘッダがなにも追加されなかった場合にはブランクのままなので改行を追加する必要があります。
(emailの場合はないはずですが)

というわけで直すなら952行を条件付きの改行追加にするのが良いのではないでしょうか。

余談です。Issueについては無理にとは言いませんが、

Hi
FuelPHPを使ってメールを送信した。
受信したメールの本文が改行で始まっている。
driverの952行目かsmtpの82行目あたりが原因だと私は思う。
Thank you.

ぐらいでわかってもらえると思います。
必要があればコードと、受信したメールヘッダ(隠したいところはxxxxとかにかえつつ)を示せば良いと思います。

私も英語全然できませんが大体わかってもらえます(向こうもわかろうとしてくれます)。
sorry for my poor englishはあんまり言いすぎるとくどいようですのでほどほどに。

追記

本物のメールヘッダがあるとより良いのです

I expected to recieve following.

(headers)
subject: title \r\n
\r\n
messagebody
\r\n.\r\n

but I recieved like that.

(headers)
subject: title \r\n
\r\n
\r\n
messagebody
\r\n.\r\n

I think, too many line breaks are appended to headers.

とかかなぁ。
(\r\nは特に書かなくていいと思います。期待値を示せばわかってもらえそうな気がする)

編集 履歴 (4)
  • ご回答ありがとうございます。

    > 上の例のように最後に件名が来ている場合設定している件名の最後に改行文字が含まれていないか、件名を空で送るとどうなるかなどもチェックされた方が良いでしょう。

    このコードで確認しました。
    https://gist.github.com/honda0510/bdfa75baefb72b8a0fa7
    パターン1~4まですべて同じメールが届きました。
    -
  • > 調べてみて向こうの問題の様であればissueにあげてみるのもいいかもしれません。

    すみません、私にはハードルが高いです。
    -
  • issueに上げてみました(汗) https://github.com/fuel/email/issues/42 -
  • そこはヘッダだよ、もうちょっとエラーについて明確にしてと言われてますので、私がここで書いたみたいにヘッダの後に改行2つあってbodyがあるんじゃないかっていうコードブロックを書くといいかも。 -
  • 手取り足取りありがとうございます。ちょうど返信したところでした。望む結果を書いてませんでしたので追記してきます。 -
  • ほかの方が2個改行があることを確認したってフォローしてくださいましたね(私はgithubのアカウント思い出してもたもたしてました、普段bitbucket使いなもので)。ともあれこれでOSS活動に参加されましたね^^。 -
  • さっそく修正がなされたようです。flied_onionさん、ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。