2009年9月30日水曜日

【PHP】Zend_Mailを使ってメールを送信する(SMTP)(日本語対応)

Zend_Mailを使ってメールを受信する方法。今度はメールを送信してみたときのメモ。

Zend Frameworkのバージョンは1.9.2

サンプルコードは次のような感じ。そのまま貼り付けているので、各メソッドに渡すパラメータは適宜書き換える必要有り。基本は公式ドキュメントを参考に。

require_once('Zend/Mail.php');
$objMail = new Zend_Mail('ISO-2022-JP');
$objMail->setFrom($aMail['from']['address']);
$objMail->addTo($aMail['to']['address']);
foreach ($aMail['cc'] as $aItem) {
    $objMail->addCc($aItem['address']);
}
foreach ($aMail['bcc'] as $aItem) {
    $objMail->addBcc($aItem['address']);
}
$objMail->setSubject(MailUtil::getEncodeString($aMail['subject']));
$objMail->setBodyText(MailUtil::getEncodeString($aMail['body']));
$objMail->send();
class MailUtil
{

    /**
     * メール送信用にISO-2022-JPエンコードする
     *
     * @param  string $sString     エンコード文字列
     * @param  string $sFromEncode 元の文字コード
     * @return string              エンコードした結果
     */
    public static function getEncodeString($sString, $sFromEncode='UTF-8')
    {
        if (strlen($sFromEncode) == 0) {
            $sFromEncode = 'UTF-8';
        }
        return mb_convert_encoding($sString, 'ISO-2022-JP', $sFromEncode);
    }
}

.NETで送信したときはAUの携帯の文字化けで嵌ったけど、これは大丈夫かな・・・。試してないけど・・・。

 

<関連リンク>

2009年9月29日火曜日

【PHP】Zend_Mailを使ってメールを受信する(POP3)(日本語対応)

Zend FrameworkZend_Mailを使って、メールの受信を実装したときのメモ。

Zend_MailはGoogle先生に聞いてみると、ソースをいじらないと日本語に対応できないというお答えが返ってくるので、ちょっと嫌な感じはしたけど、実際やってみたらソースに手を加えずに受信も送信もできた。

Zend Frameworkのバージョンは1.9.2

メール受信するサンプルコードは次のような感じ。

$mail = new Zend_Mail_Storage_Pop3(array('host'     => 'localhost',
                                         'user'     => 'test',
                                         'password' => 'test'));

echo $mail->countMessages() . " messages found\n";
foreach ($mail as $message) {
    echo "Mail from '{$message->from}': {$message->subject}\n";
}

この辺は公式マニュアルを読んだ方が分かりやすい。

件名が文字化けするのは内部エンコードに問題があるらしいので、次のような感じでデコードする。

    /**
     * メールの件名をdecodeする
     *
     * @param  string $sSubject エンコードされた件名
     * @param  string $sEncode  最後にエンコードする文字コード
     * @return string           デコードした件名
     */
    public static function decodeSubject($sSubject, $sEncode = 'UTF-8')
    {
        $sReturn = '';
        //内部エンコーディングをJISにしないと文字化けする
        $sTemp = mb_internal_encoding();
        mb_internal_encoding('JIS');
        $sReturn = mb_decode_mimeheader($sSubject);
        mb_internal_encoding($sTemp);
        //指定した文字コードでエンコードし直す
        if (strlen($sEncode) > 0) {
            $sReturn = mb_convert_encoding($sReturn, $sEncode, 'JIS');
        }
        return $sReturn;
    }

メール本文を取得するときは次のような感じ。

    /**
     * メールの本文を取得(decode)する
     *
     * @param  object $objMessage Zend_Mail_Message
     * @param  string $sEncode    最後にエンコードする文字コード
     * @return string             デコードした本文
     */
    public static function getContent($objMessage, $sEncode = 'UTF-8')
    {
        $sReturn = '';
        $iCount = $objMessage->countParts();
        if ($iCount > 0) {
            for ($i=1; $i<=$iCount; $i++ ){
                $objPart = $objMessage->getPart($i);
                // テキスト部分のみ抽出する
                if (strtok($objPart->contentType, ';') == 'text/plain')  {
                    $sReturn = $objPart->getContent();
                    break;
                }
            }
        } else {
            // テキスト部分のみ抽出する(softbank携帯は件名と画像だけの場合Multipartにならない場合がある)
            if (strtok($objMessage->contentType, ';') == 'text/plain')  {
                $sReturn = $objMessage->getContent();
            }
        }
        $sReturn = mb_convert_encoding($sReturn, $sEncode, 'ISO-2022-JP');
        return $sReturn;
    }

