เชญเชฒเซ เชเชฎเซ เชคเซเชเชฒเซ เชเซเชเซเชจเซเชฒเซเชเซเชจเซ เชตเชฟเชเชพเชธ เชฅเชพเชฏ, เชเซเชจเชพ เช เชญเชฟเชเชฎเซเชจเซ เชฆเซเชฐ เชนเชเชฎเซเชถเชพ เชตเชฟเชเชพเชธเชจเซ เชชเชพเชเชณ เชฐเชนเซ เชเซ. เช เชเช เชธเชฐเชณ เชธเชเชเซเชฐเชฎเชฃ, เชฎเชพเชจเชตเซเชฏ เชชเชฐเชฟเชฌเชณเซ, เชคเชเชจเซเชเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซ เช เชฅเชตเชพ เช เชจเซเชฏ เชเชเชเชเชจเซ เชเชพเชฐเชฃเซ เชนเซเช เชถเชเซ เชเซ. เชกเซเชเชพ เชชเซเชฐเซเชธเซเชธเชฟเชเชเชจเชพ เชเซเชทเซเชคเซเชฐเชฎเชพเช, เชกเซเชเชพ เชธเซเชคเซเชฐเซเชคเซ เช เชญเชพเชเชฎเชพเช เชธเซเชฅเซ เชตเชงเซ เชเชคเซ เชเชฐเซ เชเซ. เชญเชฒเซ เชเชชเชฃเซ เชเชฎเชพเชเชฅเซ เชเซเชเชเชพเชฐเซ เชฎเซเชณเชตเชตเชพเชจเซเช เชเซเชเชฒเซเช เชธเชชเชจเซเช เชเซเชคเชพ เชนเซเชเช, เชชเชฐเชเชคเซ เช เชคเซเชฏเชพเชฐ เชธเซเชงเซ เชกเซเชเชพเชจเซ เชเช เชญเชพเช เชเชจเซเชธเซเชเชจเซเช เชฎเซเชธเซเชจเซเชเชฐเซเชธ เช เชจเซ เชเชฎเซเชเชฒเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชตเชงเซ เชชเซเชฐเชพเชเซเชจ เชซเซเชฐเซเชฎเซเชเชจเซ เชเชฒเซเชฒเซเช เชจ เชเชฐเชตเซ. เชนเซเช เชคเชฎเชจเซ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชฎเชพเชเซเชจเชพ เชตเชฟเชเชฒเซเชชเซเชฎเชพเชเชฅเซ เชเชเชจเซ เชกเชฟเชธเชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฎเชเชคเซเชฐเชฟเชค เชเชฐเซเช เชเซเช, เชคเชฎเซ เชเชฎเซเชเชฒเซเชธเชฎเชพเชเชฅเซ เชกเซเชเชพ เชเซเชตเซ เชฐเซเชคเซ เชฒเช เชถเชเซ เชเซ เชคเซ เชธเชฎเชเชพเชตเซ เชเซ.
เชชเซเชฐเชพเชเซเชคเชฟเชนเชพเชธเชฟเช
เชเชเชคเชฐเชตเซเชฏเชเซเชคเชฟเชคเซเชต เชธเชเชเชพเชฐเชฅเซ เชฎเชพเชเชกเซเชจเซ เชเชเชชเชจเซเช เชตเชเซเชเซเชจเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพเชจเชพ เชงเซเชฐเชฃเซ เชธเซเชงเซ เช-เชฎเซเชฒ เชฆเซเชตเชพเชฐเชพ เชนเชเซ เชชเชฃ เชเชฃเซ เชกเซเชเชพ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซ เชธเชพเชฐเซเช เชเซ เชเซ เชกเซเชเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เชเชจเซเชเชฐเชซเซเชธ เชฒเชเชตเชพเชจเซเช เช เชฅเชตเชพ เชเชซเชฟเชธเชฎเชพเช เชเชตเชพ เชฒเซเชเซเชจเซ เชฎเซเชเชตเชพเชจเซเช เชถเชเซเชฏ เชนเซเชฏ เชเซ เชเซเช เช เชฎเชพเชนเชฟเชคเซเชจเซ เชตเชงเซ เช เชจเซเชเซเชณ เชธเซเชคเซเชฐเซเชคเซเชฎเชพเช เชฆเชพเชเชฒ เชเชฐเชถเซ, เชชเชฐเชเชคเซ เชเชฃเซเชตเชพเชฐ เช เชถเชเซเชฏ เชจ เชชเชฃ เชฌเชจเซ. เชฎเซเช เชเซ เชตเชฟเชถเชฟเชทเซเช เชเชพเชฐเซเชฏเชจเซ เชธเชพเชฎเชจเซ เชเชฐเชตเซ เชชเชกเซเชฏเซ เชนเชคเซ เชคเซ เชเซเชเซเชฏเชพเชค CRM เชธเชฟเชธเซเชเชฎเชจเซ เชกเซเชเชพ เชตเซเชฐเชนเชพเชเชธ เชธเชพเชฅเซ เช เชจเซ เชชเชเซ OLAP เชธเชฟเชธเซเชเชฎ เชธเชพเชฅเซ เชเซเชกเชตเชพเชจเซเช เชนเชคเซเช. เชเชคเชฟเชนเชพเชธเชฟเช เชฐเซเชคเซ เชเชตเซเช เชฌเชจเซเชฏเซเช เชเซ เชเซ เช เชฎเชพเชฐเซ เชเชเชชเชจเซ เชฎเชพเชเซ เช เชธเชฟเชธเซเชเชฎเชจเซ เชเชชเชฏเซเช เชตเซเชฏเชตเชธเชพเชฏเชจเชพ เชเซเชเซเชเชธ เชเซเชทเซเชคเซเชฐเชฎเชพเช เช เชจเซเชเซเชณ เชนเชคเซ. เชคเซเชฅเซ, เชฆเชฐเซเช เชตเซเชฏเชเซเชคเชฟ เชเชฐเซเชเชฐ เช เชคเซเชคเซเชฏ-เชชเชเซเชท เชธเชฟเชธเซเชเชฎเชจเชพ เชกเซเชเชพ เชธเชพเชฅเซ เชชเชฃ เชเชพเชฐเซเชฏ เชเชฐเชตเชพ เชธเชเซเชทเชฎ เชฌเชจเชตเชพ เชฎเชพเชเชเซ เชเซ. เชธเซ เชชเซเชฐเชฅเชฎ, เช เชฒเชฌเชคเซเชค, เชเชชเชจ API เชฎเชพเชเชฅเซ เชกเซเชเชพ เชฎเซเชณเชตเชตเชพเชจเซ เชถเชเซเชฏเชคเชพเชจเซ เช เชญเซเชฏเชพเชธ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ. เชเชฎเชจเชธเซเชฌเซ, API เช เชคเชฎเชพเชฎ เชเชฐเซเชฐเซ เชกเซเชเชพ เชฎเซเชณเชตเชตเชพเชจเซ เชเชตเชฐเซ เชฒเซเชงเซเช เชจ เชนเชคเซเช, เช เชจเซ, เชธเชฐเชณ เชถเชฌเซเชฆเซเชฎเชพเช เชเชนเซเช เชคเซ, เชคเซ เชเชฃเซ เชฐเซเชคเซ เชเซเชเชฟเชฒ เชนเชคเซเช, เช เชจเซ เชตเชงเซ เชตเซเชฏเชพเชชเช เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชเชจเชฟเชเชฒ เชธเชชเซเชฐเซเช เชเชเซเชเชคเซ เชจ เชนเชคเซ เช เชฅเชตเชพ เชนเชพเชซ เชฐเชธเซเชคเซ เชฎเชณเซ เชถเชเซเชฏเซ เชจ เชนเชคเซ. เชชเชฐเชเชคเซ เช เชธเชฟเชธเซเชเชฎเซ เชธเชฎเชฏเชพเชเชคเชฐเซ เชเชฐเซเชเชพเชเชตเชจเซ เช เชจเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชฒเชฟเชเชเชจเชพ เชฐเซเชชเชฎเชพเช เชฎเซเชเชฒ เชฆเซเชตเชพเชฐเชพ เชเซเชฎ เชฅเชฏเซเชฒ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพเชจเซ เชคเช เชชเซเชฐเซ เชชเชพเชกเซ เชนเชคเซ.
เช เชจเซเชเชงเชตเซเช เชเซเชเช เชเซ เช เชเชเชฎเชพเชคเซเชฐ เชเซเชธ เชจเชฅเซ เชเซเชฎเชพเช เชตเซเชฏเชตเชธเชพเชฏ เชเชฎเซเชฒ เช เชฅเชตเชพ เชเชจเซเชธเซเชเชจเซเช เชฎเซเชธเซเชจเซเชเชฐ เชชเชพเชธเซเชฅเซ เชกเซเชเชพ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเชเชคเซ เชนเชคเซ. เชเซ เชเซ, เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชฎเซ เชซเชเซเชค เช เชฐเซเชคเซ เชกเซเชเชพเชจเซ เชญเชพเช เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชเชเชชเชจเซเชจเซ เชชเซเชฐเชญเชพเชตเชฟเชค เชเชฐเซ เชถเชเซเชฏเชพ เชจเชฅเซ.
เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ
ETL เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชฎเซเชเชพเชญเชพเชเซ Apache Airflow เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชธเชเชฆเชฐเซเชญเชฎเชพเช เช เชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชคเซ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ เชคเซ เชตเชงเซ เชธเชพเชฐเซ เชฐเซเชคเซ เชธเชฎเชเชตเชพ เชฎเชพเชเซ เช เชเซเชเซเชจเซเชฒเซเชเซเชฅเซ เช เชเชพเชฃ เชนเซเชฏ เชคเซเชตเชพ เชตเชพเชเช เชฎเชพเชเซ, เชนเซเช เชเซเชเชฒเชพเช เชชเซเชฐเชพเชฐเชเชญเชฟเช เชฎเซเชฆเซเชฆเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซเชถ.
เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เช เชเช เชฎเชซเชค เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชเซ เชเซเชจเซ เชเชชเชฏเซเช เชชเชพเชฏเชฅเซเชจเชฎเชพเช ETL (เชเชเซเชธเซเชเซเชฐเซเชเซเช-เชเซเชฐเชพเชจเซเชธเชซเซเชฐเซเชฎ-เชฒเซเชกเชฟเชเช) เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชฌเชจเชพเชตเชตเชพ, เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเชตเชพ เช เชจเซ เชฎเซเชจเชฟเชเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชเชฐเชซเซเชฒเซเชฎเชพเช เชฎเซเชเซเชฏ เชเซเชฏเชพเชฒ เช เชจเชฟเชฐเซเชฆเซเชถเชฟเชค เชเชธเชพเชฏเชเซเชฒเชฟเช เชเซเชฐเชพเชซ เชเซ, เชเซเชฏเชพเช เชเซเชฐเชพเชซเชจเชพ เชถเชฟเชฐเซเชฌเชฟเชเชฆเซเช เชเซเชเซเชเชธ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชเซ, เช เชจเซ เชเซเชฐเชพเชซเชจเซ เชเชฟเชจเชพเชฐเซเช เชจเชฟเชฏเชเชคเซเชฐเชฃ เช เชฅเชตเชพ เชฎเชพเชนเชฟเชคเซเชจเซ เชชเซเชฐเชตเชพเชน เชเซ. เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชซเชเซเชค เชเซเชเชชเชฃ เชชเชพเชฏเชฅเซเชจ เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชเชฐเซ เชถเชเซ เชเซ, เช เชฅเชตเชพ เชคเซ เชตเชฐเซเชเชจเชพ เชธเชเชฆเชฐเซเชญเชฎเชพเช เชเซเชฐเชฎเชฟเช เชฐเซเชคเซ เชเชฃเชพ เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชเชฐเชตเชพเชฅเซ เชตเชงเซ เชเชเชฟเชฒ เชคเชฐเซเช เชนเซเช เชถเชเซ เชเซ. เชธเซเชฅเซ เชตเชงเซ เชตเชพเชฐเชเชตเชพเชฐเชจเซ เชเชพเชฎเชเซเชฐเซ เชฎเชพเชเซ, เชคเซเชฏเชพเช เชชเชนเซเชฒเซเชฅเซ เช เชเชฃเชพ เชคเซเชฏเชพเชฐ เชตเชฟเชเชพเชธ เชเซ เชเซเชจเซ เชเชชเชฏเซเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชคเชฐเซเชเซ เชฅเช เชถเชเซ เชเซ. เชเชตเชพ เชตเชฟเชเชพเชธเชฎเชพเช เชถเชพเชฎเซเชฒ เชเซ:
- เชเชชเชฐเซเชเชฐเซ - เชเช เชเชเซเชฏเชพเชเชฅเซ เชฌเซเชเชพ เชธเซเชฅเชพเชจเซ เชกเซเชเชพ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชกเซเชเชพเชฌเซเช เชเซเชฌเชฒเชฎเชพเชเชฅเซ เชกเซเชเชพ เชตเซเชฐเชนเชพเชเชธเชฎเชพเช;
- เชธเซเชจเซเชธเชฐเซเชธ - เชเซเชเซเชเชธ เชเชเชจเชพเชจเซ เชเชเชจเชพเชจเซ เชฐเชพเชน เชเซเชตเชพ เชฎเชพเชเซ เช เชจเซ เชเซเชฐเชพเชซเชจเชพ เช เชจเซเชเชพเชฎเซ เชถเชฟเชฐเซเชฌเชฟเชเชฆเซเช เชชเชฐ เชจเชฟเชฏเชเชคเซเชฐเชฃเชจเชพ เชชเซเชฐเชตเชพเชนเชจเซ เชฆเชฟเชถเชพเชฎเชพเชจ เชเชฐเชตเชพ เชฎเชพเชเซ;
- เชนเซเชเซเชธ - เชจเซเชเชฒเชพ-เชธเซเชคเชฐเชจเซ เชเชพเชฎเชเซเชฐเซ เชฎเชพเชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชกเซเชเชพเชฌเซเช เชเซเชทเซเชเชเชฎเชพเชเชฅเซ เชกเซเชเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ (เชตเชฟเชงเชพเชจเซเชฎเชพเช เชตเชชเชฐเชพเชฏ เชเซ);
- เช เชจเซ เชคเซเชฅเซ เชชเชฐ
เช เชฒเซเชเชฎเชพเช เช
เชชเชพเชเซ เชเชฐเชซเซเชฒเซเชจเซเช เชตเชฟเชเชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชเชฐเชตเซเช เช
เชฏเซเชเซเชฏ เชฐเชนเซเชถเซ. เชธเชเชเซเชทเชฟเชชเซเชค เชชเชฐเชฟเชเชฏ เชเซเช เชถเชเชพเชฏ เชเซ
เชกเซเชเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เชนเซเช
เชธเซ เชชเซเชฐเชฅเชฎ, เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชชเชฃเซ เชเช เชนเซเช เชฒเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซเชจเซ เชธเชพเชฅเซ เชเชชเชฃเซ เชเชฐเซ เชถเชเซเช:
- เชเชฎเซเชฒ เชธเชพเชฅเซ เชเชจเซเชเซเช เชเชฐเซ
- เชฏเซเชเซเชฏ เชชเชคเซเชฐ เชถเซเชงเซ
- เชชเชคเซเชฐเชฎเชพเชเชฅเซ เชกเซเชเชพ เชฎเซเชณเชตเซ.
from airflow.hooks.base_hook import BaseHook
import imaplib
import logging
class IMAPHook(BaseHook):
def __init__(self, imap_conn_id):
"""
IMAP hook ะดะปั ะฟะพะปััะตะฝะธั ะดะฐะฝะฝัั
ั ัะปะตะบััะพะฝะฝะพะน ะฟะพััั
:param imap_conn_id: ะะดะตะฝัะธัะธะบะฐัะพั ะฟะพะดะบะปััะตะฝะธั ะบ ะฟะพััะต
:type imap_conn_id: string
"""
self.connection = self.get_connection(imap_conn_id)
self.mail = None
def authenticate(self):
"""
ะะพะดะบะปััะฐะตะผัั ะบ ะฟะพััะต
"""
mail = imaplib.IMAP4_SSL(self.connection.host)
response, detail = mail.login(user=self.connection.login, password=self.connection.password)
if response != "OK":
raise AirflowException("Sign in failed")
else:
self.mail = mail
def get_last_mail(self, check_seen=True, box="INBOX", condition="(UNSEEN)"):
"""
ะะตัะพะด ะดะปั ะฟะพะปััะตะฝะธั ะธะดะตะฝัะธัะธะบะฐัะพัะฐ ะฟะพัะปะตะดะฝะตะณะพ ะฟะธััะผะฐ,
ัะดะพะฒะปะตัะฒะพัะฐัััะตะณะพ ััะปะพะฒะธัะผ ะฟะพะธัะบะฐ
:param check_seen: ะัะผะตัะฐัั ะฟะพัะปะตะดะฝะตะต ะฟะธััะผะพ ะบะฐะบ ะฟัะพัะธัะฐะฝะฝะพะต
:type check_seen: bool
:param box: ะะฐะธะผะตะฝะพะฒะฐะฝะธั ััะธะบะฐ
:type box: string
:param condition: ะฃัะปะพะฒะธั ะฟะพะธัะบะฐ ะฟะธัะตะผ
:type condition: string
"""
self.authenticate()
self.mail.select(mailbox=box)
response, data = self.mail.search(None, condition)
mail_ids = data[0].split()
logging.info("ะ ััะธะบะต ะฝะฐะนะดะตะฝั ัะปะตะดัััะธะต ะฟะธััะผะฐ: " + str(mail_ids))
if not mail_ids:
logging.info("ะะต ะฝะฐะนะดะตะฝะพ ะฝะพะฒัั
ะฟะธัะตะผ")
return None
mail_id = mail_ids[0]
# ะตัะปะธ ัะฐะบะธั
ะฟะธัะตะผ ะฝะตัะบะพะปัะบะพ
if len(mail_ids) > 1:
# ะพัะผะตัะฐะตะผ ะพััะฐะปัะฝัะต ะฟัะพัะธัะฐะฝะฝัะผะธ
for id in mail_ids:
self.mail.store(id, "+FLAGS", "\Seen")
# ะฒะพะทะฒัะฐัะฐะตะผ ะฟะพัะปะตะดะฝะตะต
mail_id = mail_ids[-1]
# ะฝัะถะฝะพ ะปะธ ะพัะผะตัะธัั ะฟะพัะปะตะดะฝะตะต ะฟัะพัะธัะฐะฝะฝัะผ
if not check_seen:
self.mail.store(mail_id, "-FLAGS", "\Seen")
return mail_id
เชคเชฐเซเช เช เชเซ: เช เชฎเซ เชเชจเซเชเซเช เชเชฐเซเช เชเซเช, เชเซเชฒเซเชฒเซ เชธเซเชฅเซ เชธเซเชธเชเชเชค เช เชเซเชทเชฐ เชถเซเชงเซเช เชเซเช, เชเซ เชคเซเชฏเชพเช เช เชจเซเชฏ เชนเซเชฏ, เชคเซ เช เชฎเซ เชคเซเชจเซ เช เชตเชเชฃเซเช เชเซเช. เช เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชฅเชพเชฏ เชเซ, เชเชพเชฐเชฃ เชเซ เชชเชเซเชจเชพ เช เชเซเชทเชฐเซเชฎเชพเช เชชเชนเซเชฒเชพเชจเชพ เชฌเชงเชพ เชกเซเชเชพ เชนเซเชฏ เชเซ. เชเซ เช เชเชฟเชธเซเชธเซ เชจ เชนเซเชฏ เชคเซ, เชชเชเซ เชคเชฎเซ เชฌเชงเชพ เช เชเซเชทเชฐเซเชจเซ เชเชฐเซ เชชเชฐเชค เชเชฐเซ เชถเชเซ เชเซ, เช เชฅเชตเชพ เชชเซเชฐเชฅเชฎ เชเช เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเซ เชถเชเซ เชเซ, เช เชจเซ เชฌเชพเชเซเชจเชพ เชเชเชณเชจเชพ เชชเชพเชธ เชชเชฐ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชฌเชงเซเช, เชนเชเชฎเซเชถเชจเซ เชเซเชฎ, เชเชพเชฐเซเชฏ เชชเชฐ เชเชงเชพเชฐ เชฐเชพเชเซ เชเซ.
เช เชฎเซ เชนเซเชเชฎเชพเช เชฌเซ เชธเชนเชพเชฏเช เชเชพเชฐเซเชฏเซ เชเชฎเซเชฐเซเช เชเซเช: เชซเชพเชเชฒ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ เช เชจเซ เชเชฎเซเชเชฒเชฎเชพเชเชฅเซ เชฒเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชซเชพเชเชฒ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ. เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เชคเซเช เชเชชเชฐเซเชเชฐเชฎเชพเช เชเชธเซเชกเซ เชถเชเชพเชฏ เชเซ, เชคเซ เช เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเชตเชฐเซเชคเชจ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเซ. เชนเซเชเชฎเชพเช เชฌเซเชเซเช เชถเซเช เชเชฎเซเชฐเชตเซเช, เชซเชฐเซเชฅเซ, เชเชพเชฐเซเชฏ เชชเชฐ เชเชงเชพเชฐ เชฐเชพเชเซ เชเซ: เชเซ เชชเชคเซเชฐเชฎเชพเช เชซเชพเชเชฒเซ เชคเชฐเชค เช เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ, เชคเซ เชชเชเซ เชคเชฎเซ เชชเชคเซเชฐเชฎเชพเช เชเซเชกเชพเชฃเซ เชกเชพเชเชจเชฒเซเชก เชเชฐเซ เชถเชเซ เชเซ, เชเซ เชชเชคเซเชฐเชฎเชพเช เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เชเซ, เชคเซ เชคเชฎเชพเชฐเซ เชชเชคเซเชฐเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เชตเชเซเชฐเซ เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชชเชคเซเชฐ เชเชฐเซเชเชพเชเชตเชจเซ เชเช เชฒเชฟเชเช เชธเชพเชฅเซ เชเชตเซ เชเซ, เชเซ เชฎเชพเชฐเซ เชเซเชเซเชเชธ เชเชเซเชฏเชพเช เชฎเซเชเชตเชพเชจเซ เช เชจเซ เชเชเชณเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชถเชฐเซ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
def download_from_url(self, url, path, chunk_size=128):
"""
ะะตัะพะด ะดะปั ัะบะฐัะธะฒะฐะฝะธั ัะฐะนะปะฐ
:param url: ะะดัะตั ะทะฐะณััะทะบะธ
:type url: string
:param path: ะัะดะฐ ะฟะพะปะพะถะธัั ัะฐะนะป
:type path: string
:param chunk_size: ะะพ ัะบะพะปัะบะพ ะฑะฐะนัะพะฒ ะฟะธัะฐัั
:type chunk_size: int
"""
r = requests.get(url, stream=True)
with open(path, "wb") as fd:
for chunk in r.iter_content(chunk_size=chunk_size):
fd.write(chunk)
def download_mail_href_attachment(self, mail_id, path):
"""
ะะตัะพะด ะดะปั ัะบะฐัะธะฒะฐะฝะธั ัะฐะนะปะฐ ะฟะพ ัััะปะบะต ะธะท ะฟะธััะผะฐ
:param mail_id: ะะดะตะฝัะธัะธะบะฐัะพั ะฟะธััะผะฐ
:type mail_id: string
:param path: ะัะดะฐ ะฟะพะปะพะถะธัั ัะฐะนะป
:type path: string
"""
response, data = self.mail.fetch(mail_id, "(RFC822)")
raw_email = data[0][1]
raw_soup = raw_email.decode().replace("r", "").replace("n", "")
parse_soup = BeautifulSoup(raw_soup, "html.parser")
link_text = ""
for a in parse_soup.find_all("a", href=True, text=True):
link_text = a["href"]
self.download_from_url(link_text, path)
เชเซเชก เชธเชฐเชณ เชเซ, เชคเซเชฅเซ เชคเซเชจเซ เชญเชพเชเซเชฏเซ เช เชตเชงเซ เชธเชฎเชเซเชคเซเชจเซ เชเชฐเซเชฐ เชเซ. เชนเซเช เชคเชฎเชจเซ เชฎเชพเชคเซเชฐ เชเชพเชฆเซเช เชฐเซเชเชพ imap_conn_id เชตเชฟเชถเซ เชเชนเซเชถ. เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชเชจเซเชเซเชถเชจ เชชเชฐเชฟเชฎเชพเชฃเซ (เชฒเซเชเชฟเชจ, เชชเชพเชธเชตเชฐเซเชก, เชธเชฐเชจเชพเชฎเซเช เช เชจเซ เช เชจเซเชฏ เชชเชฐเชฟเชฎเชพเชฃเซ) เชธเซเชเซเชฐ เชเชฐเซ เชเซ เชเซ เชธเซเชเซเชฐเชฟเชเช เชเชณเชเชเชฐเซเชคเชพ เชฆเซเชตเชพเชฐเชพ เชเชเซเชธเซเชธ เชเชฐเซ เชถเชเชพเชฏ เชเซ. เชฆเซเชทเซเชเชฟเชจเซ เชฐเซเชคเซ, เชเชจเซเชเซเชถเชจ เชฎเซเชจเซเชเชฎเซเชจเซเช เชเชจเชพ เชเซเชตเซเช เชฒเชพเชเซ เชเซ
เชกเซเชเชพเชจเซ เชฐเชพเชน เชเซเชตเชพ เชฎเชพเชเซ เชธเซเชจเซเชธเชฐ
เช เชฎเซ เชชเชนเซเชฒเซเชฅเซ เช เชเชพเชฃเซเช เชเซเช เชเซ เชฎเซเชเชฒเชฎเชพเชเชฅเซ เชกเซเชเชพ เชเซเชตเซ เชฐเซเชคเซ เชเชจเซเชเซเช เชเชฐเชตเซ เช เชจเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเซ, เช เชฎเซ เชนเชตเซ เชคเซเชฎเชจเซ เชฐเชพเชน เชเซเชตเชพ เชฎเชพเชเซ เชธเซเชจเซเชธเชฐ เชฒเชเซ เชถเชเซเช เชเซเช. เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชคเซ เชคเชฐเชค เช เชเชชเชฐเซเชเชฐ เชฒเชเชตเชพเชจเซเช เชเชพเชฎ เชเชฐเชคเซเช เชจเชฅเซ เชเซ เชกเซเชเชพ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชถเซ, เชเซ เชเซเช เชนเซเชฏ, เชเชพเชฐเชฃ เชเซ เช เชจเซเชฏ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชฎเซเชเชฒเชฎเชพเชเชฅเซ เชชเซเชฐเชพเชชเซเชค เชกเซเชเชพเชจเชพ เชเชงเชพเชฐเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ, เชเซเชฎเชพเช เช เชจเซเชฏ เชธเซเชฐเซเชคเซ (API, เชเซเชฒเชฟเชซเซเชจเซ) เชฎเชพเชเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชกเซเชเชพ เชฒเซ เชเซ. , เชตเซเชฌ เชฎเซเชเซเชฐเชฟเชเซเชธ, เชตเชเซเชฐเซ.) เชตเชเซเชฐเซ). เชนเซเช เชคเชฎเชจเซ เชเช เชเชฆเชพเชนเชฐเชฃ เชเชชเซเชถ. CRM เชธเชฟเชธเซเชเชฎเชฎเชพเช เชเช เชจเชตเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฆเซเชเชพเชฏเซ เชเซ, เช เชจเซ เช เชฎเซ เชนเชเซ เชชเชฃ เชคเซเชจเชพ UUID เชตเชฟเชถเซ เชเชพเชฃเชคเชพ เชจเชฅเซ. เชชเชเซ, เชเซเชฏเชพเชฐเซ SIP เชเซเชฒเชฟเชซเซเชจเซเชฎเชพเชเชฅเซ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช เชเซเช, เชคเซเชฏเชพเชฐเซ เช เชฎเซ เชคเซเชจเชพ UUID เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒเชพ เชเซเชฒเซเชธ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเชถเซเช, เชชเชฐเชเชคเซ เช เชฎเซ เชคเซเชจเซ เชธเชพเชเชตเซ เช เชจเซ เชคเซเชจเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซเชถเซเช เชจเชนเซเช. เชเชตเซ เชฌเชพเชฌเชคเซเชฎเชพเช, เชกเซเชเชพเชจเซ เช เชตเชฒเชเชฌเชจเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฐเชพเชเชตเซ เชเชฐเซเชฐเซ เชเซ, เชเชพเชธ เชเชฐเซเชจเซ เชเซ เชคเซ เชตเชฟเชตเชฟเชง เชธเซเชฐเซเชคเซเชฎเชพเชเชฅเซ เชนเซเชฏ. เช, เช เชฒเชฌเชคเซเชค, เชกเซเชเชพเชจเซ เช เชเชเชกเชฟเชคเชคเชพ เชเชพเชณเชตเชตเชพ เชฎเชพเชเซ เช เชชเซเชฐเชคเชพ เชชเชเชฒเชพเช เชเซ, เชชเชฐเชเชคเซ เชเซเชเชฒเชพเช เชเชฟเชธเซเชธเชพเชเชฎเชพเช เชคเซ เชเชฐเซเชฐเซ เชเซ. เชนเชพ, เช เชจเซ เชธเชเชธเชพเชงเชจเซเชจเซ เชเชฌเชเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชจเชฟเชทเซเชเซเชฐเชฟเชฏเชคเชพ เชชเชฃ เช เชคเชพเชฐเซเชเชฟเช เชเซ.
เชเชฎ, เชเซ เชฎเซเชฒเชฎเชพเช เชจเชตเซ เชฎเชพเชนเชฟเชคเซ เชนเชถเซ เชคเซ เช เชฎเชพเชฐเซเช เชธเซเชจเซเชธเชฐ เชเซเชฐเชพเชซเชจเชพ เช เชจเซเชเชพเชฎเซ เชถเชฟเชฐเซเชฌเชฟเชเชฆเซเช เชถเชฐเซ เชเชฐเชถเซ, เช เชจเซ เช เชเชพเชเชจเซ เชฎเชพเชนเชฟเชคเซเชจเซ เช เชชเซเชฐเชธเซเชคเซเชค เชคเชฐเซเชเซ เชชเชฃ เชเชฟเชนเซเชจเชฟเชค เชเชฐเชถเซ.
from airflow.sensors.base_sensor_operator import BaseSensorOperator
from airflow.utils.decorators import apply_defaults
from my_plugin.hooks.imap_hook import IMAPHook
class MailSensor(BaseSensorOperator):
@apply_defaults
def __init__(self, conn_id, check_seen=True, box="Inbox", condition="(UNSEEN)", *args, **kwargs):
super().__init__(*args, **kwargs)
self.conn_id = conn_id
self.check_seen = check_seen
self.box = box
self.condition = condition
def poke(self, context):
conn = IMAPHook(self.conn_id)
mail_id = conn.get_last_mail(check_seen=self.check_seen, box=self.box, condition=self.condition)
if mail_id is None:
return False
else:
return True
เช เชฎเซ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเช เชเซเช เช เชจเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช
เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เช เชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเซ เชเช เช เชฒเช เชเชชเชฐเซเชเชฐ เชฒเชเซ เชถเชเซ เชเซ, เชคเชฎเซ เชคเซเชฏเชพเชฐ เชเชฐเซเชฒเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. เชเชพเชฐเชฃ เชเซ เชคเชฐเซเช เชนเชเซ เชชเชฃ เชคเซเชเซเช เชเซ - เชชเชคเซเชฐเชฎเชพเชเชฅเซ เชกเซเชเชพ เชฒเซเชตเชพ เชฎเชพเชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชนเซเช เชฎเชพเชจเช PythonOperator เชธเซเชเชตเซ เชเซ
from airflow.models import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.sensors.my_plugin import MailSensor
from my_plugin.hooks.imap_hook import IMAPHook
start_date = datetime(2020, 4, 4)
# ะกัะฐะฝะดะฐััะฝะพะต ะบะพะฝัะธะณััะธัะพะฒะฐะฝะธะต ะณัะฐัะฐ
args = {
"owner": "example",
"start_date": start_date,
"email": ["[email protected]"],
"email_on_failure": False,
"email_on_retry": False,
"retry_delay": timedelta(minutes=15),
"provide_context": False,
}
dag = DAG(
dag_id="test_etl",
default_args=args,
schedule_interval="@hourly",
)
# ะะฟัะตะดะตะปัะตะผ ัะตะฝัะพั
mail_check_sensor = MailSensor(
task_id="check_new_emails",
poke_interval=10,
conn_id="mail_conn_id",
timeout=10,
soft_fail=True,
box="my_box",
dag=dag,
mode="poke",
)
# ะคัะฝะบัะธั ะดะปั ะฟะพะปััะตะฝะธั ะดะฐะฝะฝัั
ะธะท ะฟะธััะผะฐ
def prepare_mail():
imap_hook = IMAPHook("mail_conn_id")
mail_id = imap_hook.get_last_mail(check_seen=True, box="my_box")
if mail_id is None:
raise AirflowException("Empty mailbox")
conn.download_mail_href_attachment(mail_id, "./path.zip")
prepare_mail_data = PythonOperator(task_id="prepare_mail_data", default_args=args, dag=dag, python_callable= prepare_mail)
# ะะฟะธัะฐะฝะธะต ะพััะฐะปัะฝัั
ะฒะตััะธะฝ ะณัะฐัะฐ
...
# ะะฐะดะฐะตะผ ัะฒัะทั ะฝะฐ ะณัะฐัะต
mail_check_sensor >> prepare_mail_data
prepare_data >> ...
# ะะฟะธัะฐะฝะธะต ะพััะฐะปัะฝัั
ะฟะพัะพะบะพะฒ ัะฟัะฐะฒะปะตะฝะธั
เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เชเซ เชคเชฎเชพเชฐเซ เชเซเชฐเซเชชเซเชฐเซเช เชฎเซเชเชฒ เชชเชฃ mail.ru เชชเชฐ เชเซ, เชคเซ เชชเชเซ เชคเชฎเซ เชตเชฟเชทเชฏ, เชชเซเชฐเซเชทเช, เชตเชเซเชฐเซ เชฆเซเชตเชพเชฐเชพ เชชเชคเซเชฐเซ เชถเซเชงเชตเชพ เชฎเชพเชเซ เชธเชฎเชฐเซเชฅ เชนเชถเซ เชจเชนเซเช. เชชเชพเชเชพ 2016 เชฎเชพเช, เชคเซเชเช เชคเซเชจเซ เชฐเชเซ เชเชฐเชตเชพเชจเซเช เชตเชเชจ เชเชชเซเชฏเซเช เชนเชคเซเช, เชชเชฐเชเชคเซ เชฆเซเชเซเชคเซ เชฐเซเชคเซ เชคเซเชฎเชจเซ เชตเชฟเชเชพเชฐ เชฌเชฆเชฒเชพเช เชเชฏเซ เชนเชคเซ. เชฎเซเช เชเชฐเซเชฐเซ เช เชเซเชทเชฐเซ เชฎเชพเชเซ เช เชฒเช เชซเซเชฒเซเชกเชฐ เชฌเชจเชพเชตเซเชจเซ เช เชจเซ เชฎเซเชเชฒ เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชเชฐเซเชฐเซ เช เชเซเชทเชฐเซ เชฎเชพเชเซ เชซเชฟเชฒเซเชเชฐ เชธเซเช เชเชฐเซเชจเซ เช เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชเชฐเซ เชเซ. เชเชฎ, เชถเซเชง เชฎเชพเชเซ เชซเชเซเชค เชเชฐเซเชฐเซ เช เชเซเชทเชฐเซ เช เชจเซ เชถเชฐเชคเซ, เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชซเชเซเชค (เช เชฆเซเชฐเชถเซเชฏ) เช เชซเซเชฒเซเชกเชฐเชฎเชพเช เชชเซเชฐเชตเซเชถ เชเชฐเซ.
เชธเชพเชฐเชพเชเชถ เชเชชเชคเชพ, เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชจเซเชเซเชจเซ เชเซเชฐเชฎ เชเซ: เช
เชฎเซ เชคเชชเชพเชธ เชเชฐเซเช เชเซเช เชเซ เชคเซเชฏเชพเช เชจเชตเชพ เช
เชเซเชทเชฐเซ เชเซ เชเซ เชเซ เชถเชฐเชคเซเชจเซ เชชเซเชฐเซเชฃ เชเชฐเซ เชเซ, เชเซ เชคเซเชฏเชพเช เชนเซเชฏ, เชคเซ เช
เชฎเซ เชเซเชฒเซเชฒเชพ เช
เชเซเชทเชฐเชจเซ เชฒเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฐเซเชเชพเชเชต เชกเชพเชเชจเชฒเซเชก เชเชฐเซเช เชเซเช.
เชเซเชฒเซเชฒเชพ เชฌเชฟเชเชฆเซเช เชนเซเช เชณ, เชคเซ เช
เชตเชเชฃเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เช เชเชฐเซเชเชพเชเชตเชจเซ เช
เชจเชชเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชเชฐเซเชเชพเชเชตเชฎเชพเชเชฅเซ เชกเซเชเชพ เชธเชพเชซ เช
เชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เช
เชจเซ เชชเชฐเชฟเชฃเชพเชฎเซ, เชเชเซ เชตเชธเซเชคเซ ETL เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชชเชพเชเชชเชฒเชพเชเชจเชฎเชพเช เชเชเชณ เชตเชงเชถเซ, เชชเชฐเชเชคเซ เช เชชเชนเซเชฒเชพเชฅเซ เช เชเชเชณ เชเซ. เชฒเซเชเชจเซ เช
เชตเชเชพเชถ. เชเซ เชคเซ เชฐเชธเชชเซเชฐเชฆ เช
เชจเซ เชเชชเชฏเซเชเซ เชฌเชจเซเชฏเซเช, เชคเซ เชนเซเช เชฐเชพเชเซเชเซเชถเซเชฅเซ เช
เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชฎเชพเชเซ ETL เชธเซเชฒเซเชฏเซเชถเชจเซเชธ เช
เชจเซ เชคเซเชฎเชจเชพ เชญเชพเชเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชตเชพเชจเซเช เชเชพเชฒเซ เชฐเชพเชเซเชถ.
เชธเซเชฐเซเชธ: www.habr.com