เจ…เจชเจพเจšเฉ‡ เจเจ…เจฐเจซเจฒเฉ‹ เจตเจฟเฉฑเจš เจˆเจฎเฉ‡เจฒ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ ETL เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†

เจ…เจชเจพเจšเฉ‡ เจเจ…เจฐเจซเจฒเฉ‹ เจตเจฟเฉฑเจš เจˆเจฎเฉ‡เจฒ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ ETL เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†

เจญเจพเจตเฉ‡เจ‚ เจ•เจฟเฉฐเจจเฉ€ เจตเฉ€ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจตเจฟเจ•เจธเจฟเจค เจนเฉ‹ เจœเจพเจตเฉ‡, เจชเฉเจฐเจพเจฃเฉ€เจ†เจ‚ เจชเจนเฉเฉฐเจšเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจคเจฐ เจนเจฎเฉ‡เจธเจผเจพ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจชเจฟเฉฑเจ›เฉ‡ เจฐเจนเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจ‡เฉฑเจ• เจจเจฟเจฐเจตเจฟเจ˜เจจ เจชเจฐเจฟเจตเจฐเจคเจจ, เจฎเจจเฉเฉฑเจ–เฉ€ เจ•เจพเจฐเจ•เจพเจ‚, เจคเจ•เจจเฉ€เจ•เฉ€ เจฒเฉ‹เฉœเจพเจ‚, เจœเจพเจ‚ เจ•เฉเจ เจนเฉ‹เจฐ เจ•เจพเจฐเจจ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจกเฉ‡เจŸเจพ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจฆเฉ‡ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš, เจกเฉ‡เจŸเจพ เจธเจฐเฉ‹เจค เจ‡เจธ เจนเจฟเฉฑเจธเฉ‡ เจตเจฟเฉฑเจš เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจชเฉเจฐเจ—เจŸ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ. เจญเจพเจตเฉ‡เจ‚ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจคเฉ‹เจ‚ เจ›เฉเจŸเจ•เจพเจฐเจพ เจชเจพเจ‰เจฃ เจฆเจพ เจ•เจฟเฉฐเจจเจพ เจตเฉ€ เจธเฉเจชเจจเจพ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจนเฉเจฃ เจคเฉฑเจ• เจกเฉ‡เจŸเจพ เจฆเจพ เจ•เฉเจ เจนเจฟเฉฑเจธเจพ เจคเจคเจ•เจพเจฒ เจธเฉฐเจฆเฉ‡เจธเจผเจตเจพเจนเจ•เจพเจ‚ เจ…เจคเฉ‡ เจˆเจฎเฉ‡เจฒเจพเจ‚ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจนเฉ‹เจฐ เจชเฉเจฐเจพเจฃเฉ‡ เจซเจพเจฐเจฎเฉˆเจŸเจพเจ‚ เจฆเจพ เจœเจผเจฟเจ•เจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ. เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจชเจพเจšเฉ‡ เจเจ…เจฐเจซเจฒเฉ‹ เจฒเจˆ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจจเฉ‚เฉฐ เจตเฉฑเจ– เจ•เจฐเจจ เจฒเจˆ เจธเฉฑเจฆเจพ เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚, เจ‡เจน เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจˆเจฎเฉ‡เจฒเจพเจ‚ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจ•เจฟเจตเฉ‡เจ‚ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

prehistory