from句からメールアドレスだけを取り出すときはPEARのMailパッケージに含まれているRFC822を使うと簡単にできるらしい。

こんな感じ。

    /**
     * メールアドレスを解析して生のメールアドレス配列で返す
     *
     * @param  string $sAddress メールアドレス
     * @return array            メールアドレスを格納した配列
     */
    public static function getAddressList($sAddress)
    {
        $aReturn = array();
        $aList = Mail_RFC822::parseAddressList($sAddress);
        foreach ($aList as $objItem) {
            $aReturn[] = $objItem->mailbox . '@' . $objItem->host;
        }
        return $aReturn;
    }

メールに添付されている画像を抜き出すのも作ったけど、それはまた今度。

次回はZend_Mailを使ってメールを送信。

ちなみにメールサーバーにメールがあるかどうかはtelnetで接続して、コマンドを発行すれば分かる。詳細は前の記事を参考に。

よく使うpop3コマンドは

user <ユーザーアカウント>
pass <パスワード>
list
top 1 10
dele 1
quit

listでメールボックスの一覧を表示して、topコマンドで先頭の10行を表示。deleコマンドはメールの削除。

 

<2009/10/27 追記>
quoted_printable_decodeで受信したメッセージをデコードしてたけど、いらないみたい。

2009年9月28日月曜日

【Icecast】別ポートでIcecastサーバーを複数起動する

Icecastを複数起動して、管理画面も別のアドレスで参照したかったので設定したメモ。

icecastのインストールの仕方は前の記事を参考に。以下は既にicecastのコンパイルとインストールが終わっている前提。

ポート8001用のicecastにする場合は次のようにする。

プログラムをコピーする
# cp /usr/local/bin/icecast /usr/local/bin/icecast8001

起動スクリプトをicecast8001用に書き換える

#!/bin/sh
#
# icecast      This shell script takes care of starting and stopping
#              the icecast multimedia streaming systen.
#
# chkconfig: - 85 15
# description: icecast is a multimedia streaming daemon. It is used to \
#              relay and offer multimedia streaming content.
# processname: icecast
# pidfile: /var/run/icecast/icecast.pid

DAEMON=/usr/local/bin/icecast8001
CONFIGFILE="/usr/local/etc/icecast8001.xml"
LOCKFILE="/var/lock/subsys/icecast8001"
PIDNAME=icecast8001

# Source function library.
. /etc/rc.d/init.d/functions

[ -x $DAEMON ] || exit 0

# See how we were called.
case "$1" in
  start)
	# Start daemon.
	echo -n $"Starting $PIDNAME streaming daemon: "
	daemon "$DAEMON -b -c $CONFIGFILE > /dev/null"
	RETVAL=$?
	echo
	[ $RETVAL -eq 0 ] && touch $LOCKFILE
	;;
  stop)
	# Stop daemon.
	echo -n $"Shutting down $PIDNAME streaming daemon: "
	killproc $PIDNAME
	RETVAL=$?
	echo
	[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
	;;
  status)
	status $PIDNAME
	RETVAL=$?
	;;
  restart)
	$0 stop
	$0 start
	;;
  reload)
	echo -n $"Reloading $PIDNAME: "
	killproc $PIDNAME -HUP
	RETVAL=$?
	echo
	;;
  condrestart)
        [ -f $LOCKFILE ] && restart || :
        ;;
  *)
	echo $"Usage: $0 {start|stop|status|restart|reload}"
	RETVAL=1
	;;
esac

exit $RETVAL

このファイルを/etc/rc.d/init.d/に保存する。

設定ファイルをコピーして8001用に編集する

# cp /usr/local/etc/icecast.xml /usr/local/etc/icecast8001.xml
# vi /usr/local/etc/icecast8001.xml

    <listen-socket>
        <port>8001</port>
    </listen-socket>
    <paths>
        <webroot>/usr/local/share/icecast8001/web</webroot>
        <adminroot>/usr/local/share/icecast8001/admin</adminroot>
    </paths>
    <logging>
        <accesslog>access8001.log</accesslog>
        <errorlog>error8001.log</errorlog>
    </logging>

管理画面用のXSLTファイルをコピーする。
# cp /usr/local/share/icecast /usr/local/share/icecast8001

