메일발송시 The remote server returned an error: (400) 에러 문의입니다.
request.GetResponse(); 할때 400 에러가 발생하는데 어떤문제인지 혹시 알수있을까요?
API Statistics에서 호출과 오류 둘다 찍힙니다. 어떤오류인지 정확히모르겠습니다.게시글에 새로운 댓글이 달리면 알림을 전송합니다.
request.GetResponse(); 할때 400 에러가 발생하는데 어떤문제인지 혹시 알수있을까요?
API Statistics에서 호출과 오류 둘다 찍힙니다. 어떤오류인지 정확히모르겠습니다.
댓글12
업데이트 된 답글입니다.
NAVER WORKS 공식계정
캡쳐 공유주신 코드를 보면 C# 언어로 확인됩니다.
메일쓰기 API 호출시 오류 메시지를 내부적으로 확인해보니 HTTP Request 시 Body 값이 정상적으로 전달되지 않는 것으로 확인됩니다.
# 응답결과
'{"code":"INVALID_PARAMETER","domain":"mail","message":"Data does not exist in To or Subject field."}'
'WebException was unhandled by user code' 메시지는 C# 에서 발생한 오류이며,
WebException 을 받아서 Response 를 확인하면 응답 실패에 대한 body 값을 확인 가능한 것으로 사료됩니다.
https://stackoverrun.com/ko/q/12063379
https://docs.microsoft.com/en-us/dotnet/api/system.net.webexception.response?redirectedfrom=MSDN&view=netframework-4.8#System_Net_WebException_Response
감사합니다.
2019.12.12
업데이트 된 답글입니다.
김종훈 작성자
2019.12.12
업데이트 된 답글입니다.
NAVER WORKS 공식계정
메일발송 API 는 Content-Type 이 Multipart 메시지로 정의되어 있는데요.
메시지 파트를 구분하는 boundary 파라미터 값이 Developers 에서 샘플로 정의한 매개변수 '$boundary'로 설정되어 있고,
해당 값이 메시지 본문에 명시하지 않아 서버에서 인식하지 못해 실패가 발생한 것으로 보입니다.
POST(Content-Type: multipart/mixed; boundary="$boundary”; charset=UTF-8)
- boundary="$boundary";
Boundary 파라미터 값은 클라이언트의 몫이며 보통 무작위의 문자를 선택하여 메시지의 본문과 충돌을 피하게 됩니다.
이 부분에 대한 설정 값을 확인 부탁드립니다.
http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
감사합니다.
2019.12.12
업데이트 된 답글입니다.
김종훈 작성자
string boundary = "gc0p4Jq0M2Yt08jU534c0p";
string content_Type = "multipart/mixed; boundary=--" + boundary + "--; charset=UTF-8";
request.ContentType = content_Type;이런식으로 셋했습니다.
혹시 샘플코드는없나요?
2019.12.16
업데이트 된 답글입니다.
NAVER WORKS 공식계정
먼저 샘플코드는 별도로 제공되지 않는 점 양해 부탁드립니다.
메일발송 API 호출시 Request Raw 데이터를 확인하여
HTTP Request Body 에서 메시지 페이로드를 각 파트별로 구분하는 Boundary 값이 정상적으로 삽입되어 있는지 확인 부탁드립니다.
아울러 멀티파트 문서 형식이므로 각 파트에 해당되는 'Content-Disposition' 타입도 명시되었는지 확인해주시면 될 것 같습니다.
EX)
--gc0p4Jq0M2Yt08jU534c0p--
Content-Disposition: form-data; name="subject"
메일 제목
--gc0p4Jq0M2Yt08jU534c0p--
...생략
감사합니다.
2019.12.17
업데이트 된 답글입니다.
김종훈 작성자
WebException의 Status는 ProtocolError 입니다.
2019.12.17
업데이트 된 답글입니다.
NAVER WORKS 공식계정
5xx 코드는 서버에서 발생한 오류인데요.
내부적으로 테스트시 정상적으로 동작된 것을 확인하였습니다.
지금도 동일한 현상인지 그리고 Request Raw 데이터를 확인 부탁드립니다.
아울러 Chrome 브라우저 에서는 Rest API 확장 프로그램을 제공하여 API 호출할 수 있습니다.
해당 프로그램을 통해 테스트 가능하오니 참고하여 주시기 바랍니다.
https://chrome.google.com/webstore/search/Restapi?utm_source=chrome-ntp-icon&_category=extensions
혹시 동일한 오류가 발생되는 경우 Request Raw Data를 공유 부탁드립니다.
감사합니다.
2019.12.17
업데이트 된 답글입니다.
김종훈 작성자
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Authorization: Bearer
**AccessToken부분**
consumerKey: **컨슈머키부분**
Date: Tue, 17 Dec 2019 08:48:36 GMT
Content-Type: multipart/mixed; boundary=--8d78319576b8eee; charset=UTF-8
Host: apis.worksmobile.com
Content-Length: 746
Expect: 100-continue
Connection: Keep-Alive
----8d78319576b8eee
Content-Disposition: form-data; name="userName"
jonghoon
----8d78319576b8eee
Content-Disposition: form-data; name="to"
ilms9012@gmail.com
----8d78319576b8eee
Content-Disposition: form-data; name="cc"
----8d78319576b8eee
Content-Disposition: form-data; name="bcc"
----8d78319576b8eee
Content-Disposition: form-data; name="subject"
this is subject
----8d78319576b8eee
Content-Disposition: form-data; name="text"
this is text
----8d78319576b8eee
Content-Disposition: form-data; name="contentType"
html
----8d78319576b8eee
Content-Disposition: form-data; name="saveSentMail"
true
----8d78319576b8eee
Content-Disposition: form-data; name="sendSeparately"
false
----8d78319576b8eee
이게 Request Raw Data 맞나요? api id,토큰,컨슈머키는 임의로 바꿔서올렸습니다.
아래 내용은 response raw입니다.
HTTP/1.1 500 Internal Server Error
Date: Wed, 18 Dec 2019 02:32:21 GMT
Server: Apache
Strict-Transport-Security: max-age=63072000; includeSubdomains; preload
Referrer-Policy: unsafe-url
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json;charset=UTF-8
4c
{"message":"Unknown error","domain":"common","code":"INTERNAL_SERVER_ERROR"}
0
2019.12.17
업데이트 된 답글입니다.
NAVER WORKS 공식계정
호출 로그를 살펴보니 아래의 이유로 인해 에러가 발생한 것으로 확인되었습니다.
1. end of line type
2. two hyphens preceding the boundary parameter value
2번의 경우는 이미 댓글로 설명드렸기때문에 1번때문에 발생한 것으로 예상됩니다.
end of line 은 CRLF(\r\n)를 사용해야 합니다.
CRLF 를 사용하셨는지 확인해주시기 바랍니다.
자세한 내용은 https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html 의 7.2.1 Multipart: The common syntax section 을 참고하시기 바랍니다.
감사합니다.
2019.12.20
업데이트 된 답글입니다.
김종훈 작성자
Request Raw
POST https://apis.worksmobile.com/r/**MyAPIID**/mail/v2/sendMail HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
Authorization: Bearer
**My Access Token**
consumerKey: **My consumerKey **
Date: Fri, 20 Dec 2019 07:26:13 GMT
Content-Type: multipart/mixed; boundary=--8d7856954821f3c--; charset=UTF-8
Host: apis.worksmobile.com
Content-Length: 746
Expect: 100-continue
Connection: Keep-Alive
--8d7856954821f3c--
Content-Disposition: form-data; name="userName"
jonghoon
--8d7856954821f3c--
Content-Disposition: form-data; name="to"
ilms9012@gmail.com
--8d7856954821f3c--
Content-Disposition: form-data; name="cc"
--8d7856954821f3c--
Content-Disposition: form-data; name="bcc"
--8d7856954821f3c--
Content-Disposition: form-data; name="subject"
this is subject
--8d7856954821f3c--
Content-Disposition: form-data; name="text"
this is text
--8d7856954821f3c--
Content-Disposition: form-data; name="contentType"
html
--8d7856954821f3c--
Content-Disposition: form-data; name="saveSentMail"
true
--8d7856954821f3c--
Content-Disposition: form-data; name="sendSeparately"
false
--8d7856954821f3c--
아래는 Response 내역입니다.
HTTP/1.1 400 Bad Request
Date: Fri, 20 Dec 2019 07:26:13 GMT
Server: Apache
Strict-Transport-Security: max-age=63072000; includeSubdomains; preload
Referrer-Policy: unsafe-url
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json
64
{"code":"INVALID_PARAMETER","domain":"mail","message":"Data does not exist in To or Subject field."}
0
도무지 어디가 잘못된지 모르겠네요... 줄바꿈은 전부 CRLF(\r\n)를 사용했습니다.
localhost 환경에서 하고있는데 이것도 문제가되나요?
2019.12.20
업데이트 된 답글입니다.
NAVER WORKS 공식계정
먼저 문의주신 사항에 대해 빠르게 답변드리지 못한 점 양해 부탁드립니다.
multipart/mixed 의 경우 각 파트별로 Content-로 시작하는 자신만의 헤더와 본문을 별도 갖기 때문에 API 호출에 실패가 발생한 것으로 보입니다.
content-type 을 multipart/mixed 대신 Form 형식으로 변경하면 보다 수월하게 요청 가능할 것으로 사료됩니다.
아래와 같이 수정하여 테스트 부탁드립니다.
# AS-IS : multipart/mixed; boundary=--8d7856954821f3c--
# TO-BE : multipart/form-data; boundary=--8d7856954821f3c--
그리고 boundary의 -- 는 content-type에 명시한 boundary를 기준으로 붙어야 합니다.
--8d7856954821f3c--로 설정 하셨기 때문에, 각 boundary 입력시엔 아래와 같이 -- 가 붙어야 합니다.
----8d7856954821f3c--
직접 호출하신 request raw에 예시로 수정하였습니다.
POST https://apis.worksmobile.com/r/**MyAPIID**/mail/v2/sendMail HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
Authorization: Bearer
**My Access Token**
consumerKey: **My consumerKey **
Date: Fri, 20 Dec 2019 07:26:13 GMT
Content-Type: multipart/mixed; boundary=--8d7856954821f3c--; charset=UTF-8
Host: apis.worksmobile.com
Content-Length: 746
Expect: 100-continue
Connection: Keep-Alive
----8d7856954821f3c--
Content-Disposition: form-data; name="userName"
jonghoon
----8d7856954821f3c--
Content-Disposition: form-data; name="to"
ilms9012@gmail.com
----8d7856954821f3c--
Content-Disposition: form-data; name="cc"
----8d7856954821f3c--
Content-Disposition: form-data; name="bcc"
...중략
false
----8d7856954821f3c---- (메시지의 끝을 알리기 위해 boundary 마지막에 -- 를 붙여줍니다.)
또한 postman 에서 호출정보를 c# code 제공해주는데요.
개발하신 소스와는 다르지만, 참고가 되셨으면하여 공유드립니다.
library는 RestSharp 입니다.
var client = new RestClient("https://apis.worksmobile.com/r/{APIID}/mail/v2/sendMail");
var request = new RestRequest(Method.POST);
request.AddHeader("Accept", "*/*");
request.AddHeader("User-Agent", "PostmanRuntime/7.19.0");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddHeader("consumerKey", "{consumerKey}");
request.AddHeader("Authorization", "Bearer {token}");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"to\"\r\n\r\n{수신자 email}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n{mail subject}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
감사합니다.
2019.12.26
업데이트 된 답글입니다.
김종훈 작성자
2019.12.30
궁금한 점을 해결하지 못하셨나요?
지금 바로 NAVER WORKS 사용자들에게 물어보세요!