เด…เดชเตเดชเดพเดšเตเดšเต† เดŽเดฏเตผเดซเตเดฒเต‹เดฏเดฟเดฒเต† เด‡เดฎเต†เดฏเดฟเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ ETL เดชเตเดฐเด•เตเดฐเดฟเดฏ

เด…เดชเตเดชเดพเดšเตเดšเต† เดŽเดฏเตผเดซเตเดฒเต‹เดฏเดฟเดฒเต† เด‡เดฎเต†เดฏเดฟเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ ETL เดชเตเดฐเด•เตเดฐเดฟเดฏ

เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏ เดŽเดคเตเดฐเดฎเดพเดคเตเดฐเด‚ เดตเดฟเด•เดธเดฟเดšเตเดšเดพเดฒเตเด‚, เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดŸ เดธเดฎเต€เดชเดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐ เดŽเดชเตเดชเต‹เดดเตเด‚ เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเต เดชเดฟเดจเตเดจเดฟเดฒเดพเดฃเต. เด‡เดคเต เดธเตเด—เดฎเดฎเดพเดฏ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚, เดฎเดพเดจเตเดทเดฟเด• เด˜เดŸเด•เด™เตเด™เตพ, เดธเดพเด™เตเด•เต‡เดคเดฟเด• เด†เดตเดถเตเดฏเด™เตเด™เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเต†เดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด•เดพเดฐเดฃเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚. เดกเดพเดฑเตเดฑ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดฎเต‡เด–เดฒเดฏเดฟเตฝ, เดˆ เดญเดพเด—เดคเตเดคเต เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดตเต†เดณเดฟเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเต เดกเดพเดฑเตเดฑ เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดพเดฃเต. เด‡เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดฐเด•เตเดทเดชเตเดชเต†เดŸเดพเตป เดžเด™เตเด™เตพ เดŽเดคเตเดฐเดฎเดพเดคเตเดฐเด‚ เดธเตเดตเดชเตเดจเด‚ เด•เดพเดฃเตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเดฒเตเด‚, เด‡เดคเตเดตเดฐเต† เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด’เดฐเต เดญเดพเด—เด‚ เดคเตฝเด•เตเดทเดฃ เดธเดจเตเดฆเต‡เดถเดตเดพเดนเด•เดฐเดฟเดฒเตเด‚ เด‡เดฎเต†เดฏเดฟเดฒเตเด•เดณเดฟเดฒเตเด‚ เด…เดฏเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เด•เต‚เดŸเตเดคเตฝ เดชเตเดฐเดพเดคเดจ เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เตพ เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ. เด…เดชเตเดชเดพเดšเตเดšเต† เดŽเดฏเตผเดซเตเดฒเต‹เดฏเตโ€Œเด•เตเด•เตเดณเตเดณ เด“เดชเตเดทเดจเตเด•เดณเดฟเดฒเตŠเดจเตเดจเต เดกเดฟเดธเตเด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เดจเดฟเด™เตเด™เดณเต† เด•เตเดทเดฃเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดฎเต†เดฏเดฟเดฒเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเด™เตเด™เดจเต† เดกเดพเดฑเตเดฑ เดŽเดŸเตเด•เตเด•เดพเด‚ เดŽเดจเตเดจเต เดšเดฟเดคเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดšเดฐเดฟเดคเตเดฐเดพเดคเต€เดคเด•เดพเดฒเด‚

