메일발송시 The remote server returned an error: (400) 에러 문의입니다.

김종훈

2019.12.12읽음 13660

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

    0
  • 업데이트 된 답글입니다.

    김종훈 작성자

    예외처리에서 Response값 확인하면 위에올려주신 '{"code":"INVALID_PARAMETER","domain":"mail","message":"Data does not exist in To or Subject field."}' 이게 뜨는데요, 파라미터 전달에 문제가 있는건가요? authorization 코드나 accessToken 받을때 비슷한 방식으로했는데 제대로 전달 및 응답이 됐었거든요, 그런데 여기서는 왜 안되는지 혹시 예상되는 부분이 있을까요?

    2019.12.12

    0
  • 업데이트 된 답글입니다.

    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

    0
  • 업데이트 된 답글입니다.

    김종훈 작성자

    boundary를 해당 링크문서대로  "--임의의값--"으로 넣고 해도 같은결과가 나오는데요
      string boundary = "gc0p4Jq0M2Yt08jU534c0p";
      string content_Type = "multipart/mixed; boundary=--" + boundary + "--; charset=UTF-8";  
      request.ContentType = content_Type;이런식으로 셋했습니다.
    혹시 샘플코드는없나요?

    2019.12.16

    0
  • 업데이트 된 답글입니다.

    NAVER WORKS 공식계정

    안녕하세요.

    먼저 샘플코드는 별도로 제공되지 않는 점 양해 부탁드립니다.

    메일발송 API 호출시 Request Raw 데이터를 확인하여
    HTTP Request Body 에서 메시지 페이로드를 각 파트별로 구분하는 Boundary 값이 정상적으로 삽입되어 있는지 확인 부탁드립니다.

    아울러 멀티파트 문서 형식이므로 각 파트에 해당되는 'Content-Disposition' 타입도 명시되었는지 확인해주시면 될 것 같습니다.

    EX)

    --gc0p4Jq0M2Yt08jU534c0p--
    Content-Disposition: form-data; name="subject"

    메일 제목
    --gc0p4Jq0M2Yt08jU534c0p--

    ...생략


    감사합니다.

    2019.12.17

    0
  • 업데이트 된 답글입니다.

    김종훈 작성자

    상세한 답변 감사합니다. 멀티파트와 boundar의 코드를 수정했습니다. 그런데 그이후.GetResponse()할때  http status code 500  {"message":"Unknown error","domain":"common","code":"INTERNAL_SERVER_ERROR"} 에러가 뜨는경우는 어떤경우인가요?
    WebException의 Status는 ProtocolError 입니다.

    2019.12.17

    0
  • 업데이트 된 답글입니다.

    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

    0
  • 업데이트 된 답글입니다.

    김종훈 작성자

    POST https://apis.worksmobile.com/r/**API ID 부분**/mail/v2/sendMail HTTP/1.1
    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

    0
  • 업데이트 된 답글입니다.

    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

    0
  • 업데이트 된 답글입니다.

    김종훈 작성자

    boundary에 하이픈을 양쪽에 두개주니까 다시 400 에러로 돌아왔습니다.

    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

    0
  • 업데이트 된 답글입니다.

    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

    0
  • 업데이트 된 답글입니다.

    김종훈 작성자

    감사합니다. content-type과 boundary를 수정하니 정상동작됩니다.

    2019.12.30

    0
이전 글라인웍스 메세지 앱 브라우져 관련 질문입니다.
다음 글SSO Request URL설정에대한 질문
목록

궁금한 점을 해결하지 못하셨나요?
지금 바로 NAVER WORKS 사용자들에게 물어보세요!