起動してみる。
# /etc/rc.d/init.d/icecast8001 start

プロセスを確認してみる。
# ps -A | grep icecast

8001のポートを空けるのを忘れずに。

 

<関連リンク>

【Icecast】出力されるstream_startのフォーマットを変更する
【Linux】Icecast serverのクライアントIceSをコンパイル、インストール
Icecast + winamp + edcastで音声のストリーミング(ラジオ局)
Icecastのコンパイルとインストール

2009年9月25日金曜日

【Icecast】出力されるstream_startのフォーマットを変更する

Icecastの管理画面を見やすくしようとxsltをいじっていたときのメモ。

Icecastのコンパイルとインストールは前の記事を参照。

ストリーミングが開始された時間はstream_startという属性にもっているのだけど、これが「Sun, 23 Sep 2009 08:01:01 +8000」というような表示なので見やすくない。

これをxsltでうまいこと表示させようと思ったけど大変そうだったので、ソースを変更することにした。

変更するのは、icecast-2.3.2/src/stats.cの586行目あたり

    //strftime (buffer, sizeof (buffer), "%a, %d %b %Y %H:%M:%S %z", &local);
    strftime (buffer, sizeof (buffer), "%Y/%m/%d %H:%M:%S", &local);

編集したら再コンパイルとインストールする。icecast.xmlは上書きされない。

これで「2009/09/23 08:01:01」という感じで表示されるようになる。

strftimeの詳細はこちらを参考に。

 

関連リンク

【Linux】Icecast serverのクライアントIceSをコンパイル、インストール
Icecast + winamp + edcastで音声のストリーミング(ラジオ局)
Icecastのコンパイルとインストール

2009年9月24日木曜日

円とスリランカ ルピーを両替する

調べたときのメモ。

時間と両替する場所によって変わるけど、目安として知っておくと便利。

YAHOO! FINANCEのページが分かりやすい(計算しやすい)。

2009年9月17日木曜日

.htaccessで特定のファイルだけ参照不可(禁止)にする

XMLファイルに設定情報を記述すると読みやすいけど、ファイルのアドレスを指定されると外部から参照できてしまうので、どうしようかなと思ったときのメモ。

.htaccessが使えるなら特定のファイルだけ参照できないように設定が可能。

xmlだけ参照不可にする場合は次のように記述する

<Files ~ "\.xml$">
  deny from all
</Files>

詳しくはここのサイトを参考に。

.htaccessはほとんどのレンタルサーバーで使えると思うけど、自前のサーバーの場合はAllowOverride Allの設定を忘れずに

Alias /site /opt/www/
<Directory "/opt/www/">
   AllowOverride All
   Order allow,deny
   Allow from all
</Directory>

前の記事も参考に。

.htaccessと.htpasswdで簡易ユーザ認証

Googleカレンダーにicalを読み込ませるapacheの設定を前に書いたので、そっちも参考になるかも。

GoogleカレンダーにだけiCal形式のファイル参照を許可する

2009年9月14日月曜日

【Linux】Icecast serverのクライアントIceSをコンパイル、インストール

前の記事で音楽(mp3など)ファイルをストリーミング配信(インターネットラジオ)するIcecastのコンパイルとインストールを書いたけど、そのIcecast Serverに接続してストリーミング配信の設定するクライアントユーティリティIceSをコンパイル、インストールしてみた。

環境はCentOS 5.3

ちなみにWindows環境でwinampからIcecast Serverに接続する方法はこちらの記事を参考に。

ソースをここからダウンロード→解凍→コンパイル→インストール。コンパイルに必要なソフトはicecast serverをインストールした記事を参考に。

# tar xzvf ices-2.0.1.tar.gz
# cd ices-2.0.1
# ./configure
# make
# make install

/usr/local/bin/icesと/usr/local/share/iceができる。

/usr/local/share/iceに簡単なマニュアルと設定サンプルXMLが配置される。

例えば/opt/musicディレクトリに配信したい音楽ファイルを置いてストリーミング配信したい場合は次のような感じ。

プレイリストを作成
# find /opt/music/ -iname "*.mp3" > /opt/music/playlist.txt

/usr/local/share/ices/ices-playlist.xmlを編集
# vi /usr/local/share/ices/ices-playlist.xml

<input>
    <param name="file">/opt/music/playlist.txt</param>
</input>

<instance>
    <password>password</password>
</instance>

パスワードはicecast.xmlのsource-passwordタグで設定した値を記述。