เดตเตเดฏเด•เตเดคเดฟเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดฎเตเดคเตฝ เด•เดฎเตเดชเดจเดฟเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเตเดฑเต† เดฎเดพเดจเดฆเดฃเตเดกเด™เตเด™เตพ เดตเดฐเต† เด‡-เดฎเต†เดฏเดฟเตฝ เดตเดดเดฟ เดงเดพเดฐเดพเดณเด‚ เดกเดพเดฑเตเดฑ เด‡เดชเตเดชเต‹เดดเตเด‚ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต. เดกเดพเดฑเตเดฑ เดจเต‡เดŸเตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดŽเดดเตเดคเตเด•เดฏเต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดˆ เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เต‚เดŸเตเดคเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏ เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดจเตฝเด•เตเดจเตเดจ เด†เดณเตเด•เดณเต† เด“เดซเต€เดธเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดจเดฒเตเดฒเดคเดพเดฃเต, เดชเด•เตเดทเต‡ เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เด‡เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฏเต‡เด•เตเด•เดฟเดฒเตเดฒ. เด•เตเดชเตเดฐเดธเดฟเดฆเตเดงเดฎเดพเดฏ CRM เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเต† เดกเดพเดฑเตเดฑ เดตเต†เดฏเตผเดนเต—เดธเดฟเดฒเต‡เด•เตเด•เตเด‚ เดคเตเดŸเตผเดจเตเดจเต OLAP เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต‡เด•เตเด•เตเด‚ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต เดžเดพเตป เดจเต‡เดฐเดฟเดŸเตเดŸ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดšเตเดฎเดคเดฒ. เดšเดฐเดฟเดคเตเดฐเดชเดฐเดฎเดพเดฏเดฟ เด…เด™เตเด™เดจเต† เดธเด‚เดญเดตเดฟเดšเตเดšเต, เดžเด™เตเด™เดณเตเดŸเต† เด•เดฎเตเดชเดจเดฟเด•เตเด•เต เดˆ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฌเดฟเดธเดฟเดจเดธเต เดฎเต‡เด–เดฒเดฏเดฟเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เดˆ เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑเดฏเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด’เดฐเต เด“เดชเตเดชเตบ เดŽเดชเดฟเดเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดจเต‡เดŸเดพเดจเตเดณเตเดณ เดธเดพเดงเตเดฏเดค เดชเด เดฟเดšเตเดšเต. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดกเดพเดฑเตเดฑเดฏเตเด‚ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเต 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 เดŽเดจเตเดจ เดฎเดพเดœเดฟเด•เต เดฒเตˆเดจเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚. เด’เดฐเต เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดเดกเดจเตเดฑเดฟเดซเดฏเตผ เดตเดดเดฟ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด•เดฃเด•เตเดทเตป เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ (เดฒเต‹เด—เดฟเตป, เดชเดพเดธเตโ€Œเดตเต‡เดกเต, เดตเดฟเดฒเดพเดธเด‚, เดฎเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ) เด…เดชเตเดชเดพเดšเตเดšเต† เดŽเดฏเตผเดซเตเดฒเต‹ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดฆเตƒเดถเตเดฏเดชเดฐเดฎเดพเดฏเดฟ, เด•เดฃเด•เตเดทเตป เดฎเดพเดจเต‡เดœเตเดฎเต†เดจเตเดฑเต เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต

เด…เดชเตเดชเดพเดšเตเดšเต† เดŽเดฏเตผเดซเตเดฒเต‹เดฏเดฟเดฒเต† เด‡เดฎเต†เดฏเดฟเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ ETL เดชเตเดฐเด•เตเดฐเดฟเดฏ

เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เดธเต†เตปเดธเตผ

เดฎเต†เดฏเดฟเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดŽเด™เตเด™เดจเต† เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เด…เดฑเดฟเดฏเดพเดตเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดตเดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดชเตเดชเต‹เตพ เด’เดฐเต เดธเต†เตปเดธเตผ เดŽเดดเตเดคเดพเด‚. เดŽเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดกเดพเดฑเตเดฑ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เด‰เดŸเดจเดŸเดฟ เดŽเดดเตเดคเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดฎเต†เดฏเดฟเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดฒเดญเดฟเดšเตเดš เดกเดพเดฑเตเดฑเดฏเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เดฎเดฑเตเดฑเต เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เดณเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดฎเดฑเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดกเดพเดฑเตเดฑ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเดต เด‰เตพเดชเตเดชเต†เดŸเต† (API, เดŸเต†เดฒเดฟเดซเต‹เดฃเดฟ, เดตเต†เดฌเต เดฎเต†เดŸเตเดฐเดฟเด•เตเดธเต, เดฎเตเดคเดฒเดพเดฏเดต) เดฎเตเดคเดฒเดพเดฏเดต). เดžเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดคเดฐเดพเด‚. CRM เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เด’เดฐเต เดชเตเดคเดฟเดฏ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต, เด…เดฆเตเดฆเต‡เดนเดคเตเดคเดฟเดจเตเดฑเต† 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

เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดกเดพเดฑเตเดฑ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดŽเดดเตเดคเดพเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เด‡เดคเตเดตเดฐเต† เดฒเต‹เดœเดฟเด•เต เดจเดฟเดธเตเดธเดพเดฐเดฎเดพเดฏเดคเดฟเดจเดพเตฝ - เด…เด•เตเดทเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดŽเดŸเตเด•เตเด•เดพเตป, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดžเดพเตป เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดชเตˆเดคเตเดคเตบ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต

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 เตฝ, เด…เดตเตผ เด…เดคเต เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดคเต, เดชเด•เตเดทเต‡ เดชเตเดฐเดคเตเดฏเด•เตเดทเดคเตเดคเดฟเตฝ เด…เดตเดฐเตเดŸเต† เดฎเดจเดธเตเดธเต เดฎเดพเดฑเตเดฑเดฟ. เด†เดตเดถเตเดฏเดฎเดพเดฏ เด…เด•เตเดทเดฐเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดซเต‹เตพเดกเตผ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต เดฎเต†เดฏเดฟเตฝ เดตเต†เดฌเต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเตฝ เด†เดตเดถเตเดฏเดฎเดพเดฏ เด…เด•เตเดทเดฐเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดซเดฟเตฝเดŸเตเดŸเตผ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเต เดžเดพเตป เดˆ เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเต. เด…เดคเดฟเดจเดพเตฝ, เดคเดฟเดฐเดฏเดฒเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด…เด•เตเดทเดฐเด™เตเด™เดณเตเด‚ เดตเตเดฏเดตเดธเตเดฅเด•เดณเตเด‚ เดฎเดพเดคเตเดฐเด‚, เดŽเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, (UNSEEN) เดˆ เดซเต‹เตพเดกเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเด•.

เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด•เตเดฐเดฎเด‚ เด‰เดฃเตเดŸเต: เดตเตเดฏเดตเดธเตเดฅเด•เตพ เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดคเดฟเดฏ เด…เด•เตเดทเดฐเด™เตเด™เตพ เด‰เดฃเตเดŸเต‹ เดŽเดจเตเดจเต เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต, เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด…เดตเดธเดพเดจ เด…เด•เตเดทเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฒเดฟเด™เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เด†เตผเด•เตเด•เตˆเดตเต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
เด…เดตเดธเดพเดจ เดกเต‹เดŸเตเดŸเตเด•เตพเด•เตเด•เต เด•เต€เดดเดฟเตฝ, เดˆ เด†เตผเด•เตเด•เตˆเดตเต เด…เตบเดชเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚, เด†เตผเด•เตเด•เตˆเดตเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดฎเดพเดฏเตโ€Œเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚, เด…เดคเดฟเดจเตเดฑเต† เดซเดฒเดฎเดพเดฏเดฟ, เดฎเตเดดเตเดตเตป เด•เดพเดฐเตเดฏเด™เตเด™เดณเตเด‚ ETL เดชเตเดฐเต‹เดธเดธเตเดธเดฟเดจเตเดฑเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด‚, โ€‹โ€‹เดชเด•เตเดทเต‡ เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เด…เดชเตเดชเตเดฑเดฎเดพเดฃเต เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเตเดฏเดพเดชเตเดคเดฟ. เด‡เดคเต เดฐเดธเด•เดฐเดตเตเด‚ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดตเตเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดชเตเดชเดพเดšเตเดšเต† เดŽเดฏเตผเดซเตเดฒเต‹เดฏเตโ€Œเด•เตเด•เดพเดฏเตเดณเตเดณ ETL เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เดณเตเด‚ เด…เดตเดฏเตเดŸเต† เดญเดพเด—เด™เตเด™เดณเตเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดžเดพเตป เดธเดจเตเดคเต‹เดทเดคเตเดคเต‹เดŸเต† เดคเตเดŸเดฐเตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•