Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2006-01-20 20:48:46

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

フォームメールを作成するプラグインです。

v0.5を追加しました。

V0.5での変更点:
・NP_Captchaとの連動で画像認証を選択可能に。
・プラグインオプションでの設定をブログオプションで上書き可能に。->ブログ毎に設定の違うフォームが設置できます。
・emailフィールドを廃止して、重複を防止。
v0.4からの引継ぎ:
・アイテム内に本プラグイン用の記述を行うことでフォームメールとして機能します。
・アイテム内にオプションを記述できるので、各種設定をアイテム毎に変更できます。
・入力内容のチェックとプレビュー機能があります。
・プレビューの並び順をレイアウトに関係なく指定できます。
・複数の宛先にそれぞれJISまたはUTF-8を選択してメールを送信できます。
・自動返信メールを送ることができます。
・送信内容をコメントとして保存するかどうかを選択できます。
・各種カスタマイズを容易にできるように作成してあります。
・隠し機能あり

TIPS
・NP_SkinLayerをうまく使うと、スキンを切り替えることなく、メールフォーム用のアイテムだけコメント欄、トラックバック欄を非表示にできます。詳しく知りたい方は気軽に聞いてください。

使い方:
・アイテムの[続き]で<!%itemformmail%!>~~<!%/itemformmail%!>の間に、<!%uform(  )%!>でフォームエレメントを追加できます。詳しくはサンプルを見てください。アイテム内への<% %>の記述は標準のパーサーとバッティングすることがあるのとプラグイン削除時にDISALLOWとなってしまうので、HTMLに入ってもコメントとして解釈される<!% %!>で記述します。(順番に注意)(将来的にはヘルプを用意する?かはわかりません)
・プラグインオプションでメール送信時のデフォルト設定を行うことができますが、アイテム内でオプションの上書きができます。

今後の予定:
・スキン変数を提供することによりメンバーページ他に出力可能にする?(50%ぐらい)
・パフォーマンスの改良(現在いくつかの無駄を認識しています->記述の仕様変更が若干必要なので検討中)
・バグつぶし
・使い方ページの作成

フォームサンプル: インストール後「続き」に下記のように書き込んでみてください。
V0.4以前とはメールフィールドの扱いが変わりました。

<!%itemformmail%!>
<form name="form1" method="post" action="">
 <p>メールフォーム用サンプル </p>
 <table border="0" cellspacing="0" cellpadding="0">
  <tr>
   <td>お名前</td>
   <td><!%uform(1,text,ename,名前,ename)%!>
   </td>
  </tr>
  <tr>
   <td>おところ</td>
   <td><!%uform(2,text,address,住所)%!>
   </td>
  </tr>
  <tr>
   <td>コメント</td>
   <td><!%uform(3,textarea,comment,コメント,need,cols="20" rows="5")%!>
   </td>
  </tr>
  <tr>
    <td>好きな果物</td>
    <td><!%uform(6,select,autoreply,好きな果物,need,特になし
ラフランス//selected
パイナップル
クランベリー
ドリアン
その他)%!></td>
  </tr>
  <tr>
    <td>
      性別</td>
    <td><!%uform(7,radio,sex,性別,,男性
女性//selected
不明)%!>
</td>
  </tr>
  <tr>
    <td>未成年?</td>
    <td><!%uform(8,checkbox,under20,未成年?,,未成年)%!>
   	</td>
  </tr>
  <tr>
    <td>E-Mail</td>
    <td><!%uform(10,text,value,電子メール,email)%!></td>
  </tr>
  <tr>
   <td>確認用</td>
   <td><!%uform(11,text,confirm,,confirm)%!></td>
  </tr>
 </table>
<!%captcha%!>
 <input name="sendmail" type="hidden" value="true"/>
 <input type="submit" name="Submit" value=" 送 信 " class="formbutton" /> 
 <input type="reset" name="Submit" value=" リセット " class="formbutton" />
</form>
<!%uform(option,title,アイテム内のオプションに書いたタイトル)%!>
<!%/itemformmail%!>
<!%itemformmail%!>
  <!%uform(option,successmessage,お問い合わせサンキュー)%!>
