<?php

$hostNameUrl = "https://mail.apigw.ntruss.com";     // 호스트 URL
$requestUrl= "/api/v1/mails";                       // 요청 URI
$accessKey = "YOUR_ACCESS_KEY";                     // 네이버 클라우드 플랫폼 회원에게 발급되는 개인 인증키
$secretKey = "YOUR_SECRET_KEY";                     // 2차 인증을 위해 서비스마다 할당되는 service secret
$apiKey = "YOU_API_KEY";                            // API Gateway에서 발급받은 키 (primary key 또는 secondary key)
$method = "POST";                                   // 요청 method mail 발송 : POST, 발송 확인 GET 
$requestId = "";                                    // 요청 ID

try {
  
    
    $timestamp = "";
    $microtime = "";
    list($microtime,$timestamp) = explode(' ',microtime());
    $timestamp = $timestamp.substr($microtime, 2, 3);
    
    $is_post = false;
    if($method == "POST") {
        $postParam = array(
            "advertising"           => false,               // 광고메일여부 default: false
            "attachFileIds"         => array_map(),         // 첨부파일ID
            "body"                  => "",                  // Email 본문
            "individual"            => true,                // 개인발송여부 (개인발송 시 참조인, 숨은참조 무시됨) default: true
            "parameters"            => array_map(),         // 치환 파라미터 (전체 수신자에게 적용), ‘치환 ID’ 를 key로, ‘치환 ID에 맵핑되는 값’ 을 value로 가지는 Map 형태의 Object
            "recipients"            => array(               // 수신자목록
                array(
                    "address"       => "",                  // 수신자 Email 주소
                    "name"          => "",                  // 수신자 명
                    "type"          => "",                  // 수신자 유형 (R: 수신자, C: 참조인, B: 숨은참조) default: R
                    "parameters"    => array_map(),         // 치환 파라미터 (수신자별로 적용), ‘치환 ID’ 를 key로, ‘치환 ID에 맵핑되는 값’ 을 value로 가지는 Map 형태의 Object
                ),
            ),                 
            "referencesHeader"      => "",                  // 특정 메일을 모아서 보기 위해 네이버 메일에서 지원하는 기능, 해당 필드에 동일한 값을 입력한 메일들을 모아서 볼 수 있다. (다음의 형태가 되어야 함 : <unique_id@domain.com> )
            "reservationUtc"        => "",                  // 예약 발송 일시 ( 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 1/1000초로 환산한 정수 ), reservationDateTime 값보다 이 값이 우선 적용된다.
            "reservationDateTime"   => "",                  // 다음과 같은 형태의 예약 발송 일시 (‘yyyy-MM-dd HH:mm’ UTC+09:00), reservationUtc 값이 우선한다.
            "senderAddress"         => "",                  // 발송자 Email 주소
            "senderName"            => "",                  // 발송자 이름
            "tempRequestId"         => "",                  // 첨부파일 등록 시 사용한 임시 요청 ID
            "templateSid"           => "",                  // 템플릿 ID
            "title"                 => "",                  // Mail 제목
        );
        
        $postParam = json_encode($postParam);
        
        $is_post = true;
        
        $success_code = 201;
    } else {
        $success_code = 200;
        $requestUrl = $requestUrl."/requests/".$requestId."/status";
    }

    $signautue = makeSignature($secretKey, $method, $requestUrl, $timestamp, $accessKey);
    
    $url = $hostNameUrl.$requestUrl;
    echo $url."\n";
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, $is_post);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    if($method == "POST") {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postParam);
    }
    $headers = array();
    $headers[] = "X-NCP-APIGW-TIMESTAMP: " .$timestamp;
    $headers[] = "X-NCP-IAM-ACCESS-KEY: " .$accessKey;
    $headers[] = "X-NCP-APIGW-SIGNATURE-V2: " .$signautue;
    $headers[] = "content-type: application/json";
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $response = curl_exec ($ch);
    $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "status_code:".$status_code."\n";
    curl_close ($ch);
    if($status_code == 200) {
        echo $response."\n";
    } else {
        echo "Error 내용:".$response."\n";
    }

} catch(Exception $E) {
    echo "Response: ". $E->lastResponse . "\n";
}

function makeSignature($secretKey, $method, $uri, $timestamp, $accessKey) {
    $space = " ";
    $newLine = "\n";
    $hmac = $method.$space.$uri.$newLine.$timestamp.$newLine.$accessKey;
    $signautue = base64_encode(hash_hmac('sha256', $hmac, $secretKey,true));
    echo "this is signiture : ".$signautue."\n";
    return $signautue;
}
?>