> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 고객 이메일 로그

> Dodo Payments가 고객에게 보낸 모든 transactional email을 확인하고, 도착 여부를 확인하며, 보낸 그대로 이메일을 읽고 다시 보낼 수 있습니다.

<CardGroup cols={2}>
  <Card title="List Customer Emails" icon="list" href="/api-reference/customers/list-customer-emails">
    고객에게 발송된 이메일과 전송 결과를 확인합니다.
  </Card>

  <Card title="Get Email Content" icon="envelope-open" href="/api-reference/customers/get-customer-email-body">
    보낸 그대로 이메일 하나를 확인합니다.
  </Card>
</CardGroup>

## 개요

Dodo Payments는 회원님을 대신하여 고객에게 transactional email을 보냅니다. 여기에는 영수증, 환불 알림, 구독 알림, 미납 결제 및 복구 이메일, entitlement 부여, Customer Portal 로그인 링크가 포함됩니다.

고객의 **발송된 이메일** 탭에는 각 이메일이 기록됩니다. 모든 이메일에 대해 무엇을 보냈는지, 어디까지 도착했는지, 실패한 경우 도착하지 않은 이유를 확인할 수 있습니다. 고객이 받은 이메일을 열어 보고 다시 보낼 수도 있습니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/9G2eOufWVa-OvQvG/images/email-logs/sent-emails-tab.png?fit=max&auto=format&n=9G2eOufWVa-OvQvG&q=85&s=6c7fa235800cee5c32eb286312f2a52b" alt="고객의 발송된 이메일 탭으로, 각 이메일과 전송 상태가 표시됨" style={{ maxHeight: '500px', width: 'auto' }} width="2310" height="996" data-path="images/email-logs/sent-emails-tab.png" />
</Frame>

<Info>
  이메일은 **180일** 동안 보관됩니다. 전송 상태는 이메일 provider에서 제공하며 이벤트 발생 후 몇 초 이내에 업데이트됩니다.
</Info>

## 고객의 이메일 확인

<Steps>
  <Step title="Open the customer">
    대시보드에서 **Customers**로 이동한 다음 고객을 선택합니다.
  </Step>

  <Step title="Open the Sent Emails tab">
    이 탭에는 최근 180일 동안 이 고객에게 보낸 모든 이메일이 최신순으로 표시됩니다.
  </Step>

  <Step title="Read a row">
    각 행에는 제목, 제목 아래의 발신자, 카테고리, 날짜와 시간, 전송 상태가 표시됩니다.
  </Step>
</Steps>

## 전송 상태

| 상태           | 의미                                                  |
| ------------ | --------------------------------------------------- |
| `sent`       | Dodo Payments가 provider에 이메일을 전달했습니다. 이메일이 전송 중입니다. |
| `delivered`  | 수신 메일 서버가 이메일을 수락했습니다.                              |
| `failed`     | 이메일이 도착하지 않았습니다. 실패 이유가 표시됩니다.                      |
| `complained` | 수신자가 이메일을 스팸으로 표시했습니다.                              |
| `blocked`    | 아무것도 전송되지 않았습니다. test mode에서는 주간 허용량이 소진되었다는 의미입니다. |

### 실패 이유

이메일이 실패하면 행에 이유가 표시되어 조치가 필요한지 확인할 수 있습니다. **Failed** 상태에 마우스를 올려 확인하세요:

