קבלת אימייל באמצעות Mail API

במדריך הזה מוסבר איך להשתמש ב-Mail API כדי לקבל אימייל.

הודעות אימייל שנשלחות לאפליקציה מיושמות כבקשות HTTP שמכילות נתוני MIME. כדי לעבד הודעות אימייל נכנסות, משייכים כתובות אימייל ל-script handlers בהגדרות האפליקציה, ואז כוללים את ה-handlers בקוד של האפליקציה.

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

מידע נוסף על שירות הדואר זמין במאמר סקירה כללית על Mail API.

לפני שמתחילים

צריך לרשום את כתובות האימייל של השולחים כשולחים מורשים. מידע נוסף זמין במאמר בנושא מי יכול לשלוח אימייל.

הגדרת האפליקציה לקבלת אימייל

כשיוצרים אפליקציה חדשה, האפשרות לקבל אימיילים מושבתת כברירת מחדל. כדי להפעיל את האימייל הנכנס, צריך לשנות את קובץ app.yaml בשירות ברירת המחדל.

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

    inbound_services:
    - mail

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

  2. מוסיפים מיפויים שמשייכים כתובות אימייל שממופות לכתובות URL למטפלים בסקריפטים.

    בשירות ברירת המחדל, כתובת האימייל לקבלת אימיילים היא בפורמט הבא:

    [STRING]@[Google Cloud project ID].appspotmail.com
    

    בשירותים שאינם ברירת מחדל, כתובת האימייל היא בפורמט הבא:

    [STRING]@[servicename]-dot-[Google Cloud project ID].appspotmail.com
    

    הודעות אימייל נשלחות לאפליקציה שלכם כבקשות HTTP POST באמצעות כתובת ה-URL הבאה, כאשר [ADDRESS] היא כתובת אימייל מלאה, כולל שם הדומיין:

    /_ah/mail/[ADDRESS]
    

    כדי לטפל באימייל נכנס באפליקציה, צריך למפות כתובות URL של אימייל ל-handlers בקובץ app.yaml:

    - url: /_ah/mail/.+
      script: handle_incoming_email.app
      login: admin

    בדוגמה שלמעלה, /_ah/mail/.+ תואם לכל כתובות האימייל שמופנות לאפליקציה. אם רוצים, אפשר להגדיר כמה פונקציות handler לכתובות אימייל שונות, כמו בדוגמה הבאה:

    - url: /_ah/mail/owner@.*your_app_id\.appspotmail\.com
      script: handle_owner.app
      login: admin
    - url: /_ah/mail/support@.*your_app_id\.appspotmail\.com
      script: handle_support.app
      login: admin
    - url: /_ah/mail/.+
      script: handle_catchall.app
      login: admin

    כתובות ה-URL של הודעות אימייל נכנסות מושוות לרשימה הזו מההתחלה ועד הסוף, כך שאם כתובת URL של הודעת אימייל תואמת ליותר מתבנית אחת, המטפל הראשון שתואם יהיה זה שיבוצע. כך אפשר לכלול מיפוי אחרון של 'טיפול בכל'. ה-handlers פועלים במודול ברירת המחדל (או בגרסת האפליקציה).

טיפול באימייל נכנס

כשמשתמשים ב-frameworks של Python לאינטרנט, הקונסטרוקטור InboundEmailMessage מקבל את הבייטים של גוף בקשת ה-HTTP. יש כמה דרכים ליצור את האובייקט InboundEmailMessage ב-Python. ב-Flask, ‏ request.get_data() מחזיר את הבייטים של הבקשה. אובייקט InboundEmailMessage מכיל את הודעת האימייל. השיטה bodies() מחזירה את הגופים בתוך ההודעה. אם קוראים לפונקציה bodies() ללא ארגומנטים, היא מחזירה איטרטור שמניב קוד HTML תחילה, ואז גופי טקסט פשוט. אם רוצים רק HTML או רק טקסט פשוט, אפשר להעביר ארגומנט ל-bodies():

@app.route("/_ah/mail/<path>", methods=["POST"])
def receive_mail(path):
    message = mail.InboundEmailMessage(request.get_data())

    # Do something with the message
    print(
        f"Received greeting for {escape(message.to)} at {escape(message.date)} from {escape(message.sender)}"
    )
    for content_type, payload in message.bodies("text/plain"):
        print(f"Text/plain body: {payload.decode()}")
        break

    return "OK", 200

אובייקט InboundEmailMessage כולל מאפיינים לגישה לשדות אחרים של ההודעה:

  • subject מכיל את נושא ההודעה.
  • sender היא הכתובת של השולח, למשל "Nobody <nobody@example.com>".
  • to היא רשימה מופרדת בפסיקים של הנמענים הראשיים של ההודעה, למשל "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc: רשימה מופרדת בפסיקים של הנמענים שקיבלו עותק, לדוגמה: "Joe <joe@example.com>, Bill <bill@example.com>".
  • date מחזירה את תאריך ההודעה.
  • attachments היא רשימה של Attachment אובייקטים, שיכולה להיות ריקה.
  • original היא ההודעה המלאה, כולל נתונים שלא מוצגים בשדות האחרים, כמו כותרות אימייל, כ-Python‏ email.message.Message.

הדמיה של הודעות נכנסות באמצעות שרת הפיתוח המקומי

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

  1. כדי לגשת לשרת הפיתוח כאדמין, עוברים אל http://localhost:8080/console ובוחרים באפשרות Sign in as administrator (כניסה כאדמין).
  2. בשרת הפיתוח, לוחצים על Inbound Mail (אימייל נכנס) בניווט.
  3. ממלאים את הטופס שמופיע ולוחצים על שליחת אימייל.

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

מידע נוסף על שיקולים להעברה של Mail API זמין במדריך Mail handlers.