Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

ทำให้การดึงอีเมลจาก S3 อัตโนมัติด้วย Bash: ดาวน์โหลดและดูข้อความ SES

ผมเคยมีปัญหากับ Email Server จึงตัดสินใจย้ายไปใช้ Amazon Simple Email Service (SES) แทน แต่ SES บันทึกอีเมลใหม่ไว้ใน S3 Bucket — การใช้ AWS Management Console อ่านไฟล์ใน S3 ทุกครั้งก็ลำบากและช้า

จึงเขียน Bash Script เพื่อ อัตโนมัติ กระบวนการ: ดาวน์โหลด → จัดเก็บเรียบร้อย → เปิดอ่าน — ทั้งหมดในคำสั่งเดียว

Script นี้เขียนสำหรับ Ubuntu Desktop แต่ปรับให้ทำงานบน macOS หรือ Windows 10 (WSL) ได้ไม่ยาก

สคริปต์เต็ม (Complete Script)

#!/bin/bash
# 1. ดาวน์โหลดอีเมลใหม่จาก S3 ไปยัง tmpemails/
aws s3 cp \
  --recursive \
  s3://bucket-name/ \
  /home/david/s3-emails/tmpemails/ \
  --profile myaccount

# 2. ตั้งค่าตัวแปรพาธ
tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/

# 3. สร้างโฟลเดอร์วันนี้สำหรับเก็บอีเมล
today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"

# 4. เปลี่ยนชื่อไฟล์ให้อ่านง่าย และย้ายไปโฟลเดอร์วันนี้
for FILE in $tmp_file_location; do
  mv $FILE ${base_location}/${today}/email$(rand)
done

# 5. เปิดไฟล์ใหม่ทั้งหมดใน Gedit
for NEWFILE in ${base_location}/${today}/*; do
  gedit $NEWFILE
done

อธิบายแต่ละส่วน

1. ดาวน์โหลดจาก S3

aws s3 cp --recursive s3://bucket-name/ /home/david/s3-emails/tmpemails/ --profile myaccount
  • cp = Copy
  • --recursive = ใช้กับหลายไฟล์
  • s3://bucket-name/ = Bucket ต้นทาง (เปลี่ยนเป็นของคุณ)
  • /home/david/... = พาธปลายทางบนเครื่อง
  • --profile myaccount = ใช้ AWS Profile ใด (หากมีหลายบัญชี)

ต้องติดตั้งและตั้งค่า AWS CLI ก่อน

2. ตัวแปรพาธ

tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/

* ท้าย tmp_file_location หมายถึง "ไฟล์ภายในไดเรกทอรี" ไม่ใช่ไดเรกทอรีเอง

3. สร้างโฟลเดอร์ตามวันที่

today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"
  • date +"%m_%d_%Y" → รูปแบบ MM_DD_YYYY (เช่น 02_27_2020)
  • [[ -d ... ]] || mkdir ... = ถ้ายังไม่มีโฟลเดอร์นี้ → สร้างใหม่ (กัน Error ซ้ำ)

4. เปลี่ยนชื่อและย้ายไฟล์

for FILE in $tmp_file_location; do
  mv $FILE ${base_location}/${today}/email$(rand)
done
  • Loop ทุกไฟล์ใน tmp → ย้ายไปโฟลเดอร์วันนี้
  • ตั้งชื่อใหม่: email + เลขสุ่มจาก rand (กันชื่อซ้ำ)
  • เก่าประกาศใช้ตัวนับลำดับ (1,2,3...) แต่หากรันหลายรอบในวันเดียวกัน จะทับซ้อน → เลขสุ่มปลอดภัยกว่า (Range 1-32,576)
  • ติดตั้ง rand: apt install rand (Ubuntu)

5. เปิดอ่านใน Gedit

for NEWFILE in ${base_location}/${today}/*; do
  gedit $NEWFILE
done

Loop เปิดทุกไฟล์ในโฟลเดอร์วันนี้ — * สำคัญมาก (ต้องระบุไฟล์ ไม่ใช่ไดเรกทอรี)

ลบอีเมลใน S3 หลังดาวน์โหลด (Cleanup)

หากไม่ลบใน Bucket รันครั้งต่อไปจะดาวน์โหลดซ้ำทั้งหมด → ยุ่งยาก

สคริปต์แยกสำหรับลบ:

#!/bin/bash
# ลบอีเมลทั้งหมดใน Bucket
aws s3 rm --recursive s3://bucket-name/ --profile myaccount

รันสคริปต์นี้หลังจากดาวน์โหลดและอ่านเสร็จ — เก็บ S3 ให้สะอาด

สรุป

Script นี้ช่วยให้ Workflow การจัดการอีเมลจาก SES → S3 → Local Machine เป็นอัตโนมัติ ลดขั้นตอน manual ลงมาก ปรับใช้ได้จริงใน Production