スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

添付ファイル名が文字化けする。シングルコーテーションがアンダーバーに変わってしまう。

JPHPMailerで送信したところ、
添付ファイル名が文字化けしたり、他の文字に置き換わったりする。

日本語が入ったファイル名の一部が文字化けしたり、
シングルコーテーションがアンダーバーに置き換わったりする。

原因は、メールサービス側にあった。

今回、メール送信先をyahoo!としていたが、yahoo!の注意書きとして、
2バイト文字を使用した場合、文字化けする事があるという注意書きがある。
これに該当したものと思われる。

Gmailで受信、または、メーラー(Bekky!)でYahoo!メールを受信したときは、
問題がなかった。

今回、ブラウザ上でメールを受信していたが、このときに現象が発生していたところから、
Webメール上の問題と判断した。

この件については、AP側では対処なしとする。

2010/12/10追記
この問題は、さくらインターネットのウェブメールでも発生した。

いろいろと調べてみると、phpmailerに使用されている命令の内、
basefilename関数のバグによるものもあるようである。

参考URL
blog.jojo.jp/

上記の内容によると、PHP5では対応の予定がないようなので、
他の方法で代用するしかないようである。
(PHP6で対応予定)



スポンサーサイト

Mercuryを使用して自宅からメールを送信しようとしてもメールが送信されない

Mercuryを使用して自宅からメールを送信しようとしてもメールが送信されない。
スクールからは可能。

原因は、プロバイダーのOP25Bによるブロック。

Marcuryの設定を変更することでも可能であるが、
スクールと自宅では設定の変更を行わなければならず、
これでは不便である。

そのため、自宅では、Radishとsendまねーるによる環境を構築し、
こちらで行うこととした。

参考URL
blog.quall.net/program/52/
(OP25Bによるブロック)
homepage1.nifty.com/yito/anhttpd/faq/op25b.html


JPHPMailerで添付ファイル名が文字化けする。

原因は、エンコードミス。

処理の流れとして、アップロードしたファイルを一時的にapache上の一時ファイルフォルダに格納し、
さらに、move_uploaded_fileでファイル名を付け替えて
格納しなおしているが、このときに、添付ファイル名が文字化けしていた。
このため、メールに添付したファイル名も文字化けしていた。

格納し直し時にSJISにエンコードすることにより解決した。

JPHPMailerで添付したはずの添付ファイルが添付されない。

原因は、添付ファイル名のエンコードミス。

apache上の一時ファイルフォルダへ格納するときは、SJISでエンコードしていたが、
添付するときにJISでエンコードしていたため、ファイル名が正しくエンコードされず、
添付ファイルが認識できなかった。そのため、ファイルがないものとしてみなされ、
添付されなかった。

正しくエンコード(SJIS)することにより、添付されるようになった。


JPHPMailerコーディング例

