การใช้งานฉบับร่าง

ร่างจดหมายแสดงข้อความที่ยังไม่ได้ส่งและใช้ป้ายกำกับระบบ DRAFT เมื่อสร้างข้อความที่อยู่ภายในฉบับร่างแล้ว แต่แก้ไขไม่ได้ สามารถแทนที่ได้ ในแง่นี้ ทรัพยากรฉบับร่าง เป็นเพียงคอนเทนเนอร์ ซึ่งระบุรหัสแบบคงที่เนื่องจากรหัสข้อความที่สำคัญจะเปลี่ยนแปลงทุกครั้ง ข้อความจะถูกแทนที่

แหล่งข้อมูลของข้อความภายในข้อความร่าง มีลักษณะการทำงานที่คล้ายกับข้อความอื่นๆ ยกเว้นข้อแตกต่างต่อไปนี้

  • ข้อความร่างต้องไม่มีป้ายกำกับอื่นนอกจากป้ายกำกับระบบ DRAFT
  • เมื่อส่งข้อความร่างแล้ว ระบบจะลบฉบับร่างโดยอัตโนมัติพร้อมทั้งข้อความใหม่ ระบบจะสร้างรหัสที่อัปเดตแล้วพร้อมกับป้ายกำกับระบบ SENT ข้อความนี้คือ ส่งคืนในdrafts.send คำตอบ

เนื้อหา

การสร้างข้อความร่าง

แอปพลิเคชันของคุณสามารถสร้างฉบับร่างโดยใช้ drafts.create ขั้นตอนทั่วไปมีดังนี้

  1. สร้างข้อความ MIME ที่สอดคล้องกับ RFC 2822
  2. แปลงข้อความเป็นสตริงที่เข้ารหัส base64url
  3. สร้างฉบับร่าง โดยตั้งค่า ของช่อง drafts.message.raw เป็นสตริงที่เข้ารหัส

ตัวอย่างโค้ดต่อไปนี้จะแสดงกระบวนการดังกล่าว

Java

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 ตั้งค่าเป็นสตริงที่เข้ารหัส base64url ที่มีข้อความ MIME เพราะ ไม่สามารถอัปเดตข้อความ ข้อความที่อยู่ในร่างจดหมายถูกทำลายแล้ว และแทนที่ด้วยข้อความ MIME ใหม่ที่ระบุในคำขออัปเดต

คุณสามารถเรียกข้อความ MIME ปัจจุบันที่มีอยู่ในฉบับร่างได้โดยเรียกใช้ drafts.get ที่มีพารามิเตอร์ format=raw

สำหรับข้อมูลเพิ่มเติม โปรดดู drafts.update

กำลังส่งร่างจดหมาย

เมื่อส่งร่างจดหมาย คุณสามารถเลือกที่จะส่งข้อความตามเดิมหรือส่ง ข้อความที่อัปเดต หากคุณกำลังอัปเดตเนื้อหาฉบับร่างด้วยข้อความใหม่ ให้ทรัพยากร Draft ในส่วนเนื้อหาของ คำขอ drafts.send ตั้งค่าอัน draft.id ของร่างจดหมายที่จะส่ง และตั้งค่า draft.message.raw เป็น ข้อความ MIME ใหม่ที่เข้ารหัสเป็นสตริงที่เข้ารหัส base64url สำหรับข้อมูลเพิ่มเติม ดูข้อมูลได้ที่ drafts.send