Neinteraktivnφ odesφlßnφ p°φloh emailem

13. 4. 1999on-line novΘ okno dom∙ p°edchozφ Φlßnek nßsledujφcφ Φlßnek

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 quoted¡printable, 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--"


Tento skript vyu╛φvß pouze dva externφ programy. Prvnφm je uuencode, druh²m pak cat. Uuencode je k nalezenφ v balφku GNU sharutils, kter² je obsa╛en snad ve v╣ech linuxov²ch distribucφch, zdrojovΘ k≤dy jsou p°φpadn∞ nap°. zde. N∞kterΘ star╣φ verze neum∞ly volbu ¡m (base64), zcela jist∞ to umφ verze 4.2.
Pou╛itφ skriptu je jednoduchΘ. Prvnφm parametrem je adresßt, druh²m textov² soubor s t∞lem zprßvy a pak nßsleduje libovolnΘ mno╛stvφ soubor∙ k p°ilo╛enφ (pro v╣echny soubory se pou╛ije stejn² MIME typ, application/octet-stream). Standardnφ v²stup je t°eba p°i spu╣t∞nφ p°esm∞rovat:

mime_mail.sh adresat@nekde.cz telo_zpravy.txt soubor1.gz soubor2.gz | /usr/sbin/sendmail -t
nebo
mime_mail.sh adresat@nekde.cz telo_zpravy.txt soubor1.gz soubor2.gz | /var/qmail/bin/qmail-inject

a podobn∞.
Email odeslan² tφmto skriptem je bez problΘm∙ Φiteln² v r∙zn²ch klientech (odzkou╣eno v Man∞, Pine a Metamailu).
Pro p°φpadnΘ zßjemce je skript ke sta╛enφ zde
Poznßmka pro ╣╗ouraly: vφm, ╛e n∞kterΘ Φßsti skriptu by se daly napsat efektivn∞ji, ale bylo by to na ·kor p°ehlednosti, o kterou mi hlavn∞ ╣lo.

Doufßm, ╛e n∞kterß z uveden²ch mo╛nostφ bude vyhovovat ka╛dΘmu a ╛e tento Φlßnek p°isp∞je k snφ╛enφ provozu v linuxovΘ konferenci :)

Autor: Michal Krause (jinΘ Φlßnky tohoto autora)
Sekce: Praxe


Diskuse

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.


on-line novΘ okno dom∙ p°edchozφ Φlßnek nßsledujφcφ Φlßnek