برنامه نویسی

سفارش خودکار انسولین: ارسال ایمیل به داروخانه (قسمت 4)

در این قسمت از مجموعه، ما بر روی خودکار کردن مرحله ارسال ایمیل به داروخانه برای پیش‌سفارش انسولین تمرکز خواهیم کرد. ما از سرور SMTP Gmail برای ارسال ایمیل مستقیماً به صندوق ورودی داروخانه استفاده خواهیم کرد. برای این، ما به جزئیات سرور SMTP و اعتبار حساب خود نیاز داریم.

راه اندازی Gmail SMTP

اگر 2FA را فعال کرده اید، باید یک رمز عبور برنامه ایجاد کنید:

  1. به جیمیل بروید و روی آواتار خود کلیک کنید.
  2. “Manage your Google Account” را انتخاب کنید.
  3. به بخش “امنیت” بروید.
  4. «گذرواژه‌های برنامه» را در نوار جستجو جستجو کنید.
  5. یک رمز عبور برنامه جدید ایجاد کنید و از آن برای ارسال ایمیل استفاده کنید.

اگر 2FA را فعال نکرده‌اید، باید به برنامه‌هایی که امنیت کمتری دارند اجازه دهید از آدرس ایمیل شما استفاده کنند، اما به دلایل امنیتی شدیداً توصیه می‌کنم از 2FA استفاده کنید.

ارسال ایمیل با استفاده از cURL

ما از cURL برای ارسال ایمیل از طریق سرور SMTP Gmail استفاده خواهیم کرد. در اینجا ساختار اصلی دستور cURL آمده است:

curl --url "smtp://$SMTP_SERVER:$SMTP_PORT" \
    --ssl-reqd \
    --mail-from "$SMTP_USERNAME" \
    --mail-rcpt "$TO" \
    --user "$SMTP_USERNAME:$SMTP_PASSWORD" \
    --tlsv1.2 \
    -T <(echo -e "$MESSAGE")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جمع آوری داده های مورد نیاز

برای ارسال ایمیل، باید داده های درخواست بالا را پر کنیم. این بدان معنی است که ما به داده های زیر نیاز داریم:

  • سرور SMTP: smtp.gmail.com
  • پورت SMTP: 587
  • نام کاربری SMTP: ایمیل حساب جیمیل شما
  • رمز عبور SMTP: رمز برنامه ایجاد شده در داشبورد مدیریت حساب Google شما
  • آدرس ایمیل گیرنده: آدرس ایمیل داروخانه
  • موضوع و متن ایمیل: محتوای واقعی ایمیل

پیام موجود در ایمیل در آخرین خط درخواست curl اضافه خواهد شد. پیام ایمیل باید شامل فهرستی از هدرها و سپس متن اصلی باشد. هر سرصفحه نام سرصفحه است و به دنبال آن یک دونقطه و سپس مقدار قرار می گیرد. ابتدایی ترین راه اندازی برای این می تواند چیزی شبیه به: Subject: \n\n. اینجا Subject: سربرگ است. برای من، چیزی شبیه به این خواهد بود:

SUBJECT="Preorder insulin"
BODY=$'Hello\n\nI would like a new insulin prescription.\n\nThanks,\nRobin'

MESSAGE="Subject: $SUBJECT\n\n$BODY"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آخرین کاری که می خواهم در این اسکریپت انجام دهم این است که یک کپی از ایمیل را به عنوان یک آدرس BCC برای خودم ارسال کنم. به این ترتیب، هر بار که این اتوماسیون فعال می شود، یک اعلان فشار از جیمیل دریافت می کنم. برای انجام این کار، باید اطمینان حاصل کنیم که گیرنده واقعی به عنوان یک سرصفحه به پیام در خط خودش اضافه شده است (To: $TO). اگر سپس یک گیرنده ایمیل دیگر را در درخواست curl اضافه کنیم، به لیست BCC منتقل می شود. بنابراین پیام من به این شکل خواهد بود:

MESSAGE="Subject: $SUBJECT\nTo: $TO\n\n$BODY"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر بعد اضافه کنیم --mail-rcpt "$SMTP_USERNAME"\ به درخواست curl، یک BCC به درخواست ارسال می شود $SMTP_USERNAME آدرس ایمیل.

اسکریپت کامل

در زیر اسکریپت کامل ارسال ایمیل به داروخانه آمده است. این شامل مدیریت خطا برای اطمینان از ارسال موفقیت آمیز ایمیل است.

function send_pharmacy_email() {
  # Set the default value to true to prevent sending too many emails to my pharmacy while testing
  test=${1:-true}

  SMTP_SERVER="smtp.gmail.com"
  SMTP_PORT="587"
  SMTP_USERNAME=""
  SMTP_PASSWORD=""

  # Recipient email address
  if [[ $test == 'true' ]]; then
      TO="testemail@test.com"
  else
      TO="mypharmacy@pharmacy.com"
  fi

  SUBJECT="Preorder insulin"
  BODY=$'Hello\n\nI would like a new insulin prescription.\n\nThanks,\nRobin'

  MESSAGE="Subject: $SUBJECT\nTo: $TO\n\n$BODY"

  curl --url "smtp://$SMTP_SERVER:$SMTP_PORT" \
      --ssl-reqd \
      --mail-from "$SMTP_USERNAME" \
      --mail-rcpt "$TO" \
      --mail-rcpt "$SMTP_USERNAME" \
      --user "$SMTP_USERNAME:$SMTP_PASSWORD" \
      --tlsv1.2 \
      -T <(echo -e "$MESSAGE")

  if [ $? -eq 0 ]; then
      echo "Done, e-mail sent to $TO"
      return 0
  else
      echo "Failed to send email"
      return 1
  fi
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آزمایش این در نتیجه ترمینال من در خروجی زیر است.

خروجی ترمینال پس از اجرای عملکرد

علاوه بر این، اثبات پودینگ همانطور که بود، در صندوق ورودی آدرس ایمیل آزمایشی من می بینم که ایمیل به درستی وارد شده است.

من یک متغیر آزمایشی اضافه کردم که به‌طور پیش‌فرض روی درست است تا از ارسال بیش از حد پیام‌ها به داروخانه‌ام در حین کار روی اسکریپت جلوگیری کند. این بدان معناست که هنگامی که اسکریپت باید به طور خودکار اجرا شود، باید یک آرگومان را به آن ارسال کنیم send_pharmacy_email برای اطمینان از اینکه دیگر در حالت تست اجرا نمی شود، در wrapper عمل کنید.

بعد چه می شود؟

در قسمت بعدی این مجموعه، ما بر روی پیاده‌سازی تابع add_calendar_task تمرکز خواهیم کرد که افزودن یک کار به تقویم Google را خودکار می‌کند تا به شما یادآوری کند که انسولین را بردارید.

با ما همراه باشید تا روند سفارش انسولین را یک مرحله در زمان ساده تر کنیم.

از اینکه دنبال می کنید متشکرم اگر سوال یا پیشنهادی دارید، در زیر نظر خود را با ما در میان بگذارید. فراموش نکنید که این پست را با هر کسی که ممکن است مفید باشد به اشتراک بگذارید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا