13. 4. 1999 | ![]() ![]() ![]() ![]() ![]() |
Právě dnes, inspirováni stále se opakujícími dotazy na totéž v linuxové konferenci, jsme se rozhodli vytvořit oblast Praxe, která bude obsahovat hlavně různé tipy, rady a odpovědi na často kladené dotazy. Dnes se podíváme na neinteraktivní odesílání emailů s přílohou například ze skriptů apod.
Pokud potřebujeme odeslat soubor emailem, máme v zásadě několik možností. Tou nejjednodušší a zároveň nejméně použitelnou je pouhé vložení obsahu souboru do těla zprávy. Tuto metodu lze ovšem úspěšně aplikovat pouze na textové soubory a to ještě pokud možno 7bitové. Pokud se pro ní přesto rozhodnete, stačí použít program mail, který se vyskytuje téměř na všech un*xech:
mail -s "Predmet zpravy" adresat@nekde.cz < /nejaky/soubor
Tato metoda však nemusí často vyhovovat. Například pro binární 8bitová data, jako jsou komprimované soubory a podobně, je zcela nepoužitelná. V takových případech přibývá nutnost soubor konvertovat do některého 7bitového kódování (například base64 nebo quoted-printable). To lze (včetně následného odeslání provést) poměrně komfortně pomocí programu metasend, který je součástí balíku metamail (obsažen v mnoha distribucích, zdrojové kódy jsou k nalezení třeba zde). Odeslání dvou souborů pomocí metasendu by vypadalo asi takto:
metasend -b -s "Predmet zpravy" -t adresar@nekde.cz -f telo_zpravy.txt -m "text/plain" -e 7bit -n -f soubor1.gz -m "application/x-gzip" -e base64 -n -f soubor2.gz -m "application/x-gzip" -e base64
Všimněme si, že v podstatě je třeba odeslat soubory tři, pokud má mít zpráva i přímo čitelné textové tělo. To se třeba řešit právě přiložením třetího souboru telo_zpravy.txt. Je vhodné jej použít jako první. U každého souboru je pak nutné definovat MIME typ (pokud si nejste jisti a není nutné u adresáta přímo využít podpory nějaké aplikace, může to být application/octet-stream) a kódování, které má být použito pro převod souboru do 7 bitů. V úvahu připadají již zmiňované base64, které je efektivnější, ale asi o malinko méně rozšířené (nicméně dnes je už téměř bez problémů čitelné takřka všude) a quotedprintable, jenž by mělo být rozšířenější než base64, ale je méně efektivní výsledný email je pak větší.
Ostatní parametry jsou celkem srozumitelné: t určuje adresáta, -s předmět a b pak programu říká, že pracuje v tzv. batch (dávkovém) režimu a tudíž nemá očekávat žádný vstup od uživatele. Parametrem f volíme jednotlivé soubory k přiložení a n je třeba použít před každým jednotlivým souborem, aby metasend pochopil, že souborů bude více.
S metasendem se pracuje docela pěkně, ale někdy přesto není ani tato možnost k dispozici. Pak nezbyde, než dát MIME mail dohromady ručně. Není to tak zlé, stačí jenom vědět, co a kam poslat :)
K odeslání emailu s přílohami postačí následující skript, který je určen pro Bash, pro jiné shelly jej bude nutné zřejmě minimálně upravit:
#!/bin/sh IFS=" " echo "From: ja@nekde" echo "MIME-Version: 1.0" echo "To: $1" echo "Subject: predmet zpravy" echo "Content-type: multipart/mixed; boundary="separator"" echo echo "Toto je vicedilna MIME zprava. Pokud vidite tenhle blabol, vas mailer neumi MIME :)" echo echo "--separator" echo "Content-type: text/plain" echo "Content-Description: Textova cast" echo "Content-Transfer-Encoding: 7bit" echo cat $2 echo echo cnt=0 for file; do fname=`basename $file` if [ $cnt -lt 2 ]; then cnt=$[ $cnt + 1 ] else echo "--separator" echo "Content-type: application/octet-stream; name="$fname"" echo "Content-Description: $file" echo "Content-Transfer-Encoding: base64" echo lcnt=0 uuencode -m $file - | while read line; do if [ $lcnt -gt 0 ] && [ "====" != "$line" ]; then echo $line else lcnt=$[ $lcnt + 1 ] fi done echo fi done echo "--separator--"
Autor: Michal Krause (jiné články tohoto autora)
Sekce: Praxe
11. 10. 2002 14:48:21 - v scripte mozno staci (B)
mutt root -s "skuska" -a ./subor -x < "."
16. 4. 1999 12:17:09 - presne toto jsem vcera resil a... (Headman)
presne toto jsem vcera resil a na program
metasend jsem nenarazil, ale nasel jsem balik juju,
ktery obsahuje balik juen. (Umi asi totez co metasend)
wget http://pes.eunet.cz/iso-8859-2/index.htm -O index.html
juen -Q -A -m email@adress.cz -s 'Headmanuv pes postou' -F '' index.html
A funguje to dokonce tak, ze to mailvace zobrazi jako html
26. 3. 2000 13:27:21 - Re: presne toto jsem vcera resil a... (M.Oravec)
Nebolo by mozne napisat podobny clanocek o zasielani sprav serveru na mobil vo forme SMS?
Bolo by to zaujimave.
![]() ![]() ![]() ![]() ![]() |