function thyen_sendmail(){
   
 //jphpmailerの格納位置により変更する。
 //さらに、jphpmailer.php内のclass.phpmailer.phpへのパスも格納位置により変更する。
    require("../php/jphpmailer/jphpmailer.php");
   
     //言語設定、内部エンコーディングを指定する
     mb_language("japanese");
  //内部エンコーディングを指定する。(phpソースの保存コードに合わせること)
     mb_internal_encoding("UTF-8");
     //日本語添付メールを送る
     $to = thyenpack_send_email; //宛先
     $subject = mb_convert_encoding("\\1000パック注文メール","JIS"); //題名(Subject)
     
     // メール本文
     $msg = "【注文者名】:".$_SESSION["thyenord"]["fname"]." ".$_SESSION["thyenord"]["name"]."(".$_SESSION["thyenord"]["kana_fname"]." ".$_SESSION["thyenord"]["kana_name"].")"."\r\n";
     $msg = $msg."【住所】:".$_SESSION["thyenord"]["zip_code1"]."-".$_SESSION["thyenord"]["zip_code2"]."\r\n";
     $msg = $msg.$_SESSION["thyenord"]["metro_dist"] .$_SESSION["thyenord"]["address"]."\r\n";
     $msg = $msg."【電話番号】:".$_SESSION["thyenord"]["tel_arcode"]."-".$_SESSION["thyenord"]["tel_pri1"]."-".$_SESSION["thyenord"]["tel_pri2"]."\r\n";
     $msg = $msg."【撮影パターン】:";
     switch ($_SESSION["thyenord"]["pattern"]) {
        case "omakase":
            $msg = $msg."おまかせ"."\r\n";
            break;
        case "pt1":
            $msg = $msg."パターン1(白背景角版)"."\r\n";
            break;
        case "pt2":
            $msg = $msg."パターン2(グレー背景角版)"."\r\n";
            break;
     }
     $msg = mb_convert_encoding($msg."【備考】:".$_SESSION["thyenord"]["comment"],"JIS");
     
     $from = mb_convert_encoding($_SESSION["thyenord"]["email_1"],"JIS"); //差出人
     $fromname = mb_convert_encoding($_SESSION["thyenord"]["fname"]." ".$_SESSION["thyenord"]["name"],"JIS"); //差し出し人名
     $attachfile1 = dirname($_SESSION["attach_temp_path"])."/attach/".mb_convert_encoding($_SESSION["thyenord"]["attach"],"SJIS"); //添付ファイルパス
     
     $mail = new JPHPMailer();
     $mail->addTo($to);
     $mail->setFrom($from,$fromname);
     $mail->setSubject($subject);
     $mail->setBody($msg);
     $mail->CharSet = "iso-2022-jp";
     $mail->Encoding = "7bit";
     // 添付ファイル追加
     $mail->addAttachment($attachfile1);
     
     // メール送信
     if (!$mail->send()){
       print("メール送信処理に失敗しました(送信失敗)sts=".$mail->getErrorMessage());
     }else{
       print("メール送信処理成功 sts=".$mail->getErrorMessage());
         
     }

}

JPHPMailerで文字化けする。

原因は、文字コードの設定ミス。

mb_internal_encodingの部分が"EUC-JP"になっていたのと
JISコードに変換をかけていなかったため、文字化けした。

対応としては、mb_internal_encodingで内部エンコーディングを設定する
(ソースの保存コードに合わせる)
Subjectなどの文字部分については、mb_convert_encodingを使用して
JISコードに変換するようにする。

次のコーディング例とあわせて参照のこと。


Marcury(メールサーバ)を立ち上げるとページが表示されない。

原因は、php.iniの設定。

sendmail_pathのコメントアウトをはずすこと。

参考URL
www.bpsinc.jp/blog/archives/tag/xampp


2010/6/23追記
上記の対処を行ったのにもかかわらず、現象が再現した。
再度調査を行ったところ、php.iniの設定に追加が必要であることが判明した。
(以下参照)

[mail function]
; For Win32 only.
SMTP =localhost
smtp_port = 25

上記のSMTPの部分を使用するSMTPサーバ名にする。
現時点では、smtp.mail.yahoo.co.jpを指定。

上記の結果、解消した。

参考URL
www.onlineconsultant.jp/pukiwiki/index.php

ローカル環境上でメールが送信できない

原因は、メールサーバーが立ち上がっていなかったため。

ローカル上でメールを送信するためには、radishなどのメールサーバソフトが必要になる。
ただ、xamppには、mercuryというメールサーバソフトがついているので、
これが使用できる。

使用前に設定の必要があるので、以下に従って、設定を行う。

■Mercuryの設定

・XAMPPコントロールパネルからMercuryを起動します

・Mercuryの管理ツールを起動します

・Mercuryの管理ツールのメニューからConfiguration>MercuryS SMTP Serverを開きます

・ダイアログのConnection controlタブの下の方にあるチェックボックスで「Do not permit SMTP relaying og non-local mail」
と「Authenticated SMTP connections may relay mail」のチェックを外します

参考URL
q.hatena.ne.jp/1207709781
mizushima.ne.jp/Windows/Mail/Mercury/Mercury-setting.php

input textareaやtype=textで定義されたエリアに\を入力すると\\となる

原因は、php.iniの設定。

マジッククォート(magic_quotes_gpc)が有効になっているため。
(magic_quotes_gpc = On)

テスト環境上では、Onになっていたため上記現象が発生した。

これがOnになっていると、\,',""は、自動的にエスケープされる。

セキュリティを意識した設定では、Offの方がよいとされている。
現在、レンタルしているサーバ上ではOffにしている。

magic_quotes_gpcについては、PHP 5.3.0以降では非推奨となっている。
そのため、Offにすることとする。

参考URL
nyx.pu1.net/practice/form/form3.html

session変数が受け渡されない

二つの画面があり、片方の画面で入力した値を
別の画面で表示させようとしたところ、表示されない。

原因は、表示する側のhtmlに、session_start関数が記述されていなかったため。

記述する事により、表示された。

特定のセッションを削除する方法

unset関数を使用する。


記述
unset(削除したいセッション);

参考URL
oshiete.goo.ne.jp/qa/3474510.html

www.phpbook.jp/tutorial/session/index3.html


次画面への遷移を行おうとしたところ、Warning: Cannot modify header information - headers already sent by・・・が表示される。

ヘッダエラー

今回は、画面遷移を行うときに、header関数を使用しているが、
header関数は実行前に何かしらの出力が行われていると
(改行、空白を含む)エラーになる。

ただし、php.iniのoutput_bufferingをOnに設定すると
回避が可能である。(デフォルトはOff)

今回は、output_bufferingをOnにすることにより、回避した。

参考URL
q.hatena.ne.jp/1168608777
(output_bufferingをOnをする以外の回避策の記載がある。)

go4it.seesaa.net/article/73726670.html
(php.iniのoutput_bufferingに関する記述)


カナ入力に限定する方法

mb_ereg("[ァ-ヶー]+$",$str)

上記でも可能であるが、mb_ereg_marchでもよい。

参考URL
cn.vitalify.jp/index.php

都道府県リストコーディング一例

入力フォームなどで、都道府県をリストで選択させる場合
オウンコーディングでは、リロードやsubmitを行った場合、
選択されたものが無効になってしまう。

そこで、選択されたものが保持されるように、以下のコーディングを行う必要がある。

/*
    都道府県リスト作成処理(pref_create)
    input:
        選択状態にする都道府県
    output:
        なし
   
*/
function pref_list_create($arg_pref){
    //都道府県リスト
    $menu_array = array('都道府県を選択','北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県',
                        '群馬県','埼玉県','千葉県','東京都','神奈川県','山梨県','長野県','新潟県','富山県','石川県','福井県',
                        '岐阜県',' 静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県',
                        '島根県','岡山県 ','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県',
                        '熊本県','大分県','宮崎県 ','鹿児島県','沖縄県');
   
    //メニューの名前
    $menu_name = "metro_dist";
   
    //都道府県リスト編集処理
    $menu_tag = pref_list_edit($menu_array, $menu_name, $arg_pref);
   
    //出力
    print($menu_tag);
}

/*
    都道府県リスト編集処理(pref_list_edit)
    input:
        都道府県リスト
        作成するリストの名前(select nameの部分)
        選択状態にする対象(省略可)
    output:
        都道府県リスト
*/
function pref_list_edit($arg_array,$arg_name,$arg_sel_value = "") {

    $m_tag = "";
   
    //パラメータ値のチェック
    if (!is_array($arg_array) || empty($arg_array) || empty($arg_name)) {
      return $m_tag;
    }

    $m_tag .= '<select name="' . $arg_name . '">';
    foreach ($arg_array as $key => $value) {
        $m_tag .= '<option value="' . $value . '"';
        //選択状態にするか調べる
        if ($value == $arg_sel_value) {
          $m_tag .= ' selected';
        }
        $m_tag .= '>' . $value . '</option>';
    }
    $m_tag .= '</select>';

    return $m_tag;
}

ユーザ定義関数のpref_list_createの$arg_prefには、
選択状態にしたい都道府県名を漢字で指定する。

メニューの名前は任意とする。

参考URL
shoyu-ramen23.jugem.jp/

配列に値がセットされているかどうかを調べる

count関数を使用する。

参考URL
www.sound-f.com/memo/category/php

$_FILESが取得できない。

原因は。パンチミス。

formタグのenctype=をnctypeとパンチしていたため。

enctypeに修正する。

PHPでTEL、郵便番号をチェックする(正規表現)

phpspot.net/php/pg%82o%82g%82o%81%95%90%B3%8BK%95%5C%8C%BB.html

www.se-land.com/chapter.php
(今回はこちらを参考にした)


Firefoxで参照ボタンのURL入力欄をCSSで装飾出来ない。

これは、Firefoxの仕様のようである。

参考URL
oshiete1.watch.impress.co.jp/qa3866805.html
www.k-jouhou.info/~kanri-gamen/css/preview/file.html

上記のURL(http://www.k-jouhou.info/~kanri-gamen/css/preview/file.html)
を参照すると、Firefoxでは、CSSで指定しても一部の属性は無効になっているのがわかる。

ただ、Ver.1.5のころは、反映されていたのがわかる。
このことから、仕様と判断する。


ieでformのtype=fileを使用したとき、size指定が効かない

本現象は、FireFoxでは発生しない。

原因は、cssでwidthを指定していたため。
指定をはずしたところ、正常に動作した。

IEで、InputBoxと説明文がずれる

IEで、InputBoxと説明文がずれる。
FireFoxでは正常に表示される。

[IE]
inputboxと説明文のピッチが合わない(IE)
 
[FireFox]
 inputboxと説明文のピッチが合わない(Firefox)
姓名の部分が、IEだと下にずれているのに対し、FireFoxでは、inputboxとそろって表示される。

原因は、IEのバグ?
inputboxのcssに、vertical-align:middle;を指定したところ、解消した。

middle以外にも、%やemで調整する方法もある。

参考URL
blogs.dion.ne.jp/kotemaru/archives/8998592.html
(ここの例は、topで解消している)




Firefoxで、tableタグのthに、display:blockを指定すると、rowspanを指定した部分が無効になる。

下記現象が発生する。
(「撮影パターン」の下に、本来ならば右側のCellに表示されるべき内容が表示されてしまう)
firefox_Block指定時現象

IE7では、問題なく表示される。

原因は、CSSの実装の違い。(IEのバグ)
Firefoxの表示が本来の表示となる。

「display : block;」は、CSS level 2では、それを指定した要素をブロックレベル要素にするという意味である。
th,trは、ブロックレベル要素とはなっていないため、表の行にはならず、ブロックレベル要素として表示されるのが正しい
ことになります。したがって、Firefoxの表示はは正しいことになります。
表の行として表示させるには、display:table-row;を指定します。

ただ、display:table-row;はIE非対応のため、IEでは、display:block;で同様な効果になります。

回避策としては、上記のように指定するか、block要素での指定をやめ、他の方法での表示を考慮する。
今回については、「必須」マークをth要素の右上に配置したいがために、絶対配置を使用して行おうとしたが、
これをやめ、floatを指定する方法で回避することとする。

今回のケースでは、table-rowを指定しても回避できなかった。

参考URL
www.h-fj.com/blog/archives/2007/05/06-134912.php

DreamweberでJQuery APIのコード補完を行う方法

http://nakajiman.blogspot.com/2009/01/dreamweaver-jquery-api-jquery-api.html

PHPでブラウザのバージョンを取得する方法

$_SERVER["HTTP_USER_AGENT"]を使用する事で取得可能。
ただし、一工夫必要となる。

上記変数には、以下のようにセットされる。

FireFoxの時

Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 ( .NET CLR 3.5.30729)

IE6の時

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; GTB6.4; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)

IE6であるかどうかを判断するためには、MSIE 6.0があるかどうかを調べる必要が発生する。

strpos関数を使用して取得可能である。


リストタグで(ul内のli)画像を中央に表示させる方法

以下のコーディングを行う。
今回は、cssにdisplay:table-cellを使用しているが、IE6,7ではサポートされていないため、
IE用にcssを別に記述する必要がある。

htmlの<head>に以下のcssを記述する。
<link href="../css/common.css" rel="stylesheet" type="text/css" />(通常CSS)
<link href="../css/thyen.css" rel="stylesheet" type="text/css" />(通常CSS)
<!--[if gte IE 6]><link rel="stylesheet" href="../css/thyen_forie6-7.css" type="text/css" /><![endif]-->(IE6,7用)

