일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- MySQL
- ubuntu
- 업비트
- codeigniter
- 제주도
- 맛집
- 셀레니움
- 라즈베리파이
- 우분투 20.04
- Selenium
- 20.04
- TiL
- Laravel
- 옵티머스 g
- 프레임워크
- Ubuntu 20.04
- 코드이그나이터
- 옵지
- upbit
- 옵G
- 맥
- 라라벨
- php
- FMS
- 옵티머스g
- Raspberry Pi
- 우분투
- 회고
- 라즈비안
- C
- Today
- Total
평범한 이야기들
[PHP] 네이버 Cloud Outbound Mailer API 파일 첨부하기 본문
지난 글에 이어 이번에는 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를 이용해 메일 전송 시 사용을 하면 첨부파일이 들어간 메일을 전송할 수 있습니다.