<!%/itemformmail%!>

CSSとしては下記のようなクラス定義をしてください。

.form-preview {
	width: 400px;
	border: 1px solid #666666;
}
.form-name {
	border: 1px solid #CCCCCC;
	background-color: #EEEEEE;
	width: 120px;
}
.form-value {
	border: 1px solid #CCCCCC;
}
.formerror {
	font-weight:bold;
	color:red;
}
.form-notice {
	font-weight:bold;
	color:#FF3300;
}

一応、0.3.2(0.3までの最終版を残しておきます。重大な問題があるときは修正版を出します)
0.3までのバグレポートと0.4に向けた開発のアイディアをご提供いただいた皆様に感謝します。
NP_ExItemと同居するときは、本プラグインを上にして先にパースしてください。

この記事は随時変更していきます。

0.5.1 存在しない管理画面へのリンクとしてquickmenuが残っていたのを削除しました。
0.5.2 画像認証を使用しないという設定でも画像認証でチェックしていた部分を修正しました。
0.5.3 画像認証を使用するが、ログインしているときに画像は表示されないが、検証に失敗するバグを修正
0.5.4 環境によって同時に複数メールが送信されてしまうバグを修正。
0.5.5 いくつかの不具合を修正

オフライン

#2 2006-05-29 00:48:39

カタナ
メンバー
登録日: 2005-12-06
投稿: 3

Re: NP_ItemFormmail

早速使わせていただいております。

とてもいい感じなのですが、個別アイテムページ内において、
送信をし、入力内容のプレビュー画面で「コメントを書く」の下と
「コメント:」の間に以下のように表示されます。

Warning: htmlspecialchars() expects parameter 1 to be string, array given
in /ホストのパス/nucleus/libs/SKIN.php on line 1290

解決方法はありますでしょうか?

オフライン

#3 2006-05-29 21:01:00

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

バグレポートありがとうございます。
nucleusのことをよくわかっていない頃に作ったので、すっかり存在自体忘れていました。 :oops:
nucleusで使用している予約語のbodyをメールのbodyと併用しているために起きているものと思います。

修正版は準備出来次第アップしますが、手修正する場合は、プラグイン内のbodyをすべて別の名前にするとよいかと思います。

フォームタグもそれにあわせなければならないです。
先ほど修正版をアップしましたが、body以外でもバッティングするのかは確認できていません。
私の環境だと、コメントを無効にしているので確認できないのです・・・。もうしわけない。

オフライン

#4 2006-05-29 22:44:25

カタナ
メンバー
登録日: 2005-12-06
投稿: 3

Re: NP_ItemFormmail

kosugiatkipsさん

わざわざご対応ありがとうございます。

しかし、修正版を試してみたところ問題は解決されませんでした。
全く同じ状況です。

ただこれは自分の設定関係でまちがっているだけかもしれません。

また、それと同時に、そもそもメールフォームで使うアイテムにコメントや
トラックバックの項目が不要だなあという欲が出てしまい、
テンプレートでif文が使えたら分岐して、コメント等を表示させない
こともできるのですが、それができないため、新規ブログを作成して
メールフォーム専用のスキンとテンプレートを用意してしまいました。

そちらではコメント等を表示させないので、自分の問題は発生しない
ものとなりました。いろいろとどうもありがとうございました。

オフライン

#5 2006-05-30 08:18:23

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

なおってないですか・・残念。
フォームの名前の衝突ではない別の原因があるのかもしれません。もう少し調べてみます。

ところで、メールフォームを作成するプラグインは、他にもいくつかあって、不具合の少ないものもあるようです。
作った当初は見つからなかったので作ったのですが、いろいろとリンクをたどっていくうちに何種類か出ているらしいです。

http://www.res-system.com/weblog/item/408

こちらが参考になるかと思います。

オフライン

#6 2006-05-30 22:00:19

カタナ
メンバー
登録日: 2005-12-06
投稿: 3

Re: NP_ItemFormmail

kosugiatkipsさん

ご紹介までいただき、どうもありがとうございました。

追伸

リンク先の方法も読んでいたのですが、「NP_ItemFormmail」の
方が簡単かつカスタマイズが柔軟にできて、自分には合っていると
感じています。

