Kao što možete pročitati u ovom članku, nedavno sam imao problema sa svojim poslužiteljem e-pošte i odlučio sam administraciju e-pošte prenijeti Amazonovoj jednostavnoj usluzi e-pošte (SES).
Problem s tim rješenjem bio je taj što sam SES-u spremio nove poruke u S3 segment, a korištenje AWS Management Console za čitanje datoteka u S3 segmentima vrlo brzo zastarijeva.
Stoga sam odlučio napisati skriptu Bash kako bih automatizirao postupak preuzimanja, ispravnog pohranjivanja i pregledavanja novih poruka.
Iako sam napisao ovu skriptu za upotrebu na svojoj radnoj površini Ubuntu Linux, ne bi bilo potrebno previše petljanja da bi funkcionirala na macOS-u ili sustavu Windows 10 putem Windows podsustava za Linux.
Evo kompletne skripte u jednom komadu. Nakon što odvojite nekoliko trenutaka da ga pregledate, provest ću vas kroz jedan korak po korak.
#!/bin/bash # Retrieve new messages from S3 and save to tmpemails/ directory: aws s3 cp \ --recursive \ s3://bucket-name/ \ /home/david/s3-emails/tmpemails/ \ --profile myaccount # Set location variables: tmp_file_location=/home/david/s3-emails/tmpemails/* base_location=/home/david/s3-emails/emails/ # Create new directory to store today's messages: today=$(date +"%m_%d_%Y") [[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today" # Give the message files readable names: for FILE in $tmp_file_location do mv $FILE ${base_location}/${today}/email$(rand) done # Open new files in Gedit: for NEWFILE in ${base_location}/${today}/* do gedit $NEWFILE done
Započet ćemo s jednom naredbom za preuzimanje svih poruka koje trenutno borave u mom segmentu S3 (usput sam promijenio imena segmenta i ostalih datoteka i pojedinosti o provjeri autentičnosti kako bih zaštitio svoju privatnost).
aws s3 cp \ --recursive \ s3://bucket-name/ \ /home/david/s3-emails/tmpemails/ \ --profile myaccount
Naravno, ovo će raditi samo ako ste već instalirali i konfigurirali AWS CLI za svoj lokalni sustav. Sada je vrijeme da to učinite ako već niste.
Naredba cp označava "copy" --recursive govori CLI-ju da primijeni operaciju čak i na više objekata, s3: // ime segmenta pokazuje na moju kantu (ime vašeg segmenta očito će biti drugačije), / home / david ... redak je apsolutna adresa datotečnog sustava na koju bih želio da se poruke kopiraju, a argument --profile govori CLI-ju na koji od mojih višestrukih AWS računa mislim.
Sljedeći odjeljak postavlja dvije varijable koje će mi olakšati određivanje mjesta datotečnog sustava kroz ostatak skripte.
tmp_file_location=/home/david/s3-emails/tmpemails/* base_location=/home/david/s3-emails/emails/
Imajte na umu kako vrijednost varijable tmp_file_location završava zvjezdicom. To je zato što se želim pozvati na datoteke unutar tog direktorija, a ne na sam direktorij.
Stvorit ću novi stalni direktorij unutar ... / e-pošte / hijerarhije kako bih kasnije lakše pronašao poruke. Naziv ovog novog direktorija bit će trenutni datum.
today=$(date +"%m_%d_%Y") [[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"
Prvo kreiram novu varijablu ljuske nazvanu danas koja će se popunjavati izlazom naredbe datum + "% m_% d_% Y" . date sam daje puni datum / vremensku oznaku, ali ono što slijedi ( "% m_% d_% Y" ) uređuje taj izlaz u jednostavniji i čitljiviji format.
Zatim testiram postojanje izravnog korištenja tog imena - što bi značilo da sam tog dana već dobio e-poštu i, prema tome, nema potrebe za ponovnim stvaranjem direktorija. Ako se takav direktorij ne ne postoji (||), a zatim mkdir će ga stvoriti za mene. Ako ne pokrenete ovaj test, vaša bi naredba mogla vratiti dosadne poruke o pogrešci.
Budući da Amazon SES daje ružna i nečitljiva imena svakoj od poruka koje padne u moj segment S3, sada ću ih dinamički preimenovati, istovremeno premještajući u njihov novi dom (u datiranom direktoriju koji sam upravo stvorio) .
for FILE in $tmp_file_location do mv $FILE ${base_location}/${today}/email$(rand) done
Za ... napraviti ... učinio petlja će pročitati svaki od datoteka u direktoriju zastupa tmp_file_location $ varijabla, a zatim ga premjestiti u direktorij Samo sam stvorio (zastupa $ base_location varijable osim sadašnje vrijednosti $ danas ).
Kao dio iste operacije, dat ću joj novo ime, niz " e-pošta " nakon kojeg slijedi slučajni broj generiran naredbom rand . Možda ćete trebati instalirati generator slučajnih brojeva: to će biti prikladan instalacijski rand na Ubuntuu.
Ranija verzija skripte stvorila je imena diferencirana kraćim, sekvencijalnim brojevima koji su povećani pomoću logike count = 1 ... count = $ ((count + 1)) unutar for petlje. To je upalilo sve dok slučajno nisam primio više od jedne serije poruka istog dana. Da jesam, nove će poruke prebrisati starije datoteke u direktoriju tog dana.
Pretpostavljam da je matematički moguće da bi moja naredba randa mogla dodijeliti preklapajuće brojeve dvjema datotekama, ali, s obzirom na to da zadani opseg randa koristi između 1 i 32 576, to je rizik koji sam spreman poduzeti.
U ovom bi trenutku u novom direktoriju trebale biti datoteke s imenima poput e-pošte3039, e-pošte25343 itd. Za svaku novu poruku koju sam poslao.
Pokretanje naredbe stabla na vlastitom sustavu pokazuje mi da je pet poruka spremljeno u moj direktorij 02_27_2020 i još jedna u 02_28_2020 (ove su datoteke generirane pomoću starije verzije moje skripte, tako da su numerirane uzastopno).
Trenutno nema datoteka u tmpemailsima - to je zato što naredba mv premješta datoteke na njihovo novo mjesto, ne ostavljajući ništa iza sebe.
$ tree . ├── emails │ ├── 02_27_2020 │ │ ├── email1 │ │ ├── email2 │ │ ├── email3 │ │ ├── email4 │ │ ├── email5 │ └── 02_28_2020 │ └── email1 └── tmpemails
Posljednji odjeljak skripte otvara svaku novu poruku u mom omiljenom uređivaču teksta na radnoj površini (Gedit). Koristi sličnu petlju ... do ... done , ovaj put čita imena svake datoteke u novom direktoriju (na koju se poziva naredba " danas "), a zatim otvara datoteku u Geditu. Zabilježite zvjezdicu koju sam dodao na kraj mjesta u direktoriju.
for NEWFILE in ${base_location}/${today}/* do gedit $NEWFILE done
Još uvijek treba obaviti još jednu stvar. Ako ne očistim segment S3, preuzet će sve nakupljene poruke svaki put kad pokrenem skriptu. To će otežavati upravljanje.
Dakle, nakon uspješnog preuzimanja mojih novih poruka, pokrećem ovu kratku skriptu kako bih izbrisao sve datoteke iz segmenta:
#!/bin/bash # Delete all existing emails aws s3 rm --recursive s3://bucket-name/ --profile myaccount