信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    AutoScaling環境のJenkinsからのデプロイ

    ひとつ前のエントリで、書いたとおりデプロイ環境を構築しております。 備忘録に記載いたします。 構成はこんな感じです。 やりたいことっていうのは、Jenkins環境からビルドぽちってすると、 Gitの最新が続々作成されるWeb01~web0nまで実行されるということ。 最初は以下のシンプルな流れを考えていました。 ① JenkinsはAmazonCLIより、今の最新のInstanceを取得する。 ② Jenkinsは取得したInstanceに対してSSHで接続し、GitPULLする ③ 新しく立ち上がるWEB0YはUserDataで立ち上がりに、GitCloneする。 前提条件としては、 AutoScarlingで立ち上がるサーバー上にJenkinsサーバーからSSHで接続できる。 その対象サーバーからGitに接続できるという状態です。 つまりAutoScarlingのAMIには上記の通り設定をいれておきましょう。 phpだけでデプロイを実行しているInstanceの取得部分だけをカスタマイズしてます。 Jenkinsはただ以下のShellをたたくだけ。 #!/bin/bash ## 環境変数を設定 export AWSCLI_SSH_KEY_FILE=/home/jenkins/.ssh/XXXXXX.pem export AWSCLI_SSH_USER="jenkins" export AWSCLI_SSH_HOST="XXXXXXXX" export AWSCLI_SSH_EXEC_FILE="/home/jenkins/get_PrivateIPs.sh" export PRIVATE_IP_ADDRESS_LIST=/home/jenkins/get_PrivateIPs.lst export DEPLOY_DATE=`date +"%Y%m%d_%H%M"` export DEPLOY_LOG=${DEPLOY_DATE}_deploy.log export DEPLOY_SSH_KEY_FILE=/home/jenkins/.ssh/XXXXXXXX2.pem export DEPLOY_SSH_USER="username2" export DEPLOY_SSH_HOST export DEPLOY_SSH_EXEC_FILE="cd /home/username2; git pull origin master" ## AWS CLI環境にSSH接続して、デプロイ対象サーバのリアルタイムなプライベートIPリストを作成 ssh -i ${AWSCLI_SSH_KEY_FILE} ${AWSCLI_SSH_USER}@${AWSCLI_SSH_HOST} ${AWSCLI_SSH_EXEC_FILE} > ${PRIVATE_IP_ADDRESS_LIST} echo ${PRIVATE_IP_ADDRESS_LIST} ## 上記のリストを詠込む cat ${PRIVATE_IP_ADDRESS_LIST} |while read DEPLOY_SSH_HOST do     ## デプロイ対象サーバにSSH接続して、GitのリモートリポジトリからPull     ssh -i ${DEPLOY_SSH_KEY_FILE} ${DEPLOY_SSH_USER}@${DEPLOY_SSH_HOST} "${DEPLOY_SSH_EXEC_FILE} >> ${DEPLOY_LOG}" done CLIサーバー側で呼ばれるスクリプトは以下の通りです。 #!/bin/bash ## 環境変数を設定 export AWS_HOME=${HOME}/aws export AWS_CONFIG_FILE=${AWS_HOME}/conf/awscli.conf ## [Auto Scaling Group] タグが「tagetname」になっているインスタンスのPrivateIPを表示する aws ec2 describe-instances --filters \ "Name=tag-key,Values=Auto Scaling Group" \ "Name=tag-value,Values=tagetname" \ |jq -r '.Reservations[].Instances[].NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress' これを実行すると、CLIサーバー側で取得した起動済みインスタンスの プライベートIPが XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX という感じで、改行されて「/home/jenkins/get_PrivateIPs.lst」に吐き出されます。 最初に実行した方のShellのこの部分でデプロイ対象サーバーにつないでPULL!!! cat ${PRIVATE_IP_ADDRESS_LIST} |while read DEPLOY_SSH_HOST do     ## デプロイ対象サーバにSSH接続して、GitのリモートリポジトリからPull     ssh -i ${DEPLOY_SSH_KEY_FILE} ${DEPLOY_SSH_USER}@${DEPLOY_SSH_HOST} "${DEPLOY_SSH_EXEC_FILE} >> ${DEPLOY_LOG}" done 一応これで、望む動作はできるようになりましたが、まだ色々問題があります。 (GitPULLしているだけなので、Git使いの人はいろいろ想像できるでしょうね) そこで、ここからさらにCapistranoとの連携を考えてみます。 基本、対象サーバーをJenkinsからビルド実行された際に取得できるというところまでできました。 通常capistranoは実行サーバーでのroleの指定をしますが、 その際に、 role :remote, "user@XXX.XXX.XXX.XXX","user@XXX.XXX.XXX.XXX" 上記のような指定を行っています。Staging.rbかProduction.rbを開くとこのようになっているはずです。 今回は上記のroleを動的に設定したいので、このように書きなおしました。 set :remote_user,"user" set :filename ,"/home/Jenkins/get_PrivateIPs.lst" $ip = Array.new File.readlines(filename).each do |row|   $ip << "#{remote_user}" + "@" + row.chomp end role :remote do   $ip.each {|target|} end 最初 role :remote, "user@XXX.XXX.XXX.XXX","user@XXX.XXX.XXX.XXX" になればいいんだったら role :remote, $ip.join(",") これでいけんじゃないの?と思ったんですけど、動的にかえてやる場合は role :remote do   $ip.each {|target|} end こんな風にブロック単位にしてやらないといけないみたいですね。 これにより ① CLIよりインスタンスのIPを取得しLISTに吐き出し ② Jenkinsは今の最新をGitより取得しCapistranoRepを生成 ③ WEB01~WEB0Xに対してCapistranoを送る みたいな流れになりました。 AWSはいろんなことが出来て面白いです。 CapistranoのDeploy.rbに関しては、それぞれの環境があると思いますので、 公開していませんが、AutoAcaling環境でデプロイ作成なさっている方は たくさんいらっしゃると思うので、是非こんな構成も参考にしてみて下さい! 今回PrivateIPでつないでいることで、Capistranoからの高速デプロイが実現しています。 今まで数分かかっていたファイルの移動がわずか5秒程度で実行されます。快適!!! ■参考サイトはこちら http://dev.classmethod.jp/cloud/auto-scaling-deploy-userdata-capistrano/ http://qiita.com/mychaelstyle/items/a550d4a0658c87c1ff30 http://sil.hatenablog.com/entry/jenkins-github-auto-deploy
  • テクログ

    SSHでつないでる時は、777にしちゃだめ!

    パグです。こんにちわ。 今Jenkins+capistranoを使用してautoscaling のEc2環境に 自動デプロイしようという、絶賛環境構築中にタイトルの通り非常に 初歩的なミスではまりました。 一通り設定をおえて、はい、もっかい頭から環境構築をためそ~ と思っていて・・・。 rm -rf /home/user-dir mkdir /home/user-dir 新しいDIRを作成して、その後 chmod 777 /home/user-dir ←はい、これがもうだめ chown user:group user-dir cd /home/user-dir mkdir .ssh chmod 700 ./.ssh chown user:group ./.ssh cd .ssh vi ./authorized_keys ↑にJenkins側のpublic-keyを記入 Jenkins側で秘密鍵を指定して・・・ eval `ssh-agent` ssh-add /home/user/.ssh/id_rsa はい!!!!!できたーーーーーーーー!!!! と自信満々に ssh user@remotehost はい!エラー Permission denied (publickey,gssapi-keyex,gssapi-with-mic). え?何?え?さっきつながったやん・・・!ためしに秘密鍵を指定してみる。 ssh -i /home/user/.ssh/id_rsa user@remotehost はい!エラー!!!!!!!!!!!! Permission denied (publickey,gssapi-keyex,gssapi-with-mic). つらい・・・!! 詳細ログをはかせてトライ ssh -vvv -i /home/user/.ssh/id_rsa user@remotehost はい!エラー!!!!!!!!!!!! Permission denied (publickey,gssapi-keyex,gssapi-with-mic). うああああああああああああああああああああああああああ!!!!!! 取り急ぎ接続先の 「.ssh」と「authorized_keys」の権限を確認⇒OK 接続元の 「id_rsa」の権限を確認⇒OK そして、なきながらhomeにもどってきて確認すると・・・ user-dirが777のフルオープンになってることに気付くのでした。 chmod 700 /home/user-dir ためしに「.ssh」と同権限にしたところ、無事つながりました。 うっうっ・・・・理解が浅いからこうなるんだ・・・!! 「SSHでつなぎたい人は、User-DIRの権限もちゃんと確認しましょう」 ということを自戒の念も込めてここに記しておきます。 ではではパグでした~~~!!!
  • テクログ

    AJAXって非同期通信じゃないの?

    こんにちわ。パグ(▼・(エ)・▼)です。 連投よっしゃ。 最近AJAXって非同期じゃなくても通信できるようになってるらしいので、 そんな内容で書きます。 そもそもAJAXってなんだろうって所なんですけど、 http://ja.wikipedia.org/wiki/Ajax ウィキペディアから持ってきました。 【Ajax(エイジャックス、アジャックス、アヤックス[要出典])は、 ウェブブラウザ内で非同期通信とインターフェイスの構築などを行う技術の総称。 XMLHttpRequest(HTTP通信を行うためのJavaScript組み込みクラス)による 非同期通信を利用し、通信結果に応じてダイナミックHTMLで 動的にページの一部を書き換えるというアプローチを取る。】 はい!わかりにくい!! 私が非同期じゃないじゃん!!って疑問に思ってたのは、AJAXの中でも、 Jqueryの$.ajaxってメソッドのことです。 そもそもウィキペディアを読んでもよくわからない人向けに WEBのことを簡単に説明すると、AJAXっていうのは、 フォームを「submit」しなくても、一部だけ通信と再表示ができる技術の総称です。 WEBっていうのは、画面のsubmit をしたときに、POSTやGETで通信をして、 対象画面を呼び出して(まるまる更新して) 処理を連続させるのが一般的ですが、 一部分だけ更新したい場合があった場合、画面全体は更新かけたくないんだけど、 一部分だけ、別処理したい。 そんなときにその箇所だけifreameでいちいち作るのは、 面倒だしデザイン的におかしくなったり・・・問題がいっぱい。 「そんな時に便利なのが、AJAXです。」 たとえば、 上のチェックボックスを選択すると、 下のリストにDBから選択したチェックボックスに応じて表示をしたい。 でもリストだけ変えたいだけなので、 submitして画面全体を再描画するのは、ひどく非効率的です。 「そんな時に便利なのが、AJAXです。」 たとえば、 ファイルアップロードして、 今アップロードしているファイルを確認画面に遷移せずに 今の画面に表示させたい。 「そんな時に便利なのが、AJAXです。」 はい。AJAXのことわかってきましたか? 非同期通信じゃなくて、文字列処理とか、jsで苦手な部分はASPやPHPでやって~ んでJqueryに戻すってのも、$.ajaxならできちゃうんです!!!!! そういった処理を行う際に、JQueryの$.ajaxを使うことがあります。 ほかにも$.postとか$fileとかいろいろありますが、 今回はシンプルに$.ajax。 私の改修したプログラムの場合(簡易に書いてます) $function(){ $("#button").click{ text1がエラーの場合return false; text2がエラーの場合return false; /************ここから追加した部分↓↓ 両方Trueの場合{ $.ajax{ ここで処理 } return ture; } /************ここから追加した部分↑↑ } }); 上記の様な状態になっておりました。 外部APIに接続するために、Jsでエラーチェックをして、エラーだった場合、 return false;をして、Formの送信をキャンセルしているって言う状態。 当然ですが、$.ajaxの処理が終わる前に、 return trueされてしまうと、submitが走ってしまい、 外部APIに接続され、Form自体がなくなってしまいます。 すると、$.ajaxの処理が途中でキャンセルされ、処理が最後まで行われません。 通信状態にもよりますが、$.ajaxが終わるまで処理はまってはくれないのです。 大概Return のが早いです。 こんなときに便利なのが「$.ajax」を「同期」にして、処理を行うという方法。 リスクとしては、「$.ajax」内で行っている処理が無限ループしてしまった場合など、 起動時画面がロックされてしまい、固まった状態で止まってしまうことです。 ですが、$.ajaxを同期通信にすれば、$.ajaxが終わるまで、処理は次にはいきません。 よって、$.ajaxで呼び出している処理が終わるまで、次の処理は走らないのです。 今回はメール送信処理で、そんな状態には陥らないので、「同期」にして処理しました。 書き方としては、以下 $.ajax({ async:false, contentType: "application/x-www-form-urlencoded; charset=utf-8", url: "path/XXX.php", type: "POST", data: { XXX:'XX' } }); async:falseをfalseにするだけ。 tureにすると非同期になりますが、デフォルトtrueなので、書く必要ないかと思います。 $.ajaxで連鎖させたいなら、 complete内で、fanctionを作ってやる必要があるかと思いますが、 画面に戻さないで、先に処理したいときになんかは特におすすめの処理方法です。 たまに、AJAXがぜんぜん呼び出されなくて・・・とはまりまくってる人がおりますが、 そんなときはFireFoxのFireBugでコンソールを見てみてください。 「Firebugコンソールのすべて」で 「POST http://XXXX/XXXXX」200」 AJAX通信は成功しています。つまりJavascriptでの記述ミスはないわけです。 つぎにエラーでJsエラーがでているとき、 これはJavascipt側でエラーが出ています。Jsファイルを見直してください。 「POST http://XXXX/XXXXX」404」のときは、ファイルが見つかってません。 AJAXで処理したいファイルをjs側で指定していると思いますが、 ここの記述が間違っています。 最後に「POST http://XXXX/XXXXX」500」が出ている場合、 これは確実に、内部サーバーエラーつまり呼び出し先のプログラムのミスでしょう。 ちなみにPOSTが送られているかどうかもFireBugでみることが可能です。 POST通信の場合POSTというタブが表示されるので、POSTでパラメータ値が表示されていれば、 大概送れてはいます。もし、ここが、空白の場合、 それは、文字化けして送れてない可能性があります。Jquery側の設定や、Form、ファイルの 文字コードを調べましょう。 ではFireBugのPOSTで表示されているのに、呼び出し先で受け取れない場合、 呼び出し先ファイルの文字コードを疑いましょう。 AJAX通信ときくと、ちょっと難しそう・・・と思われガチですが、 FireFox+Firebugで開発途中の問題の切り分けは簡単にできますし、 Jqueryを使えばなれると簡単にしかもぬるぬる動くWEBサイトが作れます。 ぜひ敬遠せずに使ってみてください★ では、パグでしたぁ~ヽ(・∀・)ノばいばいぷぅ☆ミ
  • テクログ

    スマホのモバイルシミュレーターの使い方

    こんにちわ。パグ(▼・(エ)・▼)です。 暑いです。暑くて溶けそう。溶けそうで、定期的に更新しようと 思っていた技術ブログを溜め込んでいたので放出します。 最近はスマートフォン対応というものがWEBでは多くて、 PC用画面をスマホ用にするやつです。 お客様によっては1px程度の調整を要求される場合もあったり・・・ 画面デザインのテストで、CSSの確認をしたい時に、 FTPでサーバーにあげて・・・テスト端末で開いて・・・ って手順はとても面倒です。そんな時にはシミュレーターを使いましょう。 勿論、シミュレーターなので、実機でみると画面が崩れた! なんて事もあります。 が、しかし、 正しいCSSで組んであれば、 実はシミュレーターでも崩れませんし、実機でも崩れません。 画面崩れを指摘すると、 「シミュレーター側で崩れているのは、実機では大丈夫です!」と 自信ありげに答える子が多いですが、多少の崩れはあるものの、 実は、シミュレーターで崩れないものは、 様々な機種で試しても、崩れない状態の事が多いのです。 また逆もしかりで、シミュレーターで崩れてなかったのに、 実機で見ると崩れるっていうのはCSSが適切に組めていない証拠です。 (ややマージンがずれてるとかは勿論ありますが) ロジック側のコーダーはCSS+HTMLのプロではないので、 CSSが苦手な人が多いので、裏側の複雑なロジックはさくっと組めるのに、 CSS+HTMLに鬼はまりして時間が経過していったりします。 iphoneでは~なのに、Andoridでは~なった・・・ っていうのは、実際シミュレーターで見てみると、 ぐちゃぐちゃ・・・なんて事が多いです。 適切なCSSの組み方をして、あらゆるシミュレーターで確認したものを、 実機で確認すると、シミュレーターと実機、iphoneとAndoroidの見た目に、 大きな差が出ないと思いますよ! 実際デザイナーさんに組んで頂いたCSSは大抵シミュレーターでの 崩れはほとんどありません。 それが、開発課とデザイン課の差か!!!と思うほど。 そんな訳で、私もやや複雑なデザインを組む時は、シミュレーターで しっかり表示される状態にしてから、実機で微調整を行います。 では、シミュレーターの使い方です。 まず、FireFoxの場合、 ツールのアドオンからアドオンの入手で、 Firebugをインストール そうすると、ツール内にFireMobileSimulator というものが入るので、そこから見たい端末にしてクリック。 もうスマートフォンの見た目になります。 次にSafariです。シミュレータでは最も秀逸かもしれません。 大規模なSP開発の際は必ず使用しています。 ブラウザの幅によって、表示がされるので、ブラウザ幅の縮尺で、 縦のデザイン、横のデザインの確認が可能です。 safariのシミュレーターは編集>設定>詳細のタブで、 メニューバーに開発メニューを表示を押します。 そして、開発メニューが表示されますので、ユーザーエージェントから 端末を選択します。 縦横もブラウザ幅で確認できます~。 最後にChromeです。 Chromeはちょっと分かりにくい所にあります。 F12キーを押して開発用のメニューを開いてください。 その後右下にあるねじのマークをクリック overrides>UserAgentを選択します。すると、表示がかわります。 FireFoxのシミュレーターはCSS3に弱いので、ドロップシャドウなんかが うまくでませんが、Safariのシミュレーターだとちゃんと表示されます。 また角丸なんかも、Safariのシミュレーターのが良いようです。 逆にFireFoxではfloatを使った時のイメージがしっかりでるようです。 floatごりごりの画面の微調整は、FireFoxで行っています。 実機で、うまく表示「できてるように見える」要素の組み方をせず、 きちんと要素ごとの位置を決めてあげて、古い機種、新しい機種でも 崩れないものを作りたいときは、是非、 色々なエージェントで試してみて、最終的なテストは実機で行って、 開発効率をあげてくださいね★。 では、パグでしたぁ~ヽ(・∀・)ノばいばいぷぅ☆ミ
  • テクログ

    GitBashが日本語化してなくて困った。

    こんにちわ。パグ(▼・(エ)・▼)です。 次回もメールの解析するよって言ってから3ヶ月位書いてなかった間に 書く事忘れちゃった(・∀・)ニコッ なので、今日はGitさんについて書きます。 Gitさんとは、ファイル管理ツールのことをいいます。SVNとかVSSみたいな 類のものだと考えて下さい。 Git自体はもちろんCommandにて操作しますが、これにはSVNとかVSSみたいな GUIがたくさん用意されています。 私は、GitExtentionsというツールをつかって、Gitの操作をしています。 まずは、GitExtentionsをみてみます。 赤く「master」 ってなっているのが、ローカル環境のリポジトリ。「origin/master 」ってなっているのが、 サーバー環境のリポジトリです。 こんな風にGitExtentionsは、プログラムのツリーを可視化してくれる便利なツールです。 Gitコマンドっていうところを選択すると、自分で打ち込まなくても、ブランチの削除が可能です。 とっても便利なので、まさか、リモート側のリポジトリを削除するのが、そんなに大変だと思っていませんでした。 ですが、このGitExtentions,GUIで削除処理ができるのが、ローカルだけなのです。 (push とか pullとかはできる・・・。) Gitコマンド> ブランチの削除> ブランチを削除すると、赤の項目(ローカル)リポジトリが消えます。 ローカルの削除がおわったら、GitBashを開いて 「git branch -a」と試してみます。 ①となっているのが、今自分が居るブランチ。 下の枠線でかこっているRemotes/origin/突発対応って書いているのが、消したいブランチです。 まずGitBashの画面外を右クリックすると、メニューが出てくるので、編集から範囲指定をクリック!! すると、範囲が選べるようになるので、ここで範囲選択してコピー。 コピーできたら、もう一回画面外を右クリックで編集>貼り付けが選べるようになっているので、貼り付け。 そうするとやっとコピペが!!! なんだ、コピペしただけじゃんと思ったそこのあなた!!!実はこのGitBash、コピペが日本語名だと文字化けしちゃうんです。 ただでさえめんどくさいこのコピペ作業。 更に日本語が文字化け・・・・・・ ( ^ω^)・・・ 以下は公式じゃないようなので、自己責任でお願いします。 参考にしたのはこちらのサイト様 http://takanosho.wordpress.com/2012/04/12/git-utf8-input-japanese/ 手順は 1.http://sourceforge.net/projects/mingw/files/MSYS/Base/msys-core/msys-1.0.17-1/msysCORE-1.0.17-1-msys-1.0.17-bin.tar.lzma/download ここからGitGoreをダウンロード 2, msysCORE-1.0.17-1-msys-1.0.17-bin.tarを7zipで解凍、いっかいで解凍できなかったらもっかい解凍。 3, binDIRの中にある、msys-1.0.dllをC:Program FilesGitbinの下のmsys-1.0.dllと置き換え(元のはバックアップを取るのを推奨) 4, 環境変数HOME に「C:Program FilesGitetc」追加 5,C:Program FilesGitetc のinputrcを、 # disable/enable 8bit input set meta-flag on set input-meta on set output-meta on set convert-meta off に変更。 6,GitExtentions再起動。なんか聞かれるけどOKで起動。(HOMEDIRのConfigこれでOK?みたいな意のこと) 7,GitBashから日本語打ったりもできるね!! なんていうか、もうさ、7zipで二回解凍したり、dll置き換えたり環境変数設定したり めんどくさっヽ(`Д´)ノ!!!!! でも無事、日本語のブランチ消せるようになったので(・∀・) しばらくは、元に戻して、誤って日本語ブランチ切っちゃったときだけ、 これでGitBashを日本語対応にします( ^ω^)・・・ いじょー( ´・ω・`)ノ~バイバイぷぅ
  • テクログ

    受信メールの解析について3

    こんにちわ。パグ(▼・(エ)・▼)です。最近眠くて、起きててもずっと眠くて なんかもう、あれだなって思ってます。 前回から数ヶ月空いちゃいました・・・。 受信メールの解析についての2では ファイル名の取り出し方、とシングル、マルチで判定しない解析について書きました。 今回はデコレーションメールについて書いてゆきたいと思います。 そもそもデコレーションメールって何かというと、ガラケーから始まったと思うんですけど、 背景の色を変えられたり、オリジナリティのある絵文字が送れたり、文字が 流れたり・・・。 そんな効果が付けられるメールですね。 本文にいくら、色々な効果がついていようと、メールの解析を行うと、 もちろん文字を文字として、プログラムで処理が可能なのですが、厄介なのは、 デコレーション絵文字です。 前回も記述致しましたが、デコレーション絵文字は、その他の添付ファイルと 異なり、他キャリアでも判別出来るようにIDがついています。 それが、content-idです。実際にメールデータを開いてみるとこんな感じ ------H512QGEWMMP2EIEQNFP3 Content-Type: IMAGE/GIF;  name="dp_01_01_001.gif" Content-Transfer-Encoding: base64 Content-ID: <01@121009.040620> Content-Disposition: inline;  filename="dp_01_01_001.gif" R0lGODlhPwAUAKIGAP9LS/8pKf9qpv9AjP+vz////////wAAACH/C05FVFNDQVBFMi4wAwEAAAAh <以下省略> これが、content-idです。 Content-ID: <01@121009.040620> 前回のブログのこの部分であるかどうかの判定を行っています。 foreach($decoder->headers as $key => $headers){ if ($key == "content-id") { $content_id = $headers; break; } } content-idがあるってことは、デコレーション絵文字なんだなと判別できるからです。 ですが、勿論例外というものがあります。(メールの企画統一してよ(・。・)ぼそ・・・) --URVP4gBk Content-Type: application/x-shockwave-flash;  name="fdecoflash019.swf" Content-Transfer-Encoding: base64 RldTCE0ZAABoABhgAAYYAAAPcgBEEQAAAABDAv///z8DHQAAAJYXAABoaWdoAABTZXRRdWFsaXR5 <以下省略> 上記のパターンです!!みるからにheader部にcontent-idが存在しません。 でも、これはれっきとしたデコレーション絵文字なんです。 DoXXmo様そろそろ規格をご統一いただけると・・・・。そう、DoXXmo様から出ているガラケーの とある機種だとこのように、デコレーション絵文字(動くもの)に関してcontent-idが入りません。 動くもの、だからではなく、とある機種のとある絵文字と考えてください。 こんなとき、どこからデコレーション絵文字かどうかを判別するかというと・・・ --gSmSufMk Content-Type: text/html; charset="iso-2022-jp" Content-Transfer-Encoding: quoted-printable =   --gSmSufMk-- この部分です!! これはtext/htmlなので、メール本文、ということになります。 メール本文をhtml形式で送った場合にtext/htmlという箇所にこのように、 画像の配置などが記述されます、ここで、cid:を見つけられるかどうかで、 デコレーション絵文字の判別ができます。 いくら、デコレーション絵文字を送っても、ちっともその処理に行き着かなかったため、 さぐっていくと、content-idがないデコレーション絵文字があるということを発見しました。 メールも色々なキャリアやPC、モバイルで変わるので受信処理というのは非常に 頭を悩ませます・・・。 はい、では今回はこれ位で~次回はデコレーション絵文字の落とし穴について書きました~。 次回は、文字化けしちゃうメールについて書きます☆。 次回ブログアップはいつになることやら~。 ではでは、パグでしたぁ~ヽ(・∀・)ノばいばいぷぅ☆ミ