임시보관함 사용하기

임시보관함은 DRAFT 시스템 라벨이 적용된 보내지 않은 메일을 나타냅니다. 초안에 포함된 메시지는 생성된 후에는 수정할 수 없지만 대체할 수는 있습니다. 이러한 의미에서 초안 리소스는 메시지가 대체될 때마다 기본 메시지 ID가 변경되므로 안정적인 ID를 제공하는 컨테이너일 뿐입니다.

임시보관함 내의 메일 리소스는 다음과 같은 차이점을 제외하고 다른 메일과 유사하게 작동합니다.

  • 임시보관함 메시지에는 DRAFT 시스템 라벨 외의 라벨이 있을 수 없습니다.
  • 초안이 전송되면 초안이 자동으로 삭제되고 업데이트된 ID가 포함된 새 메일이 SENT 시스템 라벨과 함께 생성됩니다. 이 메시지는 drafts.send 응답에서 반환됩니다.

목차

임시보관 메일 작성

애플리케이션은 drafts.create 메서드를 사용하여 초안을 만들 수 있습니다. 일반적인 절차는 다음과 같습니다.

  1. RFC 2822를 준수하는 MIME 메시지를 만듭니다.
  2. 메시지를 base64url로 인코딩된 문자열로 변환합니다.
  3. drafts.message.raw 필드의 값을 인코딩된 문자열로 설정하여 초안을 만듭니다.

다음 코드 예에서는 이 프로세스를 보여줍니다.

자바

gmail/snippets/src/main/java/CreateDraft.java
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.Draft;
import com.google.api.services.gmail.model.Message;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.apache.commons.codec.binary.Base64;

/* Class to demonstrate the use of Gmail Create Draft API */
public class CreateDraft {
  /**
   * Create a draft email.
   *
   * @param fromEmailAddress - Email address to appear in the from: header
   * @param toEmailAddress   - Email address of the recipient
   * @return the created draft, {@code null} otherwise.
   * @throws MessagingException - if a wrongly formatted address is encountered.
   * @throws IOException        - if service account credentials file not found.
   */
  public static Draft createDraftMessage(String fromEmailAddress,
                                         String toEmailAddress)
      throws MessagingException, IOException {
        /* Load pre-authorized user credentials from the environment.
        TODO(developer) - See https://developers.google.com/identity for
         guides on implementing OAuth2 for your application.*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(GmailScopes.GMAIL_COMPOSE);
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);

    // Create the gmail API client
    Gmail service = new Gmail.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Gmail samples")
        .build();

    // Create the email content
    String messageSubject = "Test message";
    String bodyText = "lorem ipsum.";

    // Encode as MIME message
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);
    MimeMessage email = new MimeMessage(session);
    email.setFrom(new InternetAddress(fromEmailAddress));
    email.addRecipient(javax.mail.Message.RecipientType.TO,
        new InternetAddress(toEmailAddress));
    email.setSubject(messageSubject);
    email.setText(bodyText);

    // Encode and wrap the MIME message into a gmail message
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    email.writeTo(buffer);
    byte[] rawMessageBytes = buffer.toByteArray();
    String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes);
    Message message = new Message();
    message.setRaw(encodedEmail);

    try {
      // Create the draft message
      Draft draft = new Draft();
      draft.setMessage(message);
      draft = service.users().drafts().create("me", draft).execute();
      System.out.println("Draft id: " + draft.getId());
      System.out.println(draft.toPrettyString());
      return draft;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      GoogleJsonError error = e.getDetails();
      if (error.getCode() == 403) {
        System.err.println("Unable to create draft: " + e.getMessage());
      } else {
        throw e;
      }
    }
    return null;
  }
}

Python

gmail/snippet/send mail/create_draft.py
import base64
from email.message import EmailMessage

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def gmail_create_draft():
  """Create and insert a draft email.
   Print the returned draft's message and id.
   Returns: Draft object, including draft id and message meta data.

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create gmail api client
    service = build("gmail", "v1", credentials=creds)

    message = EmailMessage()

    message.set_content("This is automated draft mail")

    message["To"] = "gduser1@workspacesamples.dev"
    message["From"] = "gduser2@workspacesamples.dev"
    message["Subject"] = "Automated draft"

    # encoded message
    encoded_message = base64.urlsafe_b64encode(message.as_bytes()).decode()

    create_message = {"message": {"raw": encoded_message}}
    # pylint: disable=E1101
    draft = (
        service.users()
        .drafts()
        .create(userId="me", body=create_message)
        .execute()
    )

    print(f'Draft id: {draft["id"]}\nDraft message: {draft["message"]}')

  except HttpError as error:
    print(f"An error occurred: {error}")
    draft = None

  return draft


if __name__ == "__main__":
  gmail_create_draft()

초안 업데이트

초안을 만드는 것과 마찬가지로 초안을 업데이트하려면 요청 본문에 Draft 리소스를 제공해야 하며, draft.message.raw 필드는 MIME 메시지가 포함된 base64url 인코딩 문자열로 설정해야 합니다. 메시지를 업데이트할 수 없으므로 초안에 포함된 메시지가 삭제되고 업데이트 요청에 제공된 새 MIME 메시지로 대체됩니다.

format=raw 매개변수를 사용하여 drafts.get을 호출하여 초안에 포함된 현재 MIME 메시지를 가져올 수 있습니다.

자세한 내용은 drafts.update를 참고하세요.

초안 전송

초안을 보낼 때 메시지를 있는 그대로 보내거나 업데이트된 메시지로 보낼 수 있습니다. 새 메시지로 초안 콘텐츠를 업데이트하는 경우 drafts.send 요청의 본문에 Draft 리소스를 제공하고, 전송할 초안의 draft.id을 설정하고, draft.message.raw 필드를 base64url로 인코딩된 문자열로 인코딩된 새 MIME 메시지로 설정합니다. 자세한 내용은 drafts.send를 참고하세요.