수신 우편 정보 조회
GetReceivedMailsAsync()와 GetReceivedMailAsync()를 사용해 수신 우편 목록과 상세 정보를 조회합니다. 수신 우편 처리 상태를 추적할 때는 목록 조회로 전체 현황을 파악하고, 상세 조회로 특정 우편의 MailRecipientId, TextReadAt, AttachmentReadAt을 확인하는 것을 권장합니다.
1. 조회 조건 준비
수신 우편 조회는 목록 조회와 단일 상세 조회로 나뉩니다. 목록 조회에는 필터 조건을 준비하고, 단일 조회에는 목록 응답에서 확인한 MailRecipientId를 준비합니다.
목록 조회 조건 정리
GetReceivedMailsRequest로 언어, 카테고리, 본문 유형, 읽음 상태, 페이지네이션 조건을 조합해 목록을 조회합니다. 아직 읽지 않은 우편이나 첨부 아이템을 수령하지 않은 우편만 확인할 때는 TextRead와 AttachmentRead에 false를 명시하는 것을 권장합니다.
Language: 조회할 우편 언어MailCategory: 우편 카테고리 필터. 생략하면 카테고리 조건을 적용하지 않음MailContentType: 본문 유형 필터.Text또는Attachment. 생략하면 본문 유형 조건을 적용하지 않음TextRead,AttachmentRead: 읽음 상태 필터. 생략하면 읽음 상태 조건을 적용하지 않음Cursor,Direction,Size: 다음 페이지 기준점, 조회 방향, 페이지 크기
MailCategory, MailContentType, TextRead, AttachmentRead는 값을 지정했을 때만 해당 조건을 적용합니다. 따라서 우편함 첫 화면처럼 전체 우편을 보여 줄 때는 네 필터를 모두 생략합니다. 앱이 우편함 카테고리를 나눠 쓴다면 화면에 맞는 카테고리를 MailCategory에 지정해 조회하세요.
단일 조회에 사용할 MailRecipientId
GetReceivedMailAsync()에는 목록 응답의 ReceivedMailListItem.MailRecipientId를 사용합니다. 단, 회수되거나 만료되거나 삭제된 수신 우편은 상세 조회할 수 없으며, 이 경우 조회 요청은 공통 실패(Failure)를 반환합니다.
2. 수신 우편 목록 조회
GetReceivedMailsAsync
GetReceivedMailsAsync()를 호출해 사용자가 수신한 우편 목록과 페이지네이션 정보를 조회합니다. 우편함 화면에서는 이 목록을 먼저 불러오고, 본문과 첨부 아이템 상세는 다음 단계의 상세 조회에서 확인합니다. 만료된 우편, 회수된 우편, 삭제된 우편은 수신 우편 목록 조회 결과에 나타나지 않습니다.
호출 파라미터
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
request | GetReceivedMailsRequest | Required | 수신 우편 목록 조회 조건 |
context | ApiCallContext? | Optional | 호출 단위 설정 객체입니다. 생략하면 기본값이 사용됩니다. |
GetReceivedMailsRequest
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
Language | LanguageCode? | Optional | 조회할 우편 언어 |
MailCategory | string? | Optional | 우편 카테고리 필터. 생략하면 카테고리 조건을 적용하지 않고 모든 카테고리를 조회 |
MailContentType | ReceivedMailSearchRequestMailContentType? | Optional | 본문 유형 필터. Text, Attachment. 생략하면 본문 유형 조건을 적용하지 않고 모든 유형을 조회 |
TextRead | bool? | Optional | 본문 읽음 상태 필터. true이면 본문을 읽은 우편만, false이면 본문을 읽지 않은 우편만 조회. 생략하면 본문 읽음 상태 조건을 적용하지 않고 읽음 여부와 관계없이 모두 조회 |
AttachmentRead | bool? | Optional | 첨부 아이템 수령 상태 필터. true이면 첨부 아이템을 수령한 우편만, false이면 수령하지 않은 우편만 조회. 생략하면 첨부 아이템 수령 상태 조건을 적용하지 않고 수령 여부와 관계없이 모두 조회 |
Cursor | string? | Optional | 페이지 조회용 커서. 이전 응답의 NextCursor 또는 PreviousCursor |
Direction | ReceivedMailSearchRequestDirection? | Optional | 조회 방향. Previous 또는 Next. 생략하면 Next가 적용 |
Size | int | Optional | 한 번에 조회할 우편 수. 최소 1, 최대 50, 기본값 10 |
호출 예시
MailboxGetReceivedMailsResult의 성공 결과와 이 메서드의 도메인별 결과(Outcome)는 아래 예시와 응답 상태에서 확인합니다. 요청을 수행할 수 없을 때 반환하는 공통 실패(Failure)의 결과 모델과 처리 원칙은 공통 오류 처리를 참조하세요.
using Hive.Axyl.Mailbox;
using Hive.Axyl.Core;
IMailboxService mailbox = HiveCore.Resolve<IMailboxService>();
var result = await mailbox.GetReceivedMailsAsync(new GetReceivedMailsRequest {
Language = LanguageCode.Ko,
Size = 20,
});
switch (result)
{
case MailboxGetReceivedMailsResult.Success success:
foreach (ReceivedMailListItem item in success.Data.Items)
Debug.Log($"{item.MailRecipientId} {item.Title}");
break;
case MailboxGetReceivedMailsResult.Failure failure:
HiveError err = failure.Problem;
Debug.LogError($"[{err.Code}] {err.Message} (trace: {err.TraceId})");
break;
default:
Debug.LogWarning($"처리되지 않은 결과: {result.GetType().Name}");
break;
}
목록 항목(ReceivedMailListItem)에는 제목, 수신 시각, 읽음 시각 같은 요약 정보만 담깁니다. 본문과 첨부 아이템은 다음 단계의 상세 조회에서 확인합니다.
응답 데이터
성공 시 MailboxGetReceivedMailsResult.Success의 Data(ReceivedMailListResponseData)에 결과가 담깁니다. Items에 수신 우편 요약 목록이, Meta에 페이지네이션 정보가 들어 있습니다.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
Data.Items | IReadOnlyList<ReceivedMailListItem> | Required | 조회된 수신 우편 요약 목록. 조건에 맞는 우편이 없으면 빈 목록 |
Data.Meta | MetaPage? | Optional | 페이지네이션 정보 |
ReceivedMailListItem
ReceivedMailListItem은 Data.Items의 각 항목입니다. 모든 필드가 null을 담을 수 있는 형식으로 선언되어 있으므로, 값을 화면에 표시하거나 다음 호출에 넘기기 전에 null인지 먼저 확인하세요.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
MailRecipientId | string? | Optional | 수신 우편 식별자. 상세 조회와 읽음 처리에 사용 |
MailId | string? | Optional | 원본 발신 우편 식별자 |
Title | string? | Optional | 우편 제목 |
SenderId | string? | Optional | 발신자 식별자 |
SenderDisplayName | string? | Optional | 우편 화면에 표시하는 발신자 이름 |
SenderType | ReceivedMailListItemSenderType? | Optional | 발신자 유형. Admin, HiveSystem, ProjectSystem, User |
MailCategory | string? | Optional | 우편 카테고리 |
MailContentType | ReceivedMailListItemMailContentType? | Optional | 우편 내용 유형. Text, Attachment |
DeliveredAt | DateTimeOffset? | Optional | 우편 전달 시각 |
TextReadAt | DateTimeOffset? | Optional | 본문 읽음 처리 시각. 읽음 처리 전에는 null |
AttachmentReadAt | DateTimeOffset? | Optional | 첨부 아이템 수령 처리 시각. 수령 처리 전에는 null |
ExpiresAt | DateTimeOffset? | Optional | 우편 만료 시각 |
RecipientPlayerId | long? | Optional | 수신자 Player ID |
MetaPage
Data.Meta는 페이지 이동에 사용하는 커서 정보를 담습니다.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
Page | AxylCursorPagination? | Optional | 커서 페이지 정보 |
Page.HasNext | bool? | Optional | 다음 페이지 존재 여부 |
Page.NextCursor | string? | Optional | 다음 페이지를 조회할 때 사용하는 커서 값 |
Page.HasPrevious | bool? | Optional | 이전 페이지 존재 여부 |
Page.PreviousCursor | string? | Optional | 이전 페이지를 조회할 때 사용하는 커서 값 |
수신 우편 목록은 앞뒤 양방향으로 페이지를 이동합니다. 다음 페이지로 이동할 때는 Direction을 Next로 두고 응답의 NextCursor를 다음 요청의 Cursor에 전달하고, 이전 페이지로 돌아갈 때는 Direction을 Previous로 지정하고 응답의 PreviousCursor를 Cursor에 전달합니다. 이동할 페이지가 있는지는 HasNext와 HasPrevious로 판단합니다.
응답 예시
// success.Data.Items[0]
// MailRecipientId = "0196f7c4-1d5a-7b3e-9f20-4c6b8a2e1d07"
// MailId = "0196f7c3-8b2e-7f4d-a123-9c8d7e6f5a4b"
// Title = "출석 보상 안내"
// SenderId = "system"
// SenderType = ReceivedMailListItemSenderType.ProjectSystem
// MailContentType = ReceivedMailListItemMailContentType.Attachment
// TextReadAt = null // 본문 미읽음
// AttachmentReadAt = null // 첨부 아이템 미수령
//
// success.Data.Meta.Page.HasNext = true
// success.Data.Meta.Page.NextCursor = "eyJvZmZzZXQiOjIwfQ=="
bool hasNext = success.Data.Meta?.Page?.HasNext ?? false;
string? nextCursor = success.Data.Meta?.Page?.NextCursor;
응답 상태
반환 객체 MailboxGetReceivedMailsResult는 아래 케이스 중 하나로 분기됩니다. switch 구문으로 처리를 권장합니다.
| 응답 케이스 | 설명 | 앱 클라이언트 대응 |
|---|---|---|
Success | 수신 우편 목록 조회 성공. Data.Items에 요약 목록이 담깁니다. | 우편함 화면에 목록 표시 |
Failure | 공통 Failure입니다. 공통 오류 처리를 참조하세요. | 공통 오류 처리 기준에 따라 처리 |
UnknownOutcome | 이 SDK 버전이 알지 못하는 신규 결과입니다. | 실패로 처리하고 결과 코드를 기록 |
3. 수신 우편 상세 정보 조회
GetReceivedMailAsync
GetReceivedMailAsync()를 호출해 단일 수신 우편의 본문, 상태, 첨부 아이템 정보를 확인합니다. 특정 우편을 상세 화면에 표시할 때는 이 메서드로 Mail.Title, Mail.Body, Mail.MailStatus, TextReadAt, AttachmentReadAt을 함께 조회하는 것을 권장합니다. 만료되거나 회수되거나 삭제된 우편은 이 메서드로 조회할 수 없습니다. 따라서 상세 조회에 성공하면 Mail.MailStatus에는 Active가 담깁니다.
호출 파라미터
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
request | GetReceivedMailRequest | Required | 상세를 조회할 수신 우편 식별자와 언어 |
context | ApiCallContext? | Optional | 호출 단위 설정 객체입니다. 생략하면 기본값이 사용됩니다. |
GetReceivedMailRequest
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
MailRecipientId | string | Required | 상세를 조회할 수신 우편 식별자. 목록 항목의 MailRecipientId를 사용 |
Language | LanguageCode | Required | 조회할 우편 본문의 언어. 기본값이 없으므로 반드시 지정 |
요청한 언어의 번역이 없으면 서버는 우편의 기본 언어로 작성한 제목과 본문을 반환합니다.
호출 예시
MailboxGetReceivedMailResult의 성공 결과와 이 메서드의 도메인별 결과(Outcome)는 아래 예시와 응답 상태에서 확인합니다. 요청을 수행할 수 없을 때 반환하는 공통 실패(Failure)의 결과 모델과 처리 원칙은 공통 오류 처리를 참조하세요.
using Hive.Axyl.Mailbox;
using Hive.Axyl.Core;
IMailboxService mailbox = HiveCore.Resolve<IMailboxService>();
// item 은 목록 조회 결과의 ReceivedMailListItem 입니다.
if (item.MailRecipientId == null)
return;
var result = await mailbox.GetReceivedMailAsync(new GetReceivedMailRequest {
MailRecipientId = item.MailRecipientId,
Language = LanguageCode.Ko,
});
switch (result)
{
case MailboxGetReceivedMailResult.Success success:
Mail? mail = success.Data.Mail;
bool bodyRead = success.Data.TextReadAt.HasValue;
if (mail != null)
Debug.Log($"{mail.Title}: {mail.Body} ({mail.MailStatus}) / bodyRead={bodyRead}");
break;
case MailboxGetReceivedMailResult.Failure failure:
HiveError err = failure.Problem;
Debug.LogError($"[{err.Code}] {err.Message} (trace: {err.TraceId})");
break;
default:
Debug.LogWarning($"처리되지 않은 결과: {result.GetType().Name}");
break;
}
응답 데이터
성공 시 MailboxGetReceivedMailResult.Success의 Data(MailRecipientResponseData)에 결과가 담깁니다. Mail에서 본문과 상태를, 응답 최상위에서 수신 시각과 읽음 시각을 확인합니다.
Mail.MailCategory를 제외한 모든 필드가 null을 담을 수 있는 형식으로 선언되어 있으므로, 값을 화면에 표시하거나 다음 호출에 넘기기 전에 null인지 먼저 확인하세요.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
Data.MailRecipientId | string? | Optional | 수신 우편 식별자 |
Data.Mail | Mail? | Optional | 우편 본문, 상태, 첨부 아이템 정보 |
Data.RecipientPlayerId | long? | Optional | 수신자 Player ID |
Data.DeliveredAt | DateTimeOffset? | Optional | 우편 전달 시각 |
Data.TextReadAt | DateTimeOffset? | Optional | 본문 읽음 처리 시각. 읽음 처리 전에는 null |
Data.AttachmentReadAt | DateTimeOffset? | Optional | 첨부 아이템 수령 처리 시각. 수령 처리 전에는 null |
Data.ExpiresAt | DateTimeOffset? | Optional | 우편 만료 시각 |
Data.Mail은 우편 원본의 내용과 상태를 담는 객체입니다. 상세 화면의 제목, 본문, 첨부 아이템 표시에 사용합니다.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
MailId | string? | Optional | 원본 발신 우편 식별자 |
MailCategory | string | Required | 우편함 카테고리. 발송할 때 카테고리를 지정하지 않았으면 "DEFAULT" |
MailContentType | MailMailContentType? | Optional | 우편 본문 유형. Text, Attachment |
SenderType | MailSenderType? | Optional | 발신자 유형. Admin, HiveSystem, ProjectSystem, User |
SenderId | string? | Optional | 발신자 식별자 |
SenderDisplayName | string? | Optional | 우편 화면에 표시하는 발신자 이름 |
RecipientScope | MailRecipientScope? | Optional | 수신 대상 범위. Broadcast, Direct |
RecipientPlayerIds | IReadOnlyList<long>? | Optional | 수신자 PlayerId 목록. 모든 사용자에게 보낸 우편이면 null |
Title | string? | Optional | 우편 제목 |
Body | string? | Optional | 우편 본문 |
Language | LanguageCode? | Optional | 우편 기본 언어 |
MailExtension | string? | Optional | 앱에서 정의한 정책 문자열. 서버는 이 값을 해석하지 않고 문자열 그대로 저장 |
ExpiresAt | DateTimeOffset? | Optional | 우편 만료 시각 |
MailStatus | MailMailStatus? | Optional | 원본 우편 상태. Active, Revoked, Expired |
ClosedAt | DateTimeOffset? | Optional | 우편 종료 시각. 상태가 Expired 또는 Revoked로 바뀐 UTC 시각. Active이면 null |
CreatedAt | DateTimeOffset? | Optional | 우편 생성 시각 |
Attachments | IReadOnlyList<MailAttachment>? | Optional | 첨부 아이템 목록. MailContentType이 Text인 우편은 null이거나 비어 있음 |
MailAttachment
MailAttachment는 Mail.Attachments의 각 항목입니다. 앱은 이 값을 읽어 어떤 첨부 아이템을 몇 개 지급할지 판단합니다. 발송 시 전달한 AttachmentItem에 대응합니다.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
AttachmentType | string? | Optional | 앱에서 정의한 첨부 아이템 타입 |
ReferenceId | string? | Optional | 첨부 아이템 참조 ID |
Quantity | int? | Optional | 지급 수량 |
MailId | string? | Optional | 첨부 아이템이 속한 원본 발신 우편 식별자 |
CreatedAt | DateTimeOffset? | Optional | 첨부 아이템이 생성된 UTC 시각 |
응답 예시
// success.Data
// MailRecipientId = "0196f7c4-1d5a-7b3e-9f20-4c6b8a2e1d07"
// Mail.Title = "출석 보상 안내"
// Mail.Body = "출석 보상을 확인하세요."
// Mail.MailStatus = MailMailStatus.Active
// RecipientPlayerId = 1024
// DeliveredAt = 2026-06-10T09:00:00+00:00
// TextReadAt = null // 본문 미읽음
// AttachmentReadAt = null // 첨부 아이템 미수령
// ExpiresAt = 2026-06-24T09:00:00+00:00
응답 상태
반환 객체 MailboxGetReceivedMailResult는 아래 케이스 중 하나로 분기됩니다. switch 구문으로 처리를 권장합니다.
| 응답 케이스 | 설명 | 앱 클라이언트 대응 |
|---|---|---|
Success | 우편 상세 조회 성공. Data.Mail에 본문, 상태, 첨부 아이템이 담깁니다. | 상세 화면 표시 후 읽음 처리 여부 결정 |
Failure | 공통 Failure입니다. 공통 오류 처리를 참조하세요. | 공통 오류 처리 기준에 따라 처리 |
UnknownOutcome | 이 SDK 버전이 알지 못하는 신규 결과입니다. | 실패로 처리하고 결과 코드를 기록 |
다음 단계
수신 우편 본문을 읽었거나 앱에서 첨부 아이템 확인 또는 다운로드 완료를 판단했다면 우편 읽음 처리에서 우편 상태를 갱신하는 것을 권장합니다. 우편함에서 우편을 정리하려면 수신 우편 삭제를 참조하세요.
수신 우편 처리 상태를 추적할 때는 목록 조회로 전체 현황을 파악하고, 단일 상세 조회로 특정 우편의 TextReadAt과 AttachmentReadAt을 다시 검증하는 조합을 권장합니다.