เจฌเจนเฉเจค เจธเจพเจฐเจพ เจกเฉ‡เจŸเจพ เจ…เจœเฉ‡ เจตเฉ€ เจˆเจฎเฉ‡เจฒ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจธเจพเจฐเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจชเจฐเจธเจชเจฐ เจธเฉฐเจšเจพเจฐ เจคเฉ‹เจ‚ เจ•เฉฐเจชเจจเฉ€เจ†เจ‚ เจตเจฟเจšเจ•เจพเจฐ เจ†เจชเจธเฉ€ เจคเจพเจฒเจฎเฉ‡เจฒ เจฆเฉ‡ เจฎเจฟเจ†เจฐเจพเจ‚ เจคเฉฑเจ•. เจ‡เจน เจšเฉฐเจ—เจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเจพเจ‚ เจฆเจซเจคเจฐ เจตเจฟเฉฑเจš เจ‰เจนเจจเจพเจ‚ เจฒเฉ‹เจ•เจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจ‡เจธ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจธเจฐเฉ‹เจคเจพเจ‚ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจ•เจฐเจจเจ—เฉ‡, เจชเจฐ เจ…เจ•เจธเจฐ เจ‡เจน เจธเฉฐเจญเจพเจตเจจเจพ เจฌเจธ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ€เฅค เจ–เจพเจธ เจ•เฉฐเจฎ เจœเจฟเจธเจฆเจพ เจฎเฉˆเจ‚ เจธเจพเจนเจฎเจฃเจพ เจ•เฉ€เจคเจพ เจธเฉ€ เจ‰เจน เจ‡เฉฑเจ• เจฎเจธเจผเจนเฉ‚เจฐ CRM เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจกเฉ‡เจŸเจพ เจตเฉ‡เจ…เจฐเจนเจพเจŠเจธ เจจเจพเจฒ เจœเฉ‹เฉœ เจฐเจฟเจนเจพ เจธเฉ€, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เฉฑเจ• OLAP เจธเจฟเจธเจŸเจฎ เจจเจพเจฒเฅค เจ‡เจคเจฟเจนเจพเจธเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจธเจพเจกเฉ€ เจ•เฉฐเจชเจจเฉ€ เจฒเจˆ, เจ‡เจธ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจตเจชเจพเจฐ เจฆเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจธเฉ€. เจ‡เจธ เจฒเจˆ, เจนเจฐ เจ•เฉ‹เจˆ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจธ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฆเฉ‡ เจกเฉ‡เจŸเจพ เจจเจพเจฒ เจตเฉ€ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจธเฉ€. เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจฌเฉ‡เจธเจผเฉฑเจ•, เจ‡เฉฑเจ• เจ“เจชเจจ API เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€. เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, API เจจเฉ‡ เจธเจพเจฐเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ•เจตเจฐ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ, เจ…เจคเฉ‡, เจ‡เจธเจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจนเจฟเจฃ เจฒเจˆ, เจ‡เจน เจตเฉฑเจกเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจŸเฉ‡เจขเฉ€ เจธเฉ€, เจ…เจคเฉ‡ เจคเจ•เจจเฉ€เจ•เฉ€ เจธเจนเจพเจ‡เจคเจพ เจนเฉ‹เจฐ เจตเจฟเจ†เจชเจ• เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจ…เฉฑเจงเฉ‡ เจฐเจธเจคเฉ‡ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ…เจธเจฎเจฐเฉฑเจฅ เจธเฉ€เฅค เจชเจฐ เจ‡เจธ เจธเจฟเจธเจŸเจฎ เจจเฉ‡ เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ 'เจคเฉ‡ เจชเฉเจฐเจพเจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจฒเจฟเฉฐเจ• เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจˆเจฎเฉ‡เจฒ เจฆเฉเจ†เจฐเจพ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเจพ เจฎเฉŒเจ•เจพ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเจพเฅค

เจ‡เจน เจจเฉ‹เจŸ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ‡เจ•เฉ‹ เจ‡เจ• เจฎเจพเจฎเจฒเจพ เจจเจนเฉ€เจ‚ เจธเฉ€ เจœเจฟเจธ เจตเจฟเจš เจ•เจพเจฐเฉ‹เจฌเจพเจฐ เจˆเจฎเฉ‡เจฒเจพเจ‚ เจœเจพเจ‚ เจคเจคเจ•เจพเจฒ เจฎเฉˆเจธเฉ‡เจ‚เจœเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจธเฉ€. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจธ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ€ เจ•เฉฐเจชเจจเฉ€ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจฟเจค เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจœเฉ‹ เจธเจฟเจฐเจซ เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจกเฉ‡เจŸเจพ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค

เจ…เจชเจพเจšเฉ‡ เจเจ…เจฐเจซเจฒเฉ‹

เจˆเจŸเฉ€เจเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ…เจ•เจธเจฐ เจ…เจชเจพเจšเฉ‡ เจเจ…เจฐเจซเจฒเฉ‹ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เฉฑเจ• เจชเจพเจ เจ• เจœเฉ‹ เจ‡เจธ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจคเฉ‹เจ‚ เจ…เจฃเจœเจพเจฃ เจนเฉˆ, เจจเฉ‚เฉฐ เจฌเจฟเจนเจคเจฐ เจขเฉฐเจ— เจจเจพเจฒ เจธเจฎเจเจฃ เจฒเจˆ เจ•เจฟ เจ‡เจน เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจตเฉ‡เจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจฎเฉˆเจ‚ เจ•เฉเจ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจฒเฉ‹เจ•เจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เจพเฅค

เจ…เจชเจพเจšเฉ‡ เจเจ…เจฐเจซเจฒเฉ‹ เจ‡เฉฑเจ• เจฎเฉเจซเจค เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ เจนเฉˆ เจœเฉ‹ เจชเจพเจˆเจฅเจจ เจตเจฟเฉฑเจš 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 เจฌเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚ เจœเจพเจฃเจฆเฉ‡ เจนเจพเจ‚เฅค เจซเจฟเจฐ, เจœเจฆเฉ‹เจ‚ 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

เจ…เจธเฉ€เจ‚ เจกเจพเจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚

เจกเจพเจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจ†เจชเจฐเฉ‡เจŸเจฐ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจคเฉเจธเฉ€เจ‚ เจคเจฟเจ†เจฐ-เจฌเจฃเจพเจˆเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจนเฉเจฃ เจคเฉฑเจ• เจคเจฐเจ• เจฎเจพเจฎเฉ‚เจฒเฉ€ เจนเฉˆ - เจ…เฉฑเจ–เจฐ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจฒเฉˆเจฃ เจฒเจˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฎเฉˆเจ‚ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจชเจพเจˆเจฅเจจ เจ“เจชเจฐเฉ‡เจŸเจฐ เจฆเจพ เจธเฉเจเจพเจ… เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