複数行の文字列をメールのヘッダーに入れたい - PHPプロ!Q&A掲示板

1859

  • 0P

複数行の文字列をメールのヘッダーに入れたい

質問日時 / 2009年2月11日 00:55    回答数 / 4件

Questioner:  docopon  このエントリーをはてなブックマークに追加 

キーワード / PHP    メール    ヘッダー   

どなたか複数行の文字列をphpのメールのヘッダーに入れて送る方法をしっていますか?
出力は、Becky ver2(メーラー)のテンプレートにします。

例(やりたいこと): 
ヘッダー内の文字列:
$test = "あいうえお。\nかきくけこ。";
$mail_header .= "X- TEST: {$test}\r\n";

出力:
あいうえお
かきくけこ

RFCのrfc2822読みました。
http://srgia.com/docs/rfc2822j.html

>この仕様が 1 行の文字数に課す制限は二つある。CRLF を除いて、各
>行は 998 文字を超えてはならならず(MUST)、78 文字を超えるべきで
>はない(SHOULD)。 
文字の長さ的には問題ないと思います。

>一般的な規則として、この仕様は(単なる WSP 文字ではなく)空白文字を許す場所ならど
>こでも折り返しを許可しているし、任意の WSP の前に CRLF を置くことも許可してい
>る。
この場合、”ヘッダー内の記述”を折り返すかどうかだけのように思います。私の場合は、ヘッダー内の文字列を引用(他の場所で使用)した場合に、任意の位置(この位置を予めヘッダー内で指定したい)で改行して出力したいのです。折り返した次の行の文字列の前に半角スペースは置きたくありません(出力したくありません)。また、出力先が、Becky ver2(メーラー)と言うこともあり、自分で出力先ソフトのコードを書き換えることはできません。

ヘッダー内の文字列の改行後に半角スペースを入れるなども試しましたが、
$test = "あいうえお。\n かきくけこ。"

下記のように一行として出力されてしまいます。
出力:
あいうえお かきくけこ

どなたか、方法をご存知の方、おられましたら教えて下さい。
詳しい情報が記載されているサイトのURL等でも結構です。

よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01kaitauこんにちは。 実際に業務でやったことはありません
 ┗A01-1docoponkaitauさん ご回答、ありがとうございました。 参考
  ┗A01-1-1kaitauこんにちは。 うーん、どうもテンプレートを使って
   ┗A01-1-1-1docoponkaitauさん ご意見、ありがとうございました。 >

回答一覧

並び替え:

A01
answererkaitau [2月11日 14:11] (最終編集:2月11日 14:21)

こんにちは。

実際に業務でやったことはありませんが、
そのRFC文章を読む限り、いくつか実現不可能な条件があるのではないかと思います。

まず、セクション3.2.3. 空白の折り返しとコメント
には、
  1. FWS             =       ([*WSP CRLF] 1*WSP) /   ; 折り返し空白文字
  2.                         obs-FWS
と定義してあるので、
> 折り返した次の行の文字列の前に半角スペースは置きたくありません
は、違反していると思います。

また、セクション2.2.3. 長いヘッダフィールドには、
  1. 折り返された複数行のヘッダフィールドを単一行へと変換する手順は "展開(unfolding)" と呼ばれる。展開は単純に WSP の直後に続くすべての CRLF を削除することで行われる。より上位の文法的評価や意味的評価を行う際、各ヘッダフィールドは展開後の形式で扱われるべきである。

および、3.2.3後半に
  1. メッセージ内でヘッダの折り返し(つまり、WSP に続けて CRLF が含まれるヘッダフィールド本文)が現れるところではどこでも、この標準に従ってヘッダフィールドに字句解析が行われる前に、ヘッダの展開(CRLF の削除)が行われる。すなわち、FWS 内のすべての CRLF は意味的に "不可視(invisible)" ということである。