オフライン

#7 2006-06-05 21:03:00

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

愛用させていただいています。

文字コードはUTF-8ではなくiso-2022-jpのほうがいいような気がしますが、いかがでしょうか。
最近のメールソフトならたいていUTF-8で問題ないと思いますが、携帯電話で受信した時に
UTF-8だと化けてしまいます。

オフライン

#8 2006-06-05 21:09:53

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

もうひとつ気がつきました。EUC-JPベースで運用していますが、
itemformmail / index.phpの中身の「管理画面」の文字が化けます。
(実用上、まったく困りませんが)
EUC-JPで保存し直して対応しました。

オフライン

#9 2006-06-05 21:24:07

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

yama.kyms さんの発言:

もうひとつ気がつきました。EUC-JPベースで運用していますが、
itemformmail / index.phpの中身の「管理画面」の文字が化けます。
(実用上、まったく困りませんが)
EUC-JPで保存し直して対応しました。

バグレポありがとうございます。

管理画面はまだ作っていないので・・・(編集画面はどうだったかな・・ sad
機能を入れたときは、UTF-8 EUCの両方に対応するよう修正したいと思います。

メールの文字コードは、選択可能にしたほうがいいかもしれませんが、JISだと別の問題(文字化け)があって現状のようにしています。
Jcode.phpsとリンクするとかを検討しなければとはおもっているのですが、適切な配布バージョンがわからなかったりで頓挫しています。

改造の予定に入れておきたいと思います。

オフライン

#10 2006-06-05 21:29:02

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

さっそくの返信ありがとうございます。新バージョン、楽しみに待っています。
扱いやすいプラグインなので期待しています。

ところで、もうひとつ文字化け関係を見つけました。

From: =?UTF-8?B?44KE44G+44KC44Go=?==?UTF-8?B?=?=<yamamoto@****.ne.jp>

差出人名が、サンダーバードの場合このように化けて表示されます。

オフライン

#11 2006-06-05 22:05:03

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

yama.kyms さんの発言:

From: =?UTF-8?B?44KE44G+44KC44Go=?==?UTF-8?B?=?=<yamamoto@****.ne.jp>

差出人名が、サンダーバードの場合このように化けて表示されます。

なるほど。
原因はわかりかねますが、?UTF-8?B?44KE44G+44KC44Go=?==?UTF-8?B?=?=
の=?UTF-8?B?=?=が一つ多いのが原因かもしれません。

391行目を下記のようにtrimを追加すると、=?UTF-8?B?=?=の重複は避けられるのですが、サンダーバードが受け入れてくれるかどうかはまた別の話になります。

$data = '=?UTF-8?B?'.trim(chunk_split(base64_encode(mb_convert_encoding(undoMagic($str),"UTF-8",$this->form_input)))).'=?=';;

オフライン

#12 2006-06-05 23:21:04

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

たぶん対症療法だと思いますが、とりあえず以下のようにしてみました。

まず、「mb_language("uni");」を「mb_language("Japanese");」にしました。
これで本文は携帯電話でも化けずに届くようになりました。

次に、mymbmimeというところを以下のように書き換えました。

function mymbmime($str) {
    $data = mb_encode_mimeheader($str);
    return $data;
}

これで、差出人名が日本語でも化けなくなりました。
たまたまサンダーバードと携帯電話で化けてないというだけで、他のメーラーでは
どうかは分かりませんが…汗
あと、Nucleusの運用環境はEUCです。

だけどこのへん、なにかワケがあって現状のような仕様にしているのですよね?

オフライン

#13 2006-06-06 06:51:29

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

yama.kyms さんの発言:

mymbmimeというところを以下のように書き換えました。

function mymbmime($str) {
    $data = mb_encode_mimeheader($str);
    return $data;
}

これで、差出人名が日本語でも化けなくなりました。
たまたまサンダーバードと携帯電話で化けてないというだけで、他のメーラーでは
どうかは分かりませんが…汗
あと、Nucleusの運用環境はEUCです。

だけどこのへん、なにかワケがあって現状のような仕様にしているのですよね?

そうなんですよ。実は。
mb_encode_mimeheaderはPHPの最新バージョンでは問題ないのですが、つい最近のバージョン4.4.xのどれかで正しくエンコードされないバグがあったので、エンコードを手動でしています。
mb_encode_mimeheaderが正しく動作する環境であれば、mymbmime自体いらないのですけど・・;)