ログファイル置き場を作ってなかったら作成
# mkdir /var/log/ices

これでストリーミング開始
# ices /usr/local/share/ices/ices-playlist.xml

icecast serverにアクセスすると、なんか再生している感じ。

image

でもログファイルをみると次のようなエラーが出ている。

[2009-09-14  18:16:51] INFO playlist-builtin/playlist_read Currently playing "/opt/music/sample2.mp3"
[2009-09-14  18:16:51] WARN playlist-builtin/playlist_read Corrupt or missing data in file (/opt/music/sample2.mp3)

調べてみると、ices2はmp3に対応してないらしい。ogg形式のみ。思いっきりダウンロードサイトに書いてあった。

icesを止めるときは
# killall ices

しょうがないのでices0をダウンロード→インストール。

# tar xzvf ices-0.4.tar.gz
# cd ices-0.4
# ./configure
# make
# make install

/usr/local/bin/icesとマニュアルが/usr/local/doc/ices/にできる。

設定ファイルは/usr/local/etc/ices.conf.distをコピーして作成。

# cp /usr/local/etc/ices.conf.dist /usr/local/etc/ices.conf
# vi /usr/local/etc/ices.conf

<Playlist>
  <File>/opt/music/playlist.txt</File>
</Playlist>

<Server>
    <Password>password</Password>
</Server>

作っておいたプレイリストを指定してices実行
# ices

成功すると下のように表示される。

image

icecast serverにアクセスすると次のような画面

image

ちゃんとストリーミング再生されている。

サーバーの状態をみてもほとんど負荷になってない感じ。ices2だと100%近かったので断然ices0の方が良い。

ices.confの設定は見ればなんとなく分かると思う。その辺はまた今度。

2009年9月8日火曜日

オンラインストレージをネットワークドライブとしてマウントする

Gladinet Cloud Desktopというソフトを使うと無料でSkyDriveなどのオンラインストレージをネットワークドライブとしてマウントできることを知った。

ダウンロードはここから。

フリーのstarterをダウンロード→インストールする。

英語だけど直感的に分かる。

ローカルのファイルと変わらずに操作できるので便利。日本語も文字化けせずに表示できる。

image

今まで使いこなせてなかったGoogle DocsとSkyDriveをフル活用できそうな予感。

簡易的なバックアップツールとして役に立ってくれそう。

2009年9月7日月曜日

Webページを高速化するためのメモ

便利なライブラリや動画に潜むWebデザインの3つの罠」を読んで有用な情報があったのでメモ。

便利に使っているjQueryも記述の仕方で速度が変わってくるので、普段から意識してプログラミングしなければならない。

jQuery を高速に使う CSS セレクタの書き方

あと、

  • CSSはソースコードの上部に記述する
  • JavaScriptはソースコードの下部に記述する

など、おもしろい記事があったので一度読んでおくといいかも。

Webページを速く見せるための5つのちょっとした工夫

2009年9月4日金曜日

ラオウを愛するすべての人へ

何となく北斗の拳が見たくなって検索してみると劇場版やOVAでいろんなエピソードが制作されていることを知った。

特にラオウを愛する私としては見なければならないのはこれ。

 

北斗の拳 ラオウ外伝 天の覇王

真救世主伝説 北斗の拳 ラオウ伝 激闘の章

 

ラオウ外伝は第1話からラオウの絶大な強さに感動する。

「己の道は曲げぬ。曲げれば天が笑う。」

それでこそラオウ。

覇道を貫くその生き様に惚れる。

 

明日からの合宿でゴウショウハを練習してきます。

2009年9月3日木曜日

GoogleカレンダーにだけiCal形式のファイル参照を許可する

webdavで管理しているicalファイルを外から見えないようにしたいけど、Googleカレンダーには許可したかっので調べたメモ。

文字化けする問題は前の記事を参照。

Google カレンダー(の「URLで追加」)は認証に対応してないので、Googleからのアクセスだけサーバーの設定で許可するように設定。

ちなみにGoogleカレンダーでicalを指定する場合は「URLで追加」からicalへのURLを指定する。

次がapacheのconfファイル例。webdavの設定は前の記事を参考に。

  Alias /ical "/opt/ical"
  DavLockDB "/tmp/DavLock"

  <Directory "/opt/ical">
    Dav On
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 192.168.0 google.com googlebot.com
  </Directory>

「googlebot.com」ドメインからのアクセスを許可すればo.k.

