ניהול מסננים ב-Gmail

במאמר הזה מוסבר איך להשתמש במסננים ב-Gmail API.

אפשר להשתמש במשאב settings.filters כדי להגדיר כללי סינון מתקדמים לחשבון. מסננים יכולים להוסיף או להסיר תוויות באופן אוטומטי, או להעביר אימיילים לכתובות אימייל וירטואליות מאומתות, על סמך המאפיינים או התוכן של ההודעה הנכנסת.

מידע על יצירה, הצגה, קבלת או מחיקה של מסנני Gmail זמין במקור המידע settings.filters.

קריטריונים להתאמה

לסנן הודעות לפי מאפיינים כמו השולח, הנושא, התאריך, הגודל ותוכן ההודעה. מסננים חלים רק על הודעות ספציפיות ולא על כל שרשור האימייל. אפשר להשתמש במסנן בכל שאילתה שמשתמשת בתחביר של החיפוש המתקדם ב-Gmail. לדוגמה, דפוסי מסננים נפוצים כוללים:

סינון התאמות
criteria.from='sender@example.com' אימיילים מאת sender@example.com
criteria.size=10485760
criteria.sizeComparison='larger'
אימיילים שהנפח שלהם גדול מ-10MB
criteria.hasAttachment=true אימיילים עם קובץ מצורף
criteria.subject='[People with Pets]' אימיילים עם [People with Pets] בנושא
criteria.query='"my important project"' אימיילים שמכילים my important project
criteria.negatedQuery='"secret knock"' אימיילים שלא מכילים secret knock

אם במסנן מוגדרים כמה קריטריונים, ההודעה צריכה לעמוד בכל הקריטריונים כדי שהמסנן יחול עליה.

פעולות

החלת Action על הודעות שתואמות לקריטריוני הסינון. באמצעות Action, אפשר להעביר הודעות לכתובת אימייל מאומתת, או להוסיף ולהסיר תוויות.

מוסיפים או מסירים תוויות כדי לשנות את הסטטוס של האימייל. לדוגמה, כמה פעולות נפוצות:

פעולה השפעה
action.removeLabelIds=['INBOX'] העברת האימייל לארכיון (דילוג על תיבת הדואר הנכנס)
action.removeLabelIds=['UNREAD'] סימון כפריט שנקרא
action.removeLabelIds=['SPAM'] אף פעם לא לסמן כספאם
action.removeLabelIds=['IMPORTANT'] אף פעם לא לסמן כחשוב
action.addLabelIds=['IMPORTANT'] סימון כחשובה
action.addLabelIds=['TRASH'] מחיקת האימייל
action.addLabelIds=['STARRED'] סימון בכוכב
action.addLabelIds=['<user label id>'] מתייגים את האימייל בתווית שהוגדרה על ידי המשתמש. אפשר להשתמש רק בתווית אחת שהוגדרה על ידי המשתמש לכל מסנן.

דוגמאות קוד

בדוגמאות הקוד הבאות אפשר לראות איך מתייגים ומעבירים לארכיון הודעות מרשימת תפוצה:

Java

gmail/snippets/src/main/java/CreateFilter.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.Filter;
import com.google.api.services.gmail.model.FilterAction;
import com.google.api.services.gmail.model.FilterCriteria;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate the use of Gmail Create Filter API */
public class CreateFilter {
  /**
   * Create a new filter.
   *
   * @param labelId - ID of the user label to add
   * @return the created filter id, {@code null} otherwise.
   * @throws IOException - if service account credentials file not found.
   */
  public static String createNewFilter(String labelId) throws 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_SETTINGS_BASIC,
            GmailScopes.GMAIL_LABELS);
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);

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

    try {
      // Filter the mail from sender and archive them(skip the inbox)
      Filter filter = new Filter()
          .setCriteria(new FilterCriteria()
              .setFrom("gduser2@workspacesamples.dev"))
          .setAction(new FilterAction()
              .setAddLabelIds(Arrays.asList(labelId))
              .setRemoveLabelIds(Arrays.asList("INBOX")));

      Filter result = service.users().settings().filters().create("me", filter).execute();
      // Prints the new created filter ID
      System.out.println("Created filter " + result.getId());
      return result.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      GoogleJsonError error = e.getDetails();
      if (error.getCode() == 403) {
        System.err.println("Unable to create filter: " + e.getDetails());
      } else {
        throw e;
      }
    }
    return null;
  }
}

Python

gmail/snippet/settings snippets/create_filter.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def create_filter():
  """Create a filter.
  Returns: Draft object, including filter id.

  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)

    label_name = "IMPORTANT"
    filter_content = {
        "criteria": {"from": "gsuder1@workspacesamples.dev"},
        "action": {
            "addLabelIds": [label_name],
            "removeLabelIds": ["INBOX"],
        },
    }

    # pylint: disable=E1101
    result = (
        service.users()
        .settings()
        .filters()
        .create(userId="me", body=filter_content)
        .execute()
    )
    print(f'Created filter with id: {result.get("id")}')

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

  return result.get("id")


if __name__ == "__main__":
  create_filter()