あと、mb_language("uni");については、UTF-8 -> JISの変換にするとmbstringでは変換しきれない文字がどうしてもあるようなので、JISにはしていないというのが主な理由です。別のライブラリをかませればなんとかなるのでしょうけれど。
現状では開発版であることもあり、私の環境に合わせてUTF-8優先にしていたのですが、選択可能にする方がよさそうです。

オフライン

#14 2006-06-06 11:20:40

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

http://d.hatena.ne.jp/t_komura/20051105
書いてある内容はご存じかもしれませんが、自らの備忘のためにも貼り付けておきます。

うーん。PHPの日本語処理ってバージョンごとにいろいろ問題あるのですね。
ちなみにこちらのサーバの環境はPHP4.4.2でした。

オフライン

#15 2006-06-06 13:04:11

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_ItemFormmail

mb_encode_mime_headerのところって,1行の文字数を見ないといけないので自分で実装すると結構大変なんです。
特にJISは死にそうになる。
ご参考までに,mbstringエミュレータでは次のような実装になっています。もちろんGPLですから再利用はご自由に。

function _sub_qponechar($str, &$len)
{
	$all = unpack("C*", $str);
	$s = ''; $len = 0;
	foreach($all as $char) {
		if (((ord('A') <= $char) && ($char <= ord('Z'))) ||
			((ord('a') <= $char) && ($char <= ord('z')))) {
			$s .= chr($char);
			++$len;
		} else {
			$s .= '='.sprintf("%2X",$char);
			$len += 3;
		}
	}
	return $s;
}

function _sub_quoted_printable_encode($str, $encoding, $maxline, $linefeed)
{
	global $mbemu_internals;
	switch ($e = $mbemu_internals['encoding'][$encoding]) {
		case 0 : //ascii
		case 1 : //euc-jp
		case 2 : //shift-jis
		case 4 : //utf-8
			$max = preg_match_all('/'.$mbemu_internals['regex'][$e].'/', $str, $allchars);
			break;
		case 3 : //jis
			$max = preg_match_all('/'.$mbemu_internals['regex'][3].'/', $str, $allchunks, PREG_SET_ORDER);  // 文字種ごとの配列に分解
			$st = ''; // quoted printable変換後の文字列
			$len = $maxline;  // その行に追加可能なバイト数
			$needterminate = FALSE; //最後にエスケープシーケンスが必要かどうか
			for ($i = 0; $i < $max; ++$i) {
				if (ord($allchunks[$i][1])) { //英数にマッチ
					if ($needterminate) {
						$st .= '=1B=28B';
						$len -= 7;
					}
					$tmparr = unpack("C*", $allchunks[$i][1]);
					foreach ($tmparr as $char) {
						$tmp = _sub_qponechar(chr($char), $l);
						if ($len < $l) {
							$st .= $linefeed;
							$len = $maxline;
						}
						$st .= $tmp;
						$len -= $l;
					} 
					$needterminate = FALSE;
				} elseif (ord($allchunks[$i][2])) { //漢字にマッチ
					$maxchars = preg_match_all("/../",substr($allchunks[$i][0], 3),$allchars);
					$tmp = _sub_qponechar($allchars[0][0], $l);
					if ($len < 14 + $l) {
						if ($needterminate)
							$st .= '=1B=28B';
						$st .= $linefeed;
						$len = $maxline;
					}
					$st .= '=1B=24B';
					$len -= 7;
					for ($j = 0; $j < $maxchars; ++$j) {
						$tmp = _sub_qponechar($allchars[0][$j], $l);
						if ($len < $l + 7) {
							$st .= '=1B=28B'.$linefeed.'=1B=24B';
							$len = $maxline-7;
						}
						$st .= $tmp;
						$len -= $l;
					}
					$needterminate = TRUE;
					
				} elseif (ord($allchunks[$i][3])) { //半角カナにマッチ
					$max = preg_match_all("/./",$allchunks[$i][3],$allchars);
					$tmp = _sub_qponechar($allchars[0][0], $l);
					if ($len < 14 + $l) {
						if ($needterminate)
							$st .= '=1B=28B';
						$st .= $linefeed;
						$len = $maxline;
					}
					$st .= '=1B=28I';
					$len -= 7;
					for ($j == 0; $j < $max; ++$j) {
						$tmp = _sub_qponechar($allchars[0][$j], $l);
						if ($len < $l + 7) {
							$st .= '=1B=28B'.$linefeed.'=1B=28I';
							$len = $maxline-7;
						}
						$st .= $tmp;
						$len -= $l;
					}
					$needterminate = TRUE;
				}
			}
			if ($needterminate) $st .= '=1B=28B';
			$st .= $linefeed;
			return $st;
	}
	$st = ''; // quoted printable変換後の文字列
	$len = $maxline;  // その行に追加可能なバイト数
	for ($i = 0; $i < $max; ++$i) {
		$tmp = _sub_qponechar($allchars[0][$i], $l);
		if ($l > $len) {
			$st .= $linefeed;
			$len = $maxline;
		}
		$st .= $tmp;
		$len -= $l;
	}
	$st .= $linefeed;
	return $st;
}

