API概要
配信リストのみ登録を行う
配信リストのみをAPI経由で登録します。
登録した配信リストに問題が無い場合3mailの画面に遷移し、その他の項目(メール本文等)の登録を行います。
リクエストURL
https://example.com/API/file_upload
※正式なURLは御契約後にご連絡致します。
リクエストパラメータ
パラメータ | データタイプ | 必須 | 説明 |
---|---|---|---|
login_id | string | ○ | ログイン用ID |
password | string | ○ | ログイン用パスワード |
file | file | ○ | 配信リスト(gzipかzipで圧縮した物) |
from_address | string | ○ | From(配信元)アドレス |
return_limit | int | 許可するリターン回数の上限(1から10まで:省略時=3) |
APIからのXMLについて
APIから送信されるXMLの書式は以下の通りとなります。
<?xml version="1.0" encoding="UTF-8"?> <response xmlns="urn:3hands:3mail"> <status>OK</status> //ステータス <code>205</code> //コード <message>success</message> //メッセージ <session>0dlj9483h8ay9fawf3h</session> //session値 </response>
サンプルスクリプト
<?php //APIへ送信するデータ //$_REQUESTの部分については、可能であれば$_POSTか$_GETを指定してください //今回はサンプルの為、汎用性を考えて$_REQUESTとします $post_data = array( "login_id" => "login@example.com", //ログインID "password" => "password", //ログインパスワード "from_address" => "info@example.com", //Fromアドレス "return_limit" => 3 //リターン回数の上限 ); //APIのHostを設定 $api_host = "example.com"; //APIのPathを設定 $api_path = "/API/file_upload"; //APIへ接続 $sp = fsockopen('ssl://' . $api_host, 443, $errno, $errstr, 30); //エラーチェック if(!$sp){ print $errno . "<br>" . $errstr; exit; } //boundary生成 $boundary = "-----" . md5(uniqid()); //header生成 $header = "POST " . $api_path . " HTTP/1.0\r\n"; $header .= "Host: " . $api_host . "\r\n"; $header .= "Content-type: multipart/form-data, boundary=" . $boundary . "\r\n"; $header .= "Referer: http://" . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . "\r\n"; $header .= "Accept: */*\r\n"; //body生成 $body = ""; //テキストデータをAPIへ送信できるように変換 foreach ($post_data as $key => $val){ if($val){ $body .= "--" . $boundary . "\r\n"; $body .= "Content-Disposition: form-data; name=\"" . $key . "\"\r\n"; $body .= "\r\n" . $val . "\r\n"; $body .= "--" . $boundary . "\r\n"; } } //ファイルデータをAPIへ送信できるように変換 $body .= "--" . $boundary . "\r\n"; $body .= "Content-Disposition: form-data; name=\"file\"; filename=\""; $body .= $_FILES['file']['name'] . "\"\r\n"; $body .= "Content-Type: " . $_FILES['file']['type'] . "\r\n\r\n"; $body .= "" . join("", file($_FILES['file']['tmp_name'])) . "\r\n"; $body .= "--" . $boundary . "\r\n"; //送信データ末尾の区切り文字を追加 $body .= "--" . $boundary . "--\r\n"; $body .= "\r\n\r\n"; //ヘッダーにデータ部のサイズを追加 $header .= "Content-length: " . strlen($body) . "\r\n\r\n"; //データ送信 fputs($sp, $header); fputs($sp, $body); //データ受信 $buf = ""; $response = fgets($sp); if (substr_count($response, "200 OK") > 0){ while (!feof($sp)){ $buf = $buf . fread($sp, 4096); } }else{ print "データ受信に失敗しました"; exit; } //接続終了 fclose($sp); //結果XMLを取得 $result = substr($buf, strpos($buf, "\r\n\r\n")+4); //XMLをパースする $result_xml = simplexml_load_string($result); //結果を取得し表示 print "status:" . $result_xml->status . "<br>"; //ステータス print "code:" . $result_xml->code . "<br>"; //コード print "message:" . $result_xml->message . "<br>"; //メッセージ print "session:" . $result_xml->session . "<br>"; //session名 exit; ?>
サンプルスクリプト解説
APIへ送信するデータ及び、APIのURLについて設定を行います。
//APIへ送信するデータ //$_REQUESTの部分については、可能であれば$_POSTか$_GETを指定してください //今回はサンプルの為、汎用性を考えて$_REQUESTとします $post_data = array( "login_id" => "login@example.com", //ログインID "password" => "password", //ログインパスワード "from_address" => "info@example.com", //Fromアドレス "return_limit" => 3 //リターン回数の上限 ); //APIのHostを設定 $api_host = "example.com"; //APIのPathを設定 $api_path = "/API/file_upload";
APIへソケットを使って接続を行います。
//APIへ接続 $sp = fsockopen('ssl://' . $api_host, 443, $errno, $errstr, 30); //エラーチェック if(!$sp){ print $errno . "<br>" . $errstr; exit; }
APIへ送信するデータの作成を行います。
//boundary生成 $boundary = "-----" . md5(uniqid()); //header生成 $header = "POST " . $api_path . " HTTP/1.0\r\n"; $header .= "Host: " . $api_host . "\r\n"; $header .= "Content-type: multipart/form-data, boundary=" . $boundary . "\r\n"; $header .= "Referer: http://" . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . "\r\n"; $header .= "Accept: */*\r\n"; //body生成 $body = ""; //テキストデータをAPIへ送信できるように変換 foreach ($post_data as $key => $val){ if($val){ $body .= "--" . $boundary . "\r\n"; $body .= "Content-Disposition: form-data; name=\"" . $key . "\"\r\n"; $body .= "\r\n" . $val . "\r\n"; $body .= "--" . $boundary . "\r\n"; } } //ファイルデータをAPIへ送信できるように変換 $body .= "--" . $boundary . "\r\n"; $body .= "Content-Disposition: form-data; name=\"file\"; filename=\""; $body .= $_FILES['file']['name'] . "\"\r\n"; $body .= "Content-Type: " . $_FILES['file']['type'] . "\r\n\r\n"; $body .= "" . join("", file($_FILES['file']['tmp_name'])) . "\r\n"; $body .= "--" . $boundary . "\r\n"; //送信データ末尾の区切り文字を追加 $body .= "--" . $boundary . "--\r\n"; $body .= "\r\n\r\n"; //ヘッダーにデータ部のサイズを追加 $header .= "Content-length: " . strlen($body) . "\r\n\r\n";
APIへデータの送信を行います。
//データ送信
fputs($sp, $header);
fputs($sp, $body);
データの受信を行います。
ヘッダーが "200 OK" 以外の場合はエラーとなります。
//データ受信 $buf = ""; $response = fgets($sp); if (substr_count($response, "200 OK") > 0){ while (!feof($sp)){ $buf = $buf . fread($sp, 4096); } }else{ print "データ受信に失敗しました"; exit; } //接続終了 fclose($sp);
受信したデータからXML部分のみを取得後パースを行います。
//結果XMLを取得 $result = substr($buf, strpos($buf, "\r\n\r\n")+4); //XMLをパースする $result_xml = simplexml_load_string($result);
結果の基本項目は以下の方法で取得できます。
今回はサンプルなので取得結果をそのまま表示します。
//結果を取得し表示 print "status:" . $result_xml->status . "<br>"; //ステータス print "code:" . $result_xml->code . "<br>"; //コード print "message:" . $result_xml->message . "<br>"; //メッセージ print "session:" . $result_xml->session . "<br>"; //session名
サンプルスクリプトの実行結果は以下の通りとなります。
status:OK code:205 message:success session:0dlj9483h8ay9fawf3h
スクリプト実行後の処理について
ステータスがOKだった場合、スリーメールの管理画面へ遷移する事ができるようになります。
//スリーメール管理画面へ遷移する
header("Location: http://example.com/API/file_forward?session=" . $result_xml->session);
以降(メールの本文登録等)の作業はスリーメールの管理画面を利用します。
配信ファイルが圧縮ファイル以外の場合について
配信リストがgzipファイル形式で無い(データベースから抽出した等)場合、以下の方法で圧縮されたファイルを作成する事ができます。
APIへ送信するデータを作成する部分に追加してください。
//$db_resultはデータベースからの検索結果 //データ形式は配列(array('test1@test.com','test2@test.com')と同じ)とする //仮ファイル名を作成 $file_name = md5(uniq_id()) . '.csv.gz'; //圧縮ファイルを作成。作成先は /tmp/ とする $zp = gzopen('/tmp/' . $file_name, "w9"); gzwrite($zp, implode("\n", $db_result); gzclose($zp); //作成したファイルを$_FILES変数に登録 $_FILES['file']['name'] = $file_name; $_FILES['file']['type'] = 'gzip'; $_FILES['file']['tmp_name'] = '/tmp/' . $file_name;