B3S
menu close

PHP

さくらサーバー上のMLリストとメンバーをPHPとFTP関数で頑張って取得する方法


はち

更新日:2021/08/05


さくらサーバーをレンタルしていると、どんなプランでも大概メール機能がついてくると思います。
メーリングリスト(以下ML)機能も併せてついてくるかと思いますが、MLのメンバー一覧などを管理しようと思うと、割と使い勝手の良くないコントロールパネルを経由するのが一般的かと思います。

今回はそのコントロールパネルを経由せずに、PHP上でMLリストやメンバーを取得する方法をご紹介します。

取得する方法について

1) コマンドラインで頑張る
2) FTPでファイルを持ってくる

スタンダードな方法で言えば、SSHにログインしてactivesコマンドなどを叩いたりして取るのが良いですが、今回の主目的は「MLの一覧」「配信先の一覧」を「PHPから取得」することなので、PHPのFTP関数を用いて、FTPに接続してファイルを持ってくる方法を試してみることとします。

インストールパスおよびフォルダ・ファイル構成について

さくらサーバーで運用されるMLは、FMLというMLサーバー上で構成されます。
■FML:http://www.fml.org/software/fml8/

インストールパス /fml
ML一覧 /fml/spool/ml/ の中のサブフォルダがML一覧
投稿可能なメンバー一覧 /fml/spool/ml/ML名/ の中のmembersファイルに記載
配信されるメンバー一覧 /fml/spool/ml/ML名/ の中のactivesファイルに記載

MLリストの取得

FTP関数の中にftp_nlist関数で、ファイル・フォルダの一覧が取得出来るので、それを使います。
※エラー処理はしていないのでtry、catchは適当に実装してください。

//接続用
$host = "ここに接続先アドレスを入力";
$port = 21;	//ポート番号
$timeout = 90;	//秒数
$conn = ftp_connect($host,$port,$timeout);
//ログイン
$user_name = "ユーザー名";
$user_pass = "パス";
$login_result = ftp_login($conn,$user_name,$user_pass);
//内容取得
$det = ftp_nlist($conn,"/fml/spool/ml/");
//出力してみる
var_dump($det);

MLメンバーの取得

前述の取得一覧から、今度はactivesファイルを開きます。
一覧は$det関数に押し込んであるので、そこからパスを形成したのち、ftp_get関数でファイルをローカルに取得。
取得したファイルをfopenで開く方法です(超古典的ですが…)

//取得したいファイル名
$getfilepath = $det[2].'/actives';
//保存したいファイル名
$localfilepath = "aaa.txt";
//取得する
ftp_get($conn,$getfilepath,$localfilepath,FTP_BINARY);
//クローズは忘れずに
ftp_close($conn);
//ファイルを開く処理
$fp = fopen($localfilepath,'r');
if($fp){
	//ファイルロックします
	if(flock($fp,LOCK_SH)){
		while(!feof($fp)){
			$buffer = fgets($fp);
			print($buffer.'<br/>');
		}
		//終わったらアンロックします
		flock($fp, LOCK_UN);
	}else{
		//ファイルロックできない場合はエラーメッセージ
		print('ファイルロック失敗');
	}
}
//ファイルを閉じます
fclose($fp);

あとは適当に$detをforeachで回すなりすれば良いと思います。

懸念点と注意事項

今回の実装処理では、ftp_nlistした際に、フォルダだけでなくファイルの一覧も取れてしまいます。
きっちりと実装しようと思うと、フォルダの一覧だけ取得するようなロジックに変更する必要があります。

実行イメージ

20150831_001