function _sub_encode_base64($str, $encoding, $maxline , $linefeed)
{
	global $mbemu_internals;
	switch ($e = $mbemu_internals['encoding'][$encoding]) {
		case 0 : //ascii
		case 6 : //iso-8859-1
			return chunk_split( base64_encode($str) , $maxline, $linefeed);
		case 1 : //euc-jp
		case 2 : //shift-jis
		case 4 : //utf-8
		case 5 : //utf-16
			$max = preg_match_all('/'.$mbemu_internals['regex'][$e].'/', $str, $allchars);
			break;
		case 3 : //jis
			$max = preg_match_all('/'.$mbemu_internals['regex'][3].'/', $str, $allchunks);  // 文字種ごとの配列に分解
			$st = ''; // BASE64変換後の文字列
			$maxbytes = floor($maxline * 3 / 4);  //1行に変換可能なバイト数
			$len = $maxbytes;  // その行に追加可能なバイト数
			$line = '';  //1行分の変換前の文字列
			$needterminate = FALSE; //最後にエスケープシーケンスが必要かどうか
			for ($i = 0; $i < $max; ++$i) {
				if (ord($allchunks[1][$i])) { //英数にマッチ
					if ($needterminate) {
						$line .= chr(0x1B).'(B';
						$len -= 3;
					}
					$tmpstr = $allchunks[1][$i];  //追加する文字列
					$l = strlen($tmpstr);  //追加する文字列の長さ
					while ($l > $len) {
						$line .= substr($tmpstr, 0, $len);
						$st .= base64_encode($line).$linefeed;
						$l -= $len;
						$tmpstr = substr($tmpstr, $len);
						$len = $maxbytes;
						$line = '';
					} 
					$line .= $tmpstr;
					$len -= $l;
					$needterminate = FALSE;
				} elseif (ord($allchunks[2][$i])) { //漢字にマッチ
					$tmpstr = substr($allchunks[0][$i], 3);
					if ($len < 8) { //文字を追加するのに最低8バイト必要なので
						if ($needterminate)
							$line .= chr(0x1B).'(B';
						$st .= base64_encode($line).$linefeed;
						$len = $maxbytes;
						$line = '';
					}
					$l = strlen($tmpstr);
					$line .= chr(0x1B).'$B';
					$len -= 3; 
					while ($l > $len-3) {
						$add = floor(($len-3) / 2) * 2;
						if ($add == 0) break;
						$line .= substr($tmpstr, 0, $add).chr(0x1B).'(B';
						$st .= base64_encode($line).$linefeed;
						$l -= $add;
						$tmpstr = substr($tmpstr, $add);
						$len = $maxbytes-3;
						$line = chr(0x1B).'$B';
					} 
					$line .= $tmpstr;
					$len -= $l;
					$needterminate = TRUE;
					
				} elseif (ord($allchunks[3][$i])) { //半角カナにマッチ
					$tmpstr = $allchunks[3][$i];
					if ($len < 7) { //文字を追加するのに最低7バイト必要なので
						if ($needterminate)
							$line .= chr(0x1B).'(B';
						$st .= base64_encode($line).$linefeed;
						$len = $maxbytes;
						$line = '';
					}
					$l = strlen($tmpstr);
					$line .= chr(0x1B).'(I';
					$len -= 3; 
					while ($l > $len-3) {
						$line .= substr($tmpstr, 0, $len-3).chr(0x1B).'(B';
						$st .= base64_encode($line).$linefeed;
						$l -= $len;
						$tmpstr = substr($tmpstr, $len-3);
						$len = $maxbytes-3;
						$line = chr(0x1B).'(I';
					} 
					$line .= $tmpstr;
					$len -= $l;
					$needterminate = TRUE;
				}
			}
			if ($needterminate) $line .= chr(0x1B).'(B';
			$st .= base64_encode($line).$linefeed;
			return $st;
	}
	$st = ''; // BASE64変換後の文字列
	$maxbytes = floor($maxline * 3 / 4);  //1行に変換可能なバイト数
	$len = $maxbytes;  // その行に追加可能なバイト数
	$line = '';  //1行分の変換前の文字列
	for ($i = 0; $i < $max; ++$i) {
		$l = strlen($allchars[0][$i]);
		if ($l > $len) {
			$st .= base64_encode($line).$linefeed;
			$len = $maxbytes;
			$line = '';
		}
		$line .= $allchars[0][$i];
		$len -= $l;
	}
	$st .= base64_encode($line).$linefeed;
	return $st;
}

