PHP正規表現でメール転送する方法

このQ&Aのポイント
  • PHPの正規表現を使用して、sakuraサーバーでメール転送を行いたい場合、preg_replace関数を使ってメールヘッダーと本文中の日本語句を削除する方法があります。
  • しかし、preg_replace関数を使う際にはEUC+LF形式のPHPファイルを使用する必要があります。
  • メールの転送や内容の削除を行う上で、PEARを使用する方法もありますが、正規表現を使いたい場合にはPEARが必要ありません。
回答を見る
  • ベストアンサー

メール転送でPHPの正規表現です。

sakuraサーバーで、mailfilterを使用して、パイプでメール転送しようという魂胆です。 http://ameblo.jp/topepe/entry-10325428465.html ※PHPにて正規表現を使って整形してメール転送しようと思っています。 #!/usr/local/php/5.2.17/bin/php-cgi <?php $content = null; $fp=fopen("php://stdin",'r') or die('File Open Error'); while( !feof($fp) ){ $content .= fgets( $fp ,1024); } mb_language("japanese"); mb_internal_encoding("UTF-8"); mb_send_mail("xxx@example.com","subject",$content); ?> のような簡単な転送では成功しています。 そこでpreg_replaceでメールヘッダーを削ったり、本文中の日本語句を削除してから転送しようとしているのですが、preg_replaceをかけるとすべて消えてしまいます。 ◎英数字だけの正規表現(/\A(.*?).jp/sなど)の場合はうまく動きます。 ×日本語が入ると駄目です。(/\A(.*?).受信者/usなど) sakuraの場合、パイプで動かすPHPファイルはEUC+LFでないと動きません。 なので $content_utf8 = mb_convert_encoding($content,"UTF-8","EUC-JP"); $patturn_utf8 = mb_convert_encoding("/\A(.*?)受信者/us","UTF-8","EUC-JP"); $c = preg_replace($patturn_utf8,"",$content_utf8); mb_send_mail("xxx@example.com","subject",$c); などとしていますが、駄目です。 preg_matchだとメールすら転送されません。 ※ヘッダーを削るだけならPEARもありだと思いますが、本文のもろもろを削るので、 PEARがあろうが、preg_replaceを使いたいことには変わりありません。 できればPEARはインストールしないでただの正規表現で行きたい、という段階です。 なにかヒントはありますでしょうか。 sakuraサーバー php/5.2.17 php-cgi PHPファイルはEUC+LF

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.1

> sakuraの場合、パイプで動かすPHPファイルはEUC+LFでないと動きません。 > なので > > $content_utf8 = mb_convert_encoding($content,"UTF-8","EUC-JP"); PHPファイルがEUCだからといって、 stdinから取り込んだ文字列がEUCに自動変換されている訳ではありません。 $c= mb_detect_encoding($content); mb_send_mail("xxx@example.com","subject",$c); して確認してみてはどうでしょう。

q0190dg
質問者

お礼

mb_detect_encodingが当たりました!!! ありがとうございます。 プロセスは回答いただいた通りなので特記しません。 その後、メールの整形で文字コードの変換をしまくってpreg_replaceを多様したら思い通りになりました。 とても助かりました。ありがとうございます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

他人から送られてくるメールのエンコードは何か指定できません 仕方ないので、まずはメールヘッダ内の Content_Transfer_Encoding を抽出して、その値でmv_convert_encodingしてみてください

q0190dg
質問者

お礼

なるほど! 確かにメールの文字コードまで考えていませんでした、、、 ありがとうございます。かなりの大大ヒントになりました!!! ※参照にきた方へ:文中のmv_convert_encodingはmb_convert_encodingっすね。

