평범한 이야기들

[PHP] 네이버 Cloud Outbound Mailer API 파일 첨부하기 본문

평범한 개발 이야기/PHP

[PHP] 네이버 Cloud Outbound Mailer API 파일 첨부하기

songsariya 2019. 12. 6. 11:30
728x90

 지난 글에 이어 이번에는 createFile API를 이용해 메일 전송 시 파일 첨부를 위한 파일 업로드입니다. 파일 업로드 후 메일 전송 시 해당 파일 아이디를 이용해서 파일 첨부를 할 수 있습니다. 그리고 업로드된 파일은 24시간 동안 재사용할 수 있으며 24시간이 지나면 파일과 함께 파일 아이디도 삭제되게 됩니다. 메일 전송 시 파일 첨부가 없으면 이상하겠죠?

 

2019/12/05 - [평범한 개발 이야기/PHP] - [PHP] 네이버 Cloud Outbound Mailer API 파일 첨부하기

1. signature 만들기

 지난 글과 동일하게 공통인증 헤더를 먼저 만들어야 합니다. 공통헤더를 만들기 전 sinature를 만들어야 하는데 딱 한 부분이 달라집니다. 바로 "/api/v1/files"  부분입니다. 사실 이 부분 때문에 시간을 상당히 날려먹었습니다. 설명이 제대로 되어있지 않아서죠. (물론 제가 이해력이 딸려서 그럴 수도 있습니다.)

<?php

  $message = "POST";
  $message .= " ";
  $message .= "/api/v1/files";
  $message .= "\n";
  $message .= $timestamp;
  $message .= "\n";
  $message .= $access_key;
  
  $signature = base64_encode(hash_hmac('sha256', $message, $secret_key, true));
      

 

위와 같이 signature를 만들어 줍니다.

 

 

2. 파일 BODY 만들기

 저는 파일을 서버에 먼저 올리고 해당 파일을 createFile API를 통해 올리는 방법을 사용했습니다. 그 이유는 기존 만들어져 있던 시스템에서 해당 메일 부분만 바꾸는 작업이었기 때문에 최대한 기존과 동일하게 갈려고 했기 때문입니다. API 문서에서 제공해주는 예시입니다. 파일 업로드를 위해 해당 예시처럼 만들어 주어야 했습니다.

 위 API의 요청 예시처럼 PHP로 만들었습니다.

<?php

 
  $fp = fopen($filePath . $fileName, "r");
  $fileData = fread($fp, filesize($filePath . $fileName));
  
  // 파일을 POST로 해당 양식에 맞게 설정 해준다.
  $delimiter = uniqid();
  $data = '';
  $data .= "--" . $delimiter . "\r\n";
  $data .= 'Content-Disposition: form-data; name="fileList";' . ' filename="' . $file_name . '"' . "\r\n";
  $data .= 'Content-Type: ' . mime_content_type($fileName) . "\r\n";
  $data .= "\r\n";
  $data .= $fileData . "\r\n";
  $data .= "--" . $delimiter . "--\r\n";

 $delimiter 를 만들기 위해 uniqid() 함수를 사용했습니다. 해당 함수는 유니크 ID를 생성하는 기본 함수입니다.

 

`uniqid() - 유니크 ID를 생성하는 PHP 함수 기본은 16진수 13자리`

 

그리고 mime_content_type() 함수를 이용해 파일의 타입을 가져옵니다.  생성한 파일 정보를 이용해 공통 인증 헤더를 만들어줍니다.

기존에 없던 파일의 내용이 추가되었습니다. 

   <?php
   
   $headers = array(
      "Content-Type: multipart/form-data;"
    , "x-ncp-apigw-timestamp: " . $timestamp . ""
    , "x-ncp-iam-access-key: " . $access_key . ""
    , "x-ncp-apigw-signature-v2: " . $signature . ""
    , 'Content-Type: multipart/form-data; boundary=' . $delimiter
    , 'Content-Length: ' . strlen($data)
  );

 이렇게 createFile API를 사용할 모든 정보가 제작되었습니다.

 

 

3. createFile API를 이용해 파일 업로드

 위에 만들어진 내용을 토대로 지난번과 같이 curl를 이용해 createFile API를 호출하면 됩니다.

<?php

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "https://mail.apigw.ntruss.com/api/v1/files");
  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 파일내용
  curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath . $fileName));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $response = curl_exec($ch);

  // Cloud Outbound Mailer 응답에 Header 같이 껴서 오기 때문에 제거해준다.
  $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
  $headerContents = substr($response, 0, $headerSize);
  $bodyContents = substr($response, $headerSize);

  // json 형태의 response 데이터를 array로 변경해준다.
  $result = json_decode(urldecode($bodyContents), true);

  curl_close($ch);

 여기서 주의할 점은 Cloud Outbound Mailer의 createFile 응답에 헤더의 내용이 같이 딸려서 오기 때문에 바로 json_decode() 함수를 사용하면 원하는 값을 가져와서 사용할 수 없습니다. 따라서 헤더의 내용을 제거해주는 내용도 포함해서 처리를 해줍니다. API 문서의 내용처럼 JSON으로 응답을 가져와 json_decode()를 이용해 배열로 만들어 사용할 수 있습니다.

 

여기서 files에 있는 fileId를 이용해 메일 전송 시 사용을 하면 첨부파일이 들어간 메일을 전송할 수 있습니다.

728x90
Comments