function mb_encode_mimeheader( $str, $encoding = "ISO-2022-JP", $transfer_encoding = "B", $linefeed = "\r\n")
{
	global $mbemu_internals;
	if ($transfer_encoding == "b") $transfer_encoding = "B";
	if ($transfer_encoding <> "B") $transfer_encoding = "Q";
	$encoding = strtoupper($encoding);
	
	$head = '=?' . mb_preferred_mime_name ($encoding) . '?'.$transfer_encoding.'?';
	$str = mb_convert_encoding($str, $encoding, mb_internal_encoding());
	$length = 76 - strlen($head) - 4;
	if ($transfer_encoding == "B") {
        $str = _sub_encode_base64( $str , $encoding, $length, $linefeed);
	} else {
		$str = _sub_quoted_printable_encode($str, $encoding, $length, $linefeed);
	}
	$ar = explode($linefeed, $str);
	$s = '';
	foreach ($ar as $element) {
		if ($element <> '')
			$s .= $head . $element . '?=' .$linefeed;
	}
	return $s;
}

ここだけは,もう一回書けと言われたら,書くのやめるだろうな。 roll

オフライン

#16 2006-06-06 14:53:04

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

これってnucleus/libs/mb_emulator/mb-emulator.phpに含まれているコードですよね。
もしこちらを使う方法が有効であれば、これを呼び出して使うという方法もアリでしょうか。
mbstringに対応しているサーバでも、クセを吸収するためにあえてこれを使うと。

余談ですがmbstringエミュレータを作った人ってすごいなーと思っていたら、いつも
Nucleusのフォーラムで名前を見かけるAndyさんと気付くのに一年以上。汗

オフライン

#17 2006-06-06 15:14:57

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_ItemFormmail

yama.kyms さんの発言:

これってnucleus/libs/mb_emulator/mb-emulator.phpに含まれているコードですよね。
もしこちらを使う方法が有効であれば、これを呼び出して使うという方法もアリでしょうか。
mbstringに対応しているサーバでも、クセを吸収するためにあえてこれを使うと。

mbstringが入っている環境では関数がバッティングしてしまうので使えません。
ここだけ抜き出してプラグインのソースに貼るか,別ファイルにしてincludeして,関数名を変えて使えば動くと思います。

ちなみに,mbstringの動作と比較するために,mbstring環境に入れてテストすることがあるのですが,そういうときはmb_を一括でnb_と置換して動かしたりしています。

