임시 캠페인 작업

임시보관 메일은 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/Create임시보관함.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
from __future__ import print_function

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.message.raw 필드를 MIME 메시지가 포함된 base64url로 인코딩된 문자열로 설정하여 요청 본문에 Draft 리소스를 제공해야 합니다. 메시지를 업데이트할 수 없으므로 초안에 포함된 메시지가 폐기되고 업데이트 요청에 제공된 새 MIME 메시지로 대체됩니다.

format=raw 매개변수를 호출하여 drafts.get를 호출하여 초안에 포함된 현재 MIME 메시지를 검색할 수 있습니다.

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

임시보관 메일 보내기

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