ایمیل بزن، ایجنت برات پولریکوئست باز کنه
خلاصهٔ کاملتر
نویسنده میگه بهترین رابط اتوماسیون همونیه که هر روز ازش استفاده میکنی. قبلاً دربارهٔ راهانداختن ایجنت از روی ایشوهای گیتهاب نوشته بوده، ولی مشکلش اینه که باید گیتهاب رو باز کنی و کلیک کنی؛ رو دسکتاپ اوکیه، رو موبایل زجرآوره. راهحل تمیزتر از نظر اون ایمیله: روی هر دستگاهی هست، ذاتاً ناهمگامه و معمولاً تنها راه اشتراکگذاریه که همهٔ اپهای موبایل دارن.
جریان کار پنج تیکهست و هر تیکه یه کار کوچیک میکنه: SES ایمیل دامنه رو میگیره و پیام خام رو تو S3 میریزه؛ یه Lambda فرستنده رو تأیید و ایمیل رو پارس میکنه و میفهمه منظورت کدوم مخزن بوده؛ بعد با repository_dispatch یه ورکفلو رو تو همون ریپو راه میندازه؛ گیتهاب اکشنز ایجنت رو با متن ایمیل بهعنوان پرامپت اجرا میکنه؛ و ایجنت یه ایشو ثبت میکنه و یه پولریکوئست باز میکنه.
به گفتهٔ نویسنده، دریافت ایمیل همون بخشیه که خیلیها نمیدونن SES بلده. برای گرفتن ایمیل یه دامنه سه چیز لازمه: تأیید دامنه تو SES، یه رکورد MX که به اندپوینت ورودی SES منطقهت اشاره کنه، و یه receipt rule که بگه با ایمیل مطابق چی کار کنه. ترتیب اکشنها هم مهمه: اول تو S3 بنویس بعد Lambda رو صدا بزن، تا Lambda بتونه کل MIME رو بخونه.
حساسترین قدم، تأیید فرستندهست. نویسنده تأکید میکنه جعل آدرس ایمیل بینهایت سادهست، پس اگه هر کسی بتونه به اون آدرس ایمیل بزنه و ایجنتی رو راه بندازه که رو مخزنهات پولریکوئست باز میکنه، عملاً یه مسیر اجرای کد از راه دور با رابط دوستداشتنی ساختی. اولین کار Lambda باید «نه گفتن» باشه.
خوشبختانه SES خودش نتیجهٔ بررسی اسپم، ویروس، SPF، DKIM و DMARC رو داخل رویداد بهت میده و کافیه همهشون رو چک کنی و بعد فرستنده رو با یه لیست مجاز بسنجی:
const verdictsPass =
v.spamVerdict.status === 'PASS' &&
v.virusVerdict.status === 'PASS' &&
v.spfVerdict.status === 'PASS' &&
v.dkimVerdict.status === 'PASS' &&
v.dmarcVerdict.status === 'PASS'نویسنده میگه DKIM و DMARC همون چیزین که این کارو امن میکنن، چون هدر From جعلی امضای DKIM رو رد میکنه و SES این شکست رو مجانی گزارش میده؛ لیست مجاز هم قفل دومه تا حتی یه ایمیل کاملاً معتبر از یه غریبه هم ایجنت تو رو اجرا نکنه. اگه تأیید رد شد، فقط لاگ کن و تموم: نه dispatch، نه ایجنت، نه پولریکوئست.
بعد از تأیید، MIME خام از S3 خونده میشه و با mailparser به فیلدهای ساختاریافته تبدیل میشه. قرارداد سادهست: موضوع یعنی کدوم مخزن بهعلاوهٔ یه عنوان کوتاه، و متن یعنی چی میخوای. نکتهٔ ظریفش دیکتهی صوتیه که اسم ریپو رو خراب میکنه — my-site میشه «my site» — پس تطبیق باید فازیتر باشه و مهمتر از اون، اگه تطبیق قطعی نبود هیچ کاری نکنه.
تیکهٔ آخر repository_dispatch ئه: یه قابلیت گیتهاب که به سیستم بیرونی اجازه میده یه ورکفلو رو راه بندازه و یه client_payload دلخواه بهش پاس بده. همین payload متن ایمیل رو به ایجنت میرسونه. نویسنده این ورکفلوها رو روی گیتهاب اکشنز، Netlify Agent Runners و Cursor Agents اجرا میکنه.
نکات کلیدی:
- ایمیل بهعنوان رابط اتوماسیون: روی هر دستگاهی هست و ذاتاً ناهمگامه
- SES ایمیل ورودی رو میگیره، تو S3 ذخیره میکنه و Lambda رو صدا میزنه
- تأیید SPF، DKIM، DMARC و یه لیست فرستندهٔ مجاز غیرقابلحذفه
- موضوع ایمیل = مخزن، متن ایمیل = درخواست؛ تطبیق نامطمئن یعنی هیچ کاری نکن
- repository_dispatch پیام رو به گیتهاب اکشنز و از اونجا به ایجنت میرسونه