| 이유                                     | 의미                                                      | 조치                 |
| -------------------------------------- | ------------------------------------------------------- | ------------------ |
| Mailbox does not exist                 | 해당 주소가 존재하지 않습니다.                                       | 고객의 이메일 주소를 수정합니다. |
| Address rejected by the mail server    | 수신 서버가 해당 주소를 거부했습니다.                                   | 다른 주소를 사용합니다.      |
| Address blocked after earlier failures | 이전의 hard bounce 또는 complaint 이후 provider가 이 주소를 차단했습니다. | 다른 주소를 사용합니다.      |
| Mailbox is full                        | 수신자의 mailbox에 공간이 없습니다.                                 | 나중에 다시 보냅니다.       |
| Temporary delivery failure             | 수신 서버에서 일시적인 문제가 발생했습니다.                                | 나중에 다시 보냅니다.       |
| Message rejected as too large          | 수신 서버가 용량을 이유로 거부했습니다.                                  | support에 문의합니다.    |
| Recipient marked the email as spam     | 수신자가 이메일을 신고했습니다.                                       | 다시 보내지 않습니다.       |
| Email could not be sent                | provider가 전송을 거부했습니다.                                   | 다시 보냅니다.           |

이러한 이유 중 5가지는 다시 보낼 때 다른 주소가 필요합니다. 같은 주소를 사용하면 다시 실패하기 때문입니다. 해당 이유는 mailbox does not exist, address rejected, address blocked after earlier failures, message rejected as too large, recipient marked the email as spam입니다.

## 이메일 읽기

행에서 **Resend**를 선택하여 이메일 패널을 엽니다. 해당 패널의 **Email Preview**에는 보낸 그대로 저장된 사본이 표시됩니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/9G2eOufWVa-OvQvG/images/email-logs/email-preview.png?fit=max&auto=format&n=9G2eOufWVa-OvQvG&q=85&s=b0d00b4b6fe62c6ace0b8a2b4419619b" alt="고객이 받은 그대로 표시된 저장된 이메일 콘텐츠" style={{ maxHeight: '500px', width: 'auto' }} width="824" height="1148" data-path="images/email-logs/email-preview.png" />
</Frame>

일부 이메일은 표시할 콘텐츠가 없습니다:

* **Customer Portal 로그인 이메일.** 실시간 로그인 링크가 포함되므로 콘텐츠가 표시되지 않습니다.
* **차단된 이메일.** provider에 도달하지 않았으므로 사본이 없습니다.
* **180일이 지난 이메일.** 이 시점에 provider가 콘텐츠를 삭제합니다.

## 이메일 다시 보내기

행에서 **Resend**를 선택하여 같은 이메일을 다시 보냅니다. Dodo Payments는 원래 이벤트에서 이메일을 다시 렌더링하므로 영수증에는 항상 결제의 현재 상태가 표시됩니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/9G2eOufWVa-OvQvG/images/email-logs/resend-email.png?fit=max&auto=format&n=9G2eOufWVa-OvQvG&q=85&s=8751c05df35b14f116c8d487eaae7b70" alt="다른 주소로 보낼 수 있는 옵션이 표시된 이메일 행의 다시 보내기 컨트롤" style={{ maxHeight: '500px', width: 'auto' }} width="896" height="2104" data-path="images/email-logs/resend-email.png" />
</Frame>

패널의 **To** 필드에는 원래 주소가 유지됩니다. 다른 곳으로 보내려면 주소를 변경하세요. 영구적인 실패 후에는 같은 주소로 다시 실패하므로 다른 주소가 필요합니다.

<Warning>
  다시 보내기는 새 이메일입니다. 탭에 별도의 행으로 표시됩니다.
</Warning>

### 제한

* 각 이메일은 **세 번**까지 다시 보낼 수 있습니다.
* 시도 사이에 대기 시간이 적용됩니다. 첫 번째 다시 보내기 전에는 5분, 두 번째 전에는 10분, 세 번째 전에는 15분을 기다려야 합니다.
* provider에 도달하지 않은 전송은 3회의 제한에 포함되지 않습니다. 단, 대기 시간에는 영향을 줍니다.
* Resend는 대시보드에서만 사용할 수 있습니다. API는 read-only입니다.

### Resend를 사용할 수 없는 경우

| 경우                     | 이유                                 |
| ---------------------- | ---------------------------------- |
| 수신자가 이메일을 스팸으로 표시함     | 다시 보내면 수신자의 complaint를 위반하게 됩니다.   |
| 주소가 suppressed 상태임     | provider가 전송을 수락한 후 삭제합니다.         |
| 같은 이메일의 이후 전송이 이미 이루어짐 | 이 행은 기록입니다. 다시 보내면 사본이 하나 더 전달됩니다. |
| 고객이 차단됨                | 차단된 고객에게는 더 이상 이메일이 전송되지 않습니다.     |
| 3회의 다시 보내기를 모두 사용함     | 제한은 이메일별로 적용됩니다.                   |

<Note>
  Customer Portal 로그인 이메일은 항상 요청한 주소로 전송되며, 다시 보낼 때마다 새로운 로그인 링크가 발급됩니다.
</Note>

## Test Mode

Test mode에서도 실제 이메일이 전송되므로 **비즈니스당 주 100개 이메일**의 허용량이 적용됩니다. 다시 보내기도 동일한 허용량을 사용합니다.

허용량을 모두 사용하면 이후 이메일은 `blocked`로 기록되고 아무것도 전송되지 않습니다. 행에는 "Not sent: the test-mode email allowance for this week is spent"가 표시됩니다. 허용량은 매주 초기화됩니다. Live mode에는 이러한 제한이 없습니다.

<Info>
  Customer Portal 로그인 이메일은 test mode에서 전송되지 않으며 허용량도 사용하지 않습니다.
</Info>

## API를 통한 이메일 확인

목록과 콘텐츠는 API key를 통해서도 사용할 수 있으므로 자체 support 도구에서 전송 상태를 표시할 수 있습니다.

<CodeGroup>
  ```bash cURL theme={null}
  curl https://live.dodopayments.com/customers/{customer_id}/emails?page_size=10 \
    -H "Authorization: Bearer $DODO_API_KEY"
  ```

  ```typescript Node.js theme={null}
  const res = await fetch(
    `https://live.dodopayments.com/customers/${customerId}/emails?page_size=10`,
    { headers: { Authorization: `Bearer ${process.env.DODO_API_KEY}` } },
  );
  const { items, total_count } = await res.json();
  ```

  ```python Python theme={null}
  import os, requests

  res = requests.get(
      f"https://live.dodopayments.com/customers/{customer_id}/emails",
      params={"page_size": 10},
      headers={"Authorization": f"Bearer {os.environ['DODO_API_KEY']}"},
  )
  items = res.json()["items"]
  ```
</CodeGroup>

각 항목에는 전송이 실패한 경우 `status`, `failure_code` 및 `failure_reason`가 포함되며, 저장된 콘텐츠가 존재하는지 나타내는 `has_preview`도 포함됩니다. 또한 해당 행에서 수행할 수 있는 작업을 나타내는 `policies` 객체도 포함됩니다:

| 필드                           | 의미                               |
| ---------------------------- | -------------------------------- |
| `resend_allowed`             | 이 행을 다시 보낼 수 있습니다.               |
| `retry_allowed`              | 전송에 실패했으며 다시 시도할 수 있습니다.         |
| `resends_remaining`          | 이메일을 다시 보낼 수 있는 횟수입니다.           |
| `requires_different_address` | 같은 주소로 다시 실패하므로 다른 주소를 제공해야 합니다. |
| `superseded`                 | 같은 이메일의 이후 전송으로 이 행이 대체되었습니다.    |

자격 여부를 직접 판단하지 말고 `policies`를 확인하세요. 서버가 위의 규칙을 적용합니다.

<CardGroup cols={2}>
  <Card title="Customer Management" icon="user-group" href="/features/customers">
    고객, 구매 내역 및 self-service access를 관리합니다.
  </Card>

  <Card title="Communication Preferences" icon="bell" href="/features/communication-preferences">
    Dodo Payments가 회원님을 대신하여 보내는 이메일을 선택합니다.
  </Card>
</CardGroup>