オフライン

#18 2006-06-07 12:15:58

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

PHP 4.4.0 UTF-8の環境で試したのですが、
Andyさんのmb_encode_mimeheaderでfrom用の文字列をエンコードすると、outlookで受けたとき、全角16字おきに、文字化けしてしまうようです。
4.3.10 EUCの場合は、全部文字化けしてしまいます。
mb_encode_mimeheaderに問題がある環境では、同じ現象になってしまうのかもしれません。
なぜだかよくわからなかったので、分析のしようがないのですが。
そもそも4.4.0を使うなっていう声が聞こえてきそうで  :oops:


テスト環境そのものの判断が難しいのと、RFC的な判断とかいろいろと絡むこともありますし、mb_send_mailを使う段階で問題がある可能性があるので、ケース毎に対応するしかないのかなとも思ったりしています。

オフライン

#19 2006-06-11 16:37:18

rento
メンバー
From: Los Angeles, CA
登録日: 2006-06-01
投稿: 32

Re: NP_ItemFormmail

こんにちは。
yamaさんに色々教えて頂いて、やっとこさちゃんと表示できるように
なりました。

メールを送ると、指定した所には届くのですが、
送信後に

「メールの送信に失敗しました。」

というメッセージと共に

Warning: Missing argument 5 for mb_send_mail() in /home/zenored/public_html/nucleus/libs/mb_emulator/mb-emulator.php on line 670

というエラーがでます。

サーバーの環境ですが、
PHPは5.0.5
MySQLは4.1.10
です。

海外サーバーです。
yamaさんに教えて頂き、mb-emulatorを新しい物にかえたのですが、
同じでした。

何か教えていただければ、と思います。
よろしくお願いします。

オフライン

#20 2006-06-11 17:56:21

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

/home/zenored/public_html/nucleus/libs/mb_emulator/mb-emulator.php
670行目の

function mb_send_mail($to, $subject, $message , $additional_headers, $additional_parameter)

function mb_send_mail($to, $subject, $message , $additional_headers = '', $additional_parameter = '')

に変更して

684行目の

mail($to, $subject, $message, $additional_headers, $additional_parameter);

if ($additional_headers ===  '' ) {
  mail($to, $subject, $message);
} elseif ($additional_parameter === '' ) {
  mail($to, $subject, $message, $additional_headers);
} else {
  mail($to, $subject, $message, $additional_headers, $additional_parameter);
}

という具合に変えれば、動くかもしれません。

Itemformmail v0.3 まではUTF-8で送るのでmb-emulatorのmb_send_mailとは互換性がなさそうです。
yama.kymsさんの書かれているようにJIS用の設定に変える必要があります。

php5で動くとは思っていなかったのですが・・・。

オフライン

#21 2006-06-11 21:08:49

rento
メンバー
From: Los Angeles, CA
登録日: 2006-06-01
投稿: 32

Re: NP_ItemFormmail

こんにちは。JIS変更は以下の所のことでしょうか?

yama.kyms さんの発言:

まず、「mb_language("uni");」を「mb_language("Japanese");」にしました。
これで本文は携帯電話でも化けずに届くようになりました。

次に、mymbmimeというところを以下のように書き換えました。

function mymbmime($str) {
    $data = mb_encode_mimeheader($str);
    return $data;
}

先ほどの書き込みも少し間違いがありました。
一番初めにかいたエラーが出たのは、Nucleusに入っていたエミュレーターで試したときのエラーです。

その次はキャッシュの関係だったのか?もう一度最新版のエミュレーターを入れ直してみたところ、
670..のエラーは出ず、メールは届くのですが、「メールの送信に失敗しました」との
メッセージがでます。

kosugiatkipsさんが書いて下さったとおりの修正を最新版は2つめだけが違うので直しても
同じで、670..のエラーは出ず、メールは届くのですが、「メールの送信に失敗しました」との
メッセージがでます。

上の引用部分もitemformmail.phpを直しましたが、
670..のエラーは出ず、メールは届くのですが、「メールの送信に失敗しました」との
メッセージがでます。

何か良い手だてはないでしょうか? :cry:  :cry:

オフライン

#22 2006-06-12 02:24:48

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_ItemFormmail

kosugiatkips さんの発言:

/home/zenored/public_html/nucleus/libs/mb_emulator/mb-emulator.php
670行目の

function mb_send_mail($to, $subject, $message , $additional_headers, $additional_parameter)

function mb_send_mail($to, $subject, $message , $additional_headers = '', $additional_parameter = '')

に変更して

少なくとも最新版はそうなっていますので,変更は不要です。


kosugiatkips さんの発言:

Itemformmail v0.3 まではUTF-8で送るのでmb-emulatorのmb_send_mailとは互換性がなさそうです。

mb_languageをuniにして,mb_internal_encodingをutf-8にすれば送れるはずだと思います。というかmbstringエミュレータじゃなくても,その設定でないとUTF-8では正しく送れないと思います。

オフライン

#23 2006-06-12 11:59:40

rento
メンバー
From: Los Angeles, CA
登録日: 2006-06-01
投稿: 32

Re: NP_ItemFormmail

Andy さんの発言:

mb_languageをuniにして,mb_internal_encodingをutf-8にすれば送れるはずだと思います。というかmbstringエミュレータじゃなくても,その設定でないとUTF-8では正しく送れないと思います。

ということはitemFormmailの82行目の

if ($language == "japanese-euc") $inner_code = "EUC-JP";

を除くだけでいいのでしょうか、、、?

オフライン

#24 2006-06-12 15:59:25

yama
Administrator
登録日: 2005-07-07
投稿: 1,243
ウェブサイト

Re: NP_ItemFormmail

[ NP_ItemFormmail.php ]

		if (mb_send_mail($this->getOption('sendto'),$senddata['title'],$senddata['body'],$senddata['mailfrom'])) {
			$result = "ok";
			if ($autoReply == true) {
				$returnFrom =  "From:".$CONF['AdminEmail']."\r\n";
				if ( mb_send_mail($senddata['email'],$returnTitle,$returnBody,$returnFrom)) {
					$result = "ok";
				} else {
					$result = _IFORM_ERROR_AUTOREPLY;
				}
			}
		} else {
			$result = _IFORM_ERROR_MAILSEND;

このへんがなんとなく気になります。どうすればいいかまでは分からないですが。
「$result = _IFORM_ERROR_MAILSEND」で「メール送信失敗」を表示してるのですよね。

オフライン

#25 2006-06-12 20:06:02

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_ItemFormmail

Andy さんの発言:
kosugiatkips さんの発言:

/home/zenored/public_html/nucleus/libs/mb_emulator/mb-emulator.php
670行目の

function mb_send_mail($to, $subject, $message , $additional_headers, $additional_parameter)

function mb_send_mail($to, $subject, $message , $additional_headers = '', $additional_parameter = '')

に変更して

少なくとも最新版はそうなっていますので,変更は不要です。

<!-- l --><a class="postlink-local" href="http://japan.nucleuscms.org/bb/viewtopic.php?t=2018">viewtopic.php?t=2018</a><!-- l -->
の3.23 UTF-8版に同梱されているものは、670行目は

function mb_send_mail($to, $subject, $message , $additional_headers, $additional_parameter)

になっているみたいです。

それで、

kosugiatkips さんの発言:

Itemformmail v0.3 まではUTF-8で送るのでmb-emulatorのmb_send_mailとは互換性がなさそうです。

と書いたのは、680行目、JISではない場合に

if (!_is_JIS($message))
$message = mb_convert_encoding($message, "iso-2022-jp", mb_internal_encoding());

となっていて、強制的にJIS変換しているようなので、UTF-8での送信には対応しないという意味で書いています。


私の勘違いなのかもしれませんが、一応、そんな感じということでご報告です。
mb-emulatorの最新版は別の場所でGETしたほうがよいのでしょうか?

Andy さんの発言:

mb_languageをuniにして,mb_internal_encodingをutf-8にすれば送れるはずだと思います。というかmbstringエミュレータじゃなくても,その設定でないとUTF-8では正しく送れないと思います。

一応、Itemformmailではそのようにしています。

オフライン

Board footer