関連するQ&A

  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • preg_replaceの正規表現を教えて下さい。

    preg_replaceの正規表現を教えて下さい。 元:'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ' 後:'あいうえお<meta content=\"text/html; charset=utf-8" />かきくけこ' というように、charset= に続く部分を preg_replaceで置換したいのですが、スキル不足でできません。 $a = 'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ'; $p = "/<meta.*charset=([^\"']+)[^>]/i"; $x = preg_replace( $p, "utf-8", $a ); とやってみましたが、$xには、全く期待通りの結果は得られませんでした。 この置換を実現できる正規表現を教えて下さい。

    • ベストアンサー
    • PHP
  • PHPでの文字列置換について

    こんにちは PHPにて丸カッコ内の文字列を取得しようとしています。 対象の文字列は、「坂(さか)」という文字列の全角丸カッコ「()」内になります。 正規表現でやればすぐに取得できるのかもしれませんが、正規表現の知識が無いため 力ずくでやってみようとしました。 そこで、「(」で文字列の位置を取得して…と考えて色々やったのですが、 この全角丸カッコ「(」が、mb_strposでも位置を検知できず、 全角丸カッコ「(」を半角にして対応してみようかとmb_ereg_replace('(','(','坂倉武史(さかくらたけし)');としようとしても、変換されず困っております。 ちなみに「坂(さか)」という文字列は、 ネット上のあるHTMLから、file_get_contentsでURLを指定してから 取得して、その文字コードがEUC-JPなので、 mb_convert_encoding($dataXML, "UTF-8", "EUC-JP"); で、UTF-8に変更しております。 文字コードの問題のかもしれませんが、答えがみつかりません。 1。正規表現で取得できるのであれば、正規表現の書き方をお教えいただけますでしょうか。 2。正規表現が難しいのであれば、力ずくでやるのでこの「(」全角丸カッコの始まりの検知方法をお教えいただけますでしょうか。 PHPの実行環境は、 PHP5.3 mbstring.language  japanese mbstring.internal_encoding  UTF-8 mbstring.encoding_translation  ON default_charset  UTF-8 UNIX 文字コード UTF-8 ソース文字コード UTF-8 です どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで、HTMLメールの際のエラー

    HTMLメールを送る下記スクリプトにおきまして、管理人宛てのメール本文を 見ると、添付画像のように、生のHTML文のついたメールが届いてしまいます。 普通のHTMLメールにするには、どこがどう間違っているのか、ご指導いただき たいです。 ちなみにサーバーはさくらサーバーです。 --------------------------------------------------------------------------------------------------------------- ////////////////////////////////////////// // 新着口コミを管理人にメールで知らせる // ////////////////////////////////////////// $to = "~"; // 管理人宛て $mail_title = " ユーザーが新着口コミを投稿しました。"; $header = "From: ~ Content-Type:text/html; charset=ISO-2022-JP Content-Transfer-Encoding:8bit "; //$uniqid = uniqid(); $to = mb_convert_encoding($to, "UTF-8", "auto"); // $toは、自動的にエンコードされない。 $mail_title = mb_convert_encoding($mail_title, "UTF-8", "auto");    $html_header = '<!DOCTYPE html"><html><meta http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP"></head><body bgcolor="#FFFFCC">';    $html_footer = '</body></html>'; $comment_header = $username." 様\n\n口コミ店舗名:".$shopname."\n\n"; $comment = $html_header."\n\n".$comment_header.$comment."\n\n"; // $comment = str_replace("<br>", "\n", $comment); // $comment = mb_convert_encoding($comment, "UTF-8", "auto"); $comment_anchor = "<a href=\"http://~.com/tokyo/admin/kuchikomi_edit.php?title=".$title."&comment=".$comment_copy."&username=".$username."&shopname=".$shopname."\">口コミ編集</a>"; $comment_anchor = mb_convert_variables($comment_anchor, "UTF-8", $title, $comment_copy, $username, $shopname); $comment = $comment."\n\n".$comment_anchor.$html_footer; $comment = mb_convert_encoding($comment, "UTF-8", "auto"); $header = mb_convert_encoding($header, "UTF-8", "auto"); mb_send_mail($to, $mail_title, $comment, $header); // メール送信

    • ベストアンサー
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • mysql登録時の文字化け

    PHPで作成した登録フォームで入力されたデータをmysqlに登録すると、文字化けというか?になってしまいます。すべての文字を検証したわけではないのですが、どうも環境依存文字が?になってしまうようです。環境依存文字を登録するにはどうしたらいいでしょうか? ちなみに、現在の文字コードは HTMLの<head>の部分に<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> PHP開始時に mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ただし、PHPの設定ファイルがさわれないのでPHP使用時の内部文字コードは恐らくデフォルトのEUC mysqlの文字コードとしては、DB,テーブルともにutf8_unicode_ci ファイルの保存形式はutf-8(BOMなし) SQL文のデータ部分にmb_convert_encodingを使用 例: insert into test(test1,test2) values( mb_convert_encoding("テスト1","EUC-JP","UTF-8"), mb_convert_encoding("テスト2","EUC-JP","UTF-8")) よろしくお願いします

    • ベストアンサー
    • PHP
  • PHP + SQLite 文字化けについて

    SQLite と php5でデータベース管理画面を作っていますが、 日本では正常に表示されますが、 中国からアクセスすると文字化けしてしまいます。 文字はソース上で下記のように設定しています。 mb_convert_encoding($aaa,"SJIS","EUC-JP"); SQLiteが、SJISに対応していないと思い、 monospaceに変換するように下記のように変更しました。 mb_convert_encoding($aaa,"monospace","EUC-JP"); しかし、画面上で Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unknown encoding "monospace" in C:\Apache Group\Apache2\htdocs\aaa\aaa.php on line XXX と出ます。 なにか解決策をご存知の方いらっしゃいましたら お教えいただけると幸いです。 どうぞよろしくお願いいたします。 なお、ページ自体の文字設定は、 <meta http-equiv="Content-Type" content="text/html; charset=S-JIS">となっているところ、 ソース変更にともないこちらも、charset=monospace">と変更しました。

    • 締切済み
    • PHP
  • PHPの正規表現について

    // URLエンコード $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; これをPHPの関数を使った方法と使わなかった方法が知りたいです。 また、正規表現で、ereg.., preg.., mb_eregがありますが、この違いの詳細が知りたいです。

    • ベストアンサー
    • PHP
  • phpのmb_convert_encodingで文字化け

    phpのmb_convert_encodingで文字化け phpでmb_convert_encodingを使用してSJISよりUTF-8にエンコーディングしています。 ところが、“(”や“?”などが1文字目に存在すると文字化けしてしまいます。 どのような原因が考えられますでしょうか? お願いいたします。

    • ベストアンサー
    • PHP
  • PHPスクリプトでエンコードエラー

    (http://c-php.mine.nu/)で配布されている「貼り付けアンケート」を設置したところ、以下のようなエラーが出ました。 Warning: mb_convert_encoding(): Illegal character encoding specified in /home/toraya-c/public_html/harituke/harituke.php on line 94 Warning: mb_convert_encoding(): Illegal character encoding specified in /home/toraya-c/public_html/harituke/harituke.php on line 95 Warning: mb_convert_encoding(): Illegal character encoding specified in /home/toraya-c/public_html/harituke/harituke.php on line 96 Fatal error: Call to undefined function: mb_check_encoding() in /home/toraya-c/public_html/harituke/harituke.php on line 140 エンコードがうまくいってないようなのですが。。 指定の行数の記述は以下です。 $title = mb_convert_encoding($title,'EUC-JP',$en); $body = mb_convert_encoding($body,'EUC-JP',$en); $quest = mb_convert_encoding($quest,'EUC-JP',$en); if(!mb_check_encoding($body,'EUC-JP') || mb_check_encoding($body,'ASCII')){ 配布されているものを特に変えず(設定部分以外)、そのままupしたつもりですが、エラーの原因がわかりません。 当方、php初心者なので的外れな質問でしたら申し訳ございませんが、よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう