이메일 초안 작성 및 보내기

이 문서에서는 Gmail API를 사용하여 이메일 초안을 만들고, 업데이트하고, 전송하는 방법을 설명합니다.

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

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

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

초안 만들기

앱은 drafts.create 메서드를 사용하여 초안을 만들 수 있습니다. 초안을 만들려면 다음 단계를 따르세요.

  1. RFC 2822를 준수하는 MIME 메시지를 만듭니다.
  2. 메시지를 base64URL로 인코딩된 문자열로 변환합니다.
  3. drafts.create 메서드를 호출하여 messages.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()

cURL

curl --request POST \
  'https://gmail.googleapis.com/gmail/v1/users/me/drafts' \
  --header 'Authorization: Bearer ACCESS_TOKEN" \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"message":{"raw":"MESSAGE"}}'

다음을 바꿉니다.

  • ACCESS_TOKEN: API에 대한 액세스 권한을 부여하는 액세스 토큰입니다.
  • MESSAGE: RFC 2822 형식의 MIME 메시지로, base64URL로 인코딩됩니다.

초안 업데이트

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

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

자세한 내용은 drafts.update 메서드를 참조하세요.

초안 보내기

초안을 보낼 때 초안을 그대로 보낼 수도 있고 보내기 요청에서 업데이트를 제공할 수도 있습니다.

전송 시 초안을 업데이트하려면 drafts.send 메서드의 요청 본문에 drafts 리소스를 제공합니다. drafts 리소스에서 전송할 메일 초안의 id을 지정하고 messages.raw 필드를 base64URL 문자열로 인코딩된 새 MIME 메시지로 설정해야 합니다.

Gmail 메일 전송에 관한 자세한 내용은 메일 보내기를 참고하세요.