NCP

Springboot Cloud Outbound Mailer 연동하기

초록색거북이 2023. 11. 21. 17:41
728x90
반응형
SMALL

Cloud outBound Mailer API 연동하는 것에 대한 자료가 많이 없는 것같아서 이 기회에 기록을 남겨보려고 한다.

 

네이버 클라우드의 Cloud Outbound Mailer 서비스를 신청하여 이용가능한 사람만 보길 권장한다.

 

 

먼저 연동하기 위해 늘 그러듯 Key가 필요하다.

 

필요한 키.

1. accessKey

2. secretKey

 

 

신규 API 인증키 생성을 해준다.

그리고 Access Key Id 와 Secret Key 를 기억하자.

 

 

이제 API 요청을 위해 헤더에 기본값들을 넣어주자.

@Component
public class WebClientConfig {

    public WebClient webClientMail() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        return WebClient.builder()
                .baseUrl("https://mail.apigw.ntruss.com/api/v1")
                .defaultHeader("Content-Type", "application/json")
                .defaultHeader("x-ncp-apigw-timestamp", String.valueOf(new Date().getTime()))
                .defaultHeader("x-ncp-iam-access-key", "accesskey값")
                .defaultHeader("x-ncp-apigw-signature-v2", makeSignature())
                .defaultHeader("x-ncp-lang","ko-KR")
                .build();
    }

    private String makeSignature() throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        String space = " ";  // 공백
        String newLine = "\n";  // 줄바꿈
        String method = "POST";  // HTTP 메소드
        String url = "/api/v1/mails";  // 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)
        String timestamp = String.valueOf(new Date().getTime());  // 현재 타임스탬프 (epoch, millisecond)
        String accessKey = "accessKey값";  // access key id (from portal or sub account)
        String secretKey = "secretKey값";  // secret key (from portal or sub account)

        String message = new StringBuilder()
                .append(method)
                .append(space)
                .append(url)
                .append(newLine)
                .append(timestamp)
                .append(newLine)
                .append(accessKey)
                .toString();

        SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(signingKey);

        byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(rawHmac);


    }
}

 

요청 보낼때 헤더에 들어가는 기본값 세팅이 완료 되었다.

 

아래 링크를 보면 알겠지만 메일전송을 위한 요청 파라미터의 종류를 보여준다.

https://api.ncloud-docs.com/docs/ai-application-service-cloudoutboundmailer-createmailrequest

 

createMailRequest

 

api.ncloud-docs.com

 

 

여기서 중요한 건 메일 전송의 두 가지 방식이 있다.

 

1. 기본 메세지 전송

2. 템플릿 이용한 메세지 전송

 

 

먼저 기본 메세지 전송부터 보도록 하자.

 

 

요청DTO 이다. (헷갈리지 않게,  요청할때 필요한 파라미터를 다 적어주었다. / 필수인 것들만 적어주면 된다.)

@Data
public class MailReqDto {
    private String senderAddress;
    private String senderName;
    private Integer templateSid;
    private String title;
    private String body;
    private Boolean individual;
    private Boolean confirmAndSend;
    private Boolean advertising;
    private Object parameters;
    private String referencesHeader;
    private Long reservationUtc;
    private String reservationDateTime;
    private List<String> attachFileIds;
    private List<RecipientForRequest> recipients;
    private RecipientGroupFilter recipientGroupFilter;
    private Boolean useBasicUnsubscribeMsg;
    private String unsubscribeMessage;
}

 

기본 메세지 전송에 필요한 파라미터는

senderAddress, title, body, recipients 이 4가지 이다.

 

따라서 값을 담아주도록 하자.

MailReqDto mailReqDto = new MailReqDto();
mailReqDto.setSenderAddress("no-reply@mtn.co.kr");
mailReqDto.setTitle("api 연동 테스트 입니다.");
mailReqDto.setBody("api 연동 테스트 입니다.");
mailReqDto.setRecipients(recipientForRequest);

 

담은 파라미터 값을 담아 API CALL을 해보자.

return webClient.webClientMail().post()
        .uri("/mails")
        .contentType(MediaType.APPLICATION_JSON)
        .body(BodyInserters.fromValue(mailReqDto))
        .retrieve()
        .bodyToMono(MailResDto.class)
        .block();

 

제대로 메일 전송이 되는 것을 확인 할수 있다.

메일 전송 이력에 대해 보고싶다면,

콘솔에 접속해 Cloud Outbound Mailer -> Mailing list 에 들어가면 확인 할 수 있다.

 

템플릿 이용한  메세지 전송을 보도록 하자.

 

기본 메세지 전송과는 다른점이 있다면, 템플릿을 사전에 서비스에서 등록을 해놓고 사용가능하다.

또한 요청하는 파라미터의 값도 달라진다.

 

확인해보자.

 

템플릿을 이용한 메세지 전송은 필요한 파라미터가 2가지 이다.

templateSid, recipients(여기 안에 parameters 값이 들어감 list 형식으로)

 

먼저 서비스에 템플릿 등록을 해보자.

 

콘솔에 접속한다.

Cloud Outbound Mailer -> Manage templates 에 접속하여 템플릿을 등록해준다.

 

이런식으로 적어주고, 내용에 ${test} 으로 적어주면, 

 

파라미터 요청할때 parameters 라는 값에 test 변수로 넣어주기만 하면 세팅한 값이 바인딩 되어 화면에 나타나게 된다.

 

템플릿을 등록하게 되면 ID값을 주는데 그 값이 바로 templateSid 이다.

 

이미 서비스에 보내는 이름, 보내는 메일 주소, 제목, 내용을 등록해놨기때문에

templateSid로 나머지 정보를 전송 할수 있게 됀다.

{
"templateSid" : 1,
"recipients":[
{"address":"hongildong@naver_.com",
"name":"홍길동",
"type":"R",
"parameters":{"customer_name":"홍길동","BEFORE_GRADE":"SILVER","AFTER_GRADE":"GOLD"}},
{"address":"chulsoo@daum_.net",
"name":null,
"type":"R",
"parameters":{"customer_name":"철수","BEFORE_GRADE":"BRONZE","AFTER_GRADE":"SILVER"}}
],
}

 

헷갈리지만 이런형식으로 파라미터를 담아 요청을 해야 한다.

 

RecipientForRequest recipientForRequest = new RecipientForRequest();
Parameters parameters = new Parameters();
parameters.setTest("테스트");
recipientForRequest.setParameters(parameters);
List<RecipientForRequest> recipientForRequests = new ArrayList<>();
recipientForRequests.add(recipientForRequest);

MailReqDto mailReqDto = new MailReqDto();
mailReqDto.setTemplateSid("templateSid");
mailReqDto.setRecipients(recipientForRequests);
return webClient.webClientMail().post()
        .uri("/mails")
        .contentType(MediaType.APPLICATION_JSON)
        .body(BodyInserters.fromValue(mailReqDto))
        .retrieve()
        .bodyToMono(MailResDto.class)
        .block();

 

 

결과를 보자.

 

 

parameters 파라미터에 테스트라는 문자열을 세팅해줬기때문에 화면에 잘 바인딩되어 나타나는 것을 볼 수 있다.

 

끝.

728x90
반응형
LIST