と、あるので、
> 下記のように一行として出力されてしまいます。
というのは、メーラーとしては「正しい動作」と見るしかないのではないでしょうか。
(Beckyなら、実際にメールを選択した状態で「表示(V)」→「ソースの表示(U)」を
 行うと、実際のソースには改行がまだ残っている事が確認できるのではないかと思います。)

セクション2・3を読んだ限りでは、ヘッダ内に改行を記述する折り返しの定義は、
利便性とか文字数制限の回避のために提供された手段であり、
ヘッダのフィールドの中に改行文字を埋め込む事を目的とした方法では無いように見受けられます。

あまり改行に拘らずに、何か代替のシンボルを記述してそれを解釈する方が
無難ではないかな、と思うのですが・・・

この意見に回答する

ツリーへ TOPへ

A01-1
replyerdocopon [2月12日 12:22]

kaitauさん
ご回答、ありがとうございました。
参考にさせて頂きます。

ところで、
>あまり改行に拘らずに、何か代替のシンボルを記述してそれを解釈する方
>が無難ではないか
上記のkaitauさんの文章が気になりますが、意味がはっきりと分かりません。
何か代替のシンボルをメールのヘッダーに記述しておき、それをベッキーのテンプレート(受信したメールの返信メール用テンプレート)に展開した時に、そのシンボルを任意の文字列(日本語含む)に置き換えることが可能だという意味でしょうか?

例(下記は可能ですか?): 
ヘッダー内の文字列:
$test = "symbol";
$mail_header .= "X- TEST: {$test}\r\n";

出力:
あいうえお
かきくけこ

又は
予め代替のシンボルをメールのヘッダーに記述しておき、それをベッキーのテンプレート(返信メール用)に展開した時に、どのシンボルがヘッダーに記述してあるかによって、予め用意してある複数のベッキーのテンプレートの中から任意のテンプレートが自動選択されるようにできればよいのですが。

上記に類似した質問は、ベッキーの掲示板で以前行ないましたが、ベッキーと直接関係ないので他で質問するようにコメントを頂きました。

上記以外にも他に良いアイデアがあれば、どなたか教えて下さい。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerkaitau [2月13日 14:23]

こんにちは。

うーん、どうもテンプレートを使ってやりたいこと、
を勘違いしていたみたいです。

メールのテンプレートに使用するための置き換え文字列を
指定する手段を探していてヘッダによる指定に行き当たった、
というところでしょうか。

改行ってデータ的には重要じゃないので、運用上
相手とのメールのやりとりをするなら、改行に
こだわらなくても別の文字で識別してもいいじゃない、
くらいのつもりだったのですが。

他に改行にこだわる理由(体裁上の問題とか)があるなら、
たとえば置き換え文字のための専用のヘッダを複数用意しておいて、
一行分の要素ごとに一個ヘッダを送るようにするとか?

メールで
X-TEST1: *※
X-TEST2: ○×
と送って、
テンプレートは
%h{X-TEST1}
%h{X-TEST2}
と作っておくとか。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerdocopon [2月13日 20:38]

kaitauさん
ご意見、ありがとうございました。

>他に改行にこだわる理由(体裁上の問題とか)があるなら、
>たとえば置き換え文字のための専用のヘッダを複数用意しておいて、
>一行分の要素ごとに一個ヘッダを送るようにするとか?

私も上記のことは考えましたが、上記の場合、全てのテンプレートの行数が同じでないとうまく行きません。上記の場合で、もしも、一つのテンプレートが3行からなりもう一つのテンプレートが5行からなった場合、行数が少ないテンプレート(3行のテンプレート)の行と行の間や最後の行の下に空白ができてしまいます。この空白を消す方法があればよいのですが。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
マジッククォートとmysql_real_escape_string
 このエントリーをはてなブックマークに追加 
A
magic_quotes_gpcでは、SQLインジェクション対処は十分できません。主な理由として、以下が上げられます。 ・magic_quotes_gpcは文字コードを考慮しないで処理するので、Shift_JISを使っている場合、SQLインジェ...

>>続きを読む

SQLインジェクション対策は時と場合で使う関数が変わります。その時にあったものを使いましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)