ConohaでPHPからメールアドレスを作る方法(作ると同時に転送設定も)
スポンサーリンク

Conohaのメールサービス便利ですねぇ~。(よくサービス障害が起こるのがんんんん、、て感じですが)
レンタルサーバでWebサーバとメールがセットになっているのが一般的ですが、メール機能だけ欲しい場合にかなり便利。
そんなこんなで、メールシステムとしてよく使うConohaのメールサービスですがAPI経由でメールアドレスが作れたりいろんなことができるので今回はメールアドレス作成APIで、Web画面からメールアドレス作成+転送設定をするプログラムを作りました。
[参照]
自動実行作成 - Mail API v1.0 / ConoHa API
準備
対象のメールサービス契約+ドメイン割り当て
手順は割愛します。
API有効化
conohaでAPIを使うユーザを作成、作成された内容を控えます。ログインすると、左メニューにAPIってのがあるので、それをクリックしてユーザを作ります。
作ったら以下の情報がでるので控えます。
・テナントID
・APIユーザ名
・APIユーザパスワード
・エンドポイント>Mail Service
あと、作りたいメルアドのドメインIDを取得しないといけないので以下をお手本に取得します。
ConoHa の メール API でアドレスの登録・一覧・削除をする。 - Qiita
・ドメインID
それぞれ、こんな感じでConfigとかに書いておきます。
conoha_ep_token: "https://identity.tyo1.conoha.io/v2.0/tokens"
conoha_ep_email: "https://mail-hosting.tyo1.conoha.io/v1/emails"
conoha_ep_forwarding: "https://mail-hosting.tyo1.conoha.io/v1/forwarding"
conoha_tenant_id: "xxxxxxxxx"
conoha_username: "xxxxxxxxx"
conoha_password: "xxxxxxxxx"
conoha_domain_id: ""
プログラム
フロントからajaxで命令して、以下のバックエンドのコード処理する感じです。例ではSymfonyでやっているのでSymfonyの書き方で書いてます。
public function emailCreateAction(Request $request)
{
$prefix = '作りたいメールアドレスの@前の部分';
$address = '';
if($prefix){
//トークンは3日ぐらいしか有効じゃないので、処理するたびトークンを取ってきます。
$token = $this->getConohaAPIToken();
if(property_exists($token,'error')) {
$error = 500;
$message = $token->error->message;
}else{
//メールアドレス作成処理
try{
$emailToken = $this->createEmailAddress($prefix,$token->access->token->id);
//作成失敗したとき
if(property_exists($emailToken,'error')){
$error = 500;
$message = $emailToken->error->details;
//作成成功したとき
}else{
$address = $emailToken->email->username;
//メールアドレス転送設定処理
$rs = $this->addForwardEmail($emailToken->email->email_id,$token->access->token->id);
if($rs['error'] == 0){
$error = 200;
$message = $address."を作成しました";
}else{
$error = 500;
$message = $address."を作成しましたが転送設定が失敗しました。";
}
}
}
}catch (\Exception $e){
$error = 500;
$message = $e->getMessage();
}
}
}else{
$error = 1;
$message = 'ドメイン名の前の箇所が不適切なためメールアドレスが作成できませんでした。';
}
$data = [
'message' => $message,
'email' => $address,
];
return new JsonResponse($data, $error);
}
private function addForwardEmail($emailUuid,$tokenId){
$ch = curl_init();
try{
$headers = array(
"Accept: application/json",
"Content-type: application/json",
"X-Auth-Token: ".$tokenId
);
$data = [
"email_id" => $emailUuid,
"address" => "転送先メールアドレス",
];
curl_setopt($ch, CURLOPT_URL, $this->getParameter('conoha_ep_forwarding'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$token_result = curl_exec($ch);
$token = json_decode($token_result);
$rs = [];
$rs['error'] = 0;
$rs['message'] = "";
}catch (\Exception $e){
$rs['error'] = 1;
$rs['message'] = "メールアドレス転送設定中にエラー";
}
curl_close($ch);
return $rs;
}
private function createEmailAddress($prefix,$tokenId){
$address = $prefix."@ドメイン";
$headers = array(
"Accept: application/json",
"Content-type: application/json",
"X-Auth-Token: ".$tokenId
);
$data = [
"domain_id" => $this->getParameter('conoha_domain_id'),
"email" => $address,
"password" => "パスワード"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->getParameter('conoha_ep_email'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$token_result = curl_exec($ch);
$token = json_decode($token_result);
curl_close($ch);
return $token;
}
public function _getConohaAPIToken()
{
$url = $this->getParameter('conoha_ep_token');
$headers = array(
"Accept: application/json",
"Content-type: application/json",
);
$data = [
"auth" => [
"passwordCredentials" => [
"username" => $this->getParameter('conoha_username'),
"password" => $this->getParameter('conoha_password'),
],
"tenantId" => $this->getParameter('conoha_tenant_id'),
]
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$token_result = curl_exec($ch);
$token = json_decode($token_result);
curl_close($ch);
return $token;
}