apacheの設定をする前に「追加」をやってしまうと、次からはキャッシュを参照するようになるので、同じアドレスで指定しても、しばらくは「URLが無効です。」みたいなエラーメッセージが表示され登録できない。

そんなときはだいたい1時間後ぐらいにもう一度やってみるとうまくいく。

<2009/12/8 追記>
Googleカレンダーにだけは公開して、他のical形式は認証をつけるために設定を変えたのでメモ。

  <Directory "/opt/webdav">
    Dav On
    <Files ~ "\.ics$">
      AuthType Basic
      AuthName "Exbridge ical Secret Zone"
      AuthUserFile /opt/lampp/etc/conf.d/.htpasswd
      Require valid-user
    </Files>
    <Files ~ "\.php$">
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1 192.168. google.com googlebot.com
    </Files>
  </Directory>

 

▼関連記事

Google カレンダーでiCal形式を読み込むと文字化け
.htaccessで特定のファイルだけ参照不可(禁止)にする

2009年9月2日水曜日

【Linux】マシンの負荷やトラフィックをグラフ化する「Munin」をインストール

マシンが使用しているネットワークの帯域を知りたくて、簡単に表示できるソフトがないかなと探していたら辿りついた「Munin(ムニン)」。本家

グラフ化できるのは、ディスクの使用量、CPU使用率、メモリ使用率など。さらにプラグインで簡単に拡張できるのでいろんな情報をグラフ化してWebで参照できる。

[Gigazine]MRTGよりお手軽に負荷やトラフィックをグラフ化できる「Munin」

デモサイト

これをPHPとうまいこと連携できないかなと思い、とりあえずインストールしてみた。

環境はCentOS5.3

インストールは簡単でyum経由でできる。今回は監視サーバーと対象クライアントが同じなので両方インストール。
# yum install munin munin-node

依存関係で結構多くのパッケージがインストールされる。

image

/etc/munin/munin.confを編集してhtmlデータ格納ディレクトリを変更。この辺は環境に合わせて設定。
# vi /etc/munin/munin.conf

htmldir    /opt/munin

コピーして権限の設定
# /bin/cp -fr /var/www/munin/* /opt/munin/
# chown -R munin. /opt/munin/

インストールすると自動でcronに登録されるので、実行される間隔などを変更したい場合は/etc/cron.d/muninを変更。

情報を収集するクライアントの起動
# /etc/rc.d/init.d/munin-node start

自動起動の登録
# chkconfig munin-node on

次はapacheの設定。インストールすると/etc/httpd/conf.d/munin.confにファイルが生成されるけど、私の環境はlamppで構成されているので、このファイルを参考に設定。

#
# munin
#
ScriptAlias /munin/cgi/ /opt/munin/cgi/
Alias /munin/ /opt/munin/

lamppのリロード。
# /etc/rc.d/init.d/lampp reload

これで設定したaliasにブラウザでアクセスすれば見れるはず。

image

image

監視クライアントを増やしていくのも簡単そう。

プラグインと/etc/munin/templatesにあるxmlファイルを編集すれば、日本語化も難しくなさそう。

2009年9月1日火曜日

【Xampp】MySQLのsocketの場所を変更

Xampp for linux(lampp)を利用していて、lamppで動いているMySQLのsocketの場所を変更したときのメモ。

socketの場所はmy.confで設定。lamppの場合は/opt/lampp/etc/my.cnf

#socket        = /opt/lampp/var/mysql/mysql.sock
socket        = /tmp/mysql.sock

これでlamppを再起動
# /etc/rc.d/init.d/lampp restart

ちなみにソケットの場所を確認する場合は
# mysqladmin variables | grep socket

lamppのphpMyAdminが次のエラーで動かなくなるので

#2002 - サーバが応答しません (あるいはローカルの MySQL サーバのソケットが正しく設定されていません)

設定ファイルを修正する

# vi  /opt/lampp/phpmyadmin/config.inc.php

$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['socket'] = '/tmp/mysql.sock';

を追記する。サービスの再起動は必要なし。

さらに他のMySQLを使うシステムも動かなくなるので、php.iniに記述されているMySQLのsocketの場所を指定する必要あり。

pdo_mysql.default_socket=/tmp/mysql.sock

mysql.default_socket =/tmp/mysql.sock

mysqli.default_socket =/tmp/mysql.sock

3カ所修正してlamppのリロード
# /etc/rc.d/init.d/lampp reload

Related Posts Plugin for WordPress, Blogger...

Blog Archives