• בלוג
  • איך לשלוח מייל מתוך תוכנית Python

איך לשלוח מייל מתוך תוכנית Python

31/07/2017

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

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

1. קצת מושגים

תיבות דואר אלקטרוני מאוחסנות על שרתים באינטרנט. לשרתים אלו אתם מתחברים עם תוכנות כמו Outlook או מתוך ממשק מבוסס Web (כמו במקרה של Gmail) וכך יכולים לקרוא את ההודעות ולהוריד אותן אליכם למחשב.

כשאתם באים לשלוח הודעה בצורה ידנית, למשל דרך תוכנת Outlook, התוכנה מתחברת לשרת שאחראי על תיבת הדואר של הנמען ומשאירה שם את ההודעה. שרת זה הוא כמו סניף הדואר הקרוב למקום מגוריו של הנמען. את השרת אפשר לזהות לפי הסיומת של כתובת המייל, כלומר החלק שאחרי השטרודל. לדוגמא מייל שנשלח ל joe@gmail.com מועבר תחילה לטיפול בשרת ששמו gmail.com.

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

כשעוברים לשליחה אוטומטית אפשרות אחת היא להתחבר לשרת דואר כזה כאילו היינו עובדים מתוכנה ידנית. במקרה של ג'ימייל לדוגמא נוכל להתחבר לג'ימייל כאילו אנחנו תוכנת Outlook ונעביר אליו הודעה לשליחה.

אבל יש עם זה מספר בעיות:

  1. שרתי דואר לא תמיד אוהבים לדבר עם תוכנות אוטומטיות ששולחות מיילים, ולכן עלולים לזרוק את ההודעות לפח.
  2. לא היינו רוצים לשמור שם משתמש וסיסמא לתיבת אימייל בתוך תוכנית אוטומטית.
  3. לא אפשרי לשלוח מייל מ Domain שלכם.

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

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

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

2. עבודת הכנה ב Mailgun

כדי לשלוח מייל מ Mailgun תצטרכו קודם לפתוח חשבון שם. פתיחת חשבון היא בחינם אבל כן צריך להזין פרטי כרטיס אשראי למקרה שתחרגו מהמיכסה. אחרי שפותחים חשבון הם יבקשו מכם לעדכן מספר הגדרות בדומיין שלכם כדי שהודעות אוטומטיות שתשלחו יראו אותנטיות ושרתי הדואר לא יזרקו אותן. עקבו אחר ההוראות תחת סעיף Domain Verification & DNS וודאו שהבדיקה האוטומטית של Mailgun מציגה שהכל תקין.

אחרי שזה נגמר בתוך מסך Domains שלהם תראו את הדומיין שלכם ובסעיף API Key תוכלו לראות את המפתח הרלוונטי לשליחת דואר מהדומיין. העתיקו אותו, יחד עם שם הדומיין והערך של API Base URL ואז המשיכו לקוד התוכנית.

3. קוד התוכנית

הקוד הבא יתחבר ל Mailgun שלכם וישלח אימייל לנמענים שתרצו. יש לשנות את ההשמה לשלושת המשתנים בראש הסקריפט לערכים שמתאימים לחשבון שלכם. לפני הפעלת הקוד יש להתקין את הספריה requests באופן הבא:

pip install requests

והתוכנית:

import requests

# insert here the values relevant to your mailgun account
domain = '...'
apikey = '...'
baseurl = '...'

print requests.post("{}/messages".format(baseurl),
                    auth=("api", apikey),
                    data={"from": "Excited User <me@{}>".format(domain),
                          "to": "recipient@gmail.com",
                          "subject": "Hello",
                          "text": "Testing some Mailgun awesomness!",
                          "html": "<html>HTML version of the body</html>"})

4. איך לשלוח בלי שירות שליחה

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

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

import smtplib

server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()

fromaddr = 'youremail@gmail.com'
toaddrs  = 'recipient@gmail.com'
username = 'youremail'
password = 'secret_password'

msg = "\r\n".join([
  "From: {}".format(fromaddr),
  "To: {}".format(toaddrs),
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])

server.login(username, password)
server.sendmail(fromaddr, toaddrs, msg)

מי שמשתמש באימות דו-שלבי בג'ימייל יצטרך לייצר סיסמא ייעודית עבור הסקריפט מתוך חשבון הג'ימייל בעמוד הבא: https://security.google.com/settings/security/apppasswords