htmlコーディングは、以下のようにする。(必要部分抜粋)
                <div id="thyen_pht_sample_photo" class="com_clearfix">
                    <ul>
                      <li>撮影サンプル1</li>
                        <li class="thyen_sample_photo_img">
                        <!--[if gte IE 6]><span></span><![endif]-->
                        <a href="../images/pht_1000yen_sample_photo1.jpg" title="&yen;1000パック撮影パターン サンプル1">
                            <img src="../images/ico_1000yen_sample_photo1.jpg" width="129" height="120" alt="1000パック撮影パターン サンプル1" /></a></li>
                        <li>白背景角版</li>
                    </ul>
                    <ul id="thyen_sample_photo_padding_left">
                      <li>撮影サンプル2</li>
                      <?php
                          // ブラウザ判定  IE6
                        $browser1 = strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 6.0");
                          // ブラウザ判定  IE7
                        $browser2 = strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 7.0");
                        // IE以外の時、または、IE8以降の時
                        if ($browser1 === false and $browser2 === false) {
                            print <<<EOF
                            <li class="thyen_sample_photo_img">
EOF;
                        }else{
                            print <<<EOF
                            <li class="thyen_sample_photo_img2">
EOF;
                        }
                      ?>
                        <!--[if gte IE 6]><span></span><![endif]-->
                        <a href="../images/pht_1000yen_sample_photo2.jpg" title="&yen;1000パック撮影パターン サンプル2">
                            <img src="../images/ico_1000yen_sample_photo2.jpg" width="120" height="78" alt="1000パック撮影パターン サンプル2" /></a></li>
                        <li>グレー背景角版</li>
                  </ul>
              </div>

CSS上は、以下のようにする。
CSSは、IE用と、それ以外のブラウザ用とで分ける必要がある。

[IE以外用]
/* 2.撮影方法・サンプル */
#thyen_pht_sample {
    padding:0px 20px 0px 20px;
}

/* 2.撮影方法・サンプル */
#thyen_pht_sample p {
    padding-bottom:15px;
}

/* 2.撮影方法・サンプルul */
#thyen_pht_sample ul#thyen_pht_list {
    padding:0px 0px 15px 30px;
}

/* 2.撮影方法・サンプルli */
#thyen_pht_sample ul#thyen_pht_list li {
    list-style-type:disc;
}

/* 2.撮影方法・サンプル 文章*/
#thyen_pht_sample ul li p {
    padding:15px 0px 15px 15px;
}

/* 2.撮影方法・サンプル サンプル写真 */
#thyen_pht_sample_photo {
    padding:0px 0px 15px 85px;
}

/* 2.撮影方法・サンプル サンプル写真 */
#thyen_pht_sample #thyen_pht_sample_photo ul {
    padding-right:45px;
    float:left;
}

/* 2.撮影方法・サンプル サンプル写真の右側のみはpadding-leftを0にする。 */
#thyen_pht_sample #thyen_pht_sample_photo ul#thyen_sample_photo_padding_left {
    padding-left:0px;
}

/* 2.撮影方法・サンプル サンプル写真説明 border */
#thyen_pht_sample #thyen_pht_sample_photo ul li {
    border:#999999 solid 1px;
    width:150px;
    height:30px;
    text-align:center;
    line-height:30px;
}

/* 2.撮影方法・サンプル サンプル写真 border */
#thyen_pht_sample #thyen_pht_sample_photo ul li.thyen_sample_photo_img {
    border-left:#999999 solid 1px;
    border-right:#999999 solid 1px;
    display: table-cell;
    width:150px;
    height:150px;
    vertical-align: middle;
    text-align: center;
}

[IE用]
/* 2.撮影方法・サンプル サンプル写真 (白背景角版)*/
#thyen_pht_sample #thyen_pht_sample_photo ul li.thyen_sample_photo_img {
    padding:16px 10px 16px 11px;
    width:129px;
    height:120px;
    vertical-align: middle;
    zoom: 1;
}

/* 2.撮影方法・サンプル サンプル写真 (グレー背景角版)*/
#thyen_pht_sample #thyen_pht_sample_photo ul li.thyen_sample_photo_img2 {
    padding:35px 15px 35px 15px;
    width:120px;
    height:78px;
    vertical-align: middle;
    zoom: 1;
}

IE用は必要部分のみの記述となる。それ以外は、IE以外用のCSSと共用。
IE用では、同等な機能を実現するために、画像の周りにpaddingをつけて
画像をセンタリングさせるようにしているが、今回は、縦位置と横位置のため、
それぞれ専用のCSSを記述している。

IE用のCSSがそれ以外のCSSを適用する判定はPHPのサーバ変数である。
HTTP_USER_AGENTを利用して判定している。

FireFox

ulで画像を中央に表示させる方法(Firefox)


IE

ulで画像を中央に表示させる方法(ie)





参考URL
css-eblog.com/csstechnique/img-center.html


条件付きコメントについて(for IE)

allabout.co.jp/gm/gc/23921/2/
プロフィール

e.swan

Author:e.swan
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。