Hlavní navigace

Neinteraktivní odesílání příloh emailem

Michal Krause 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--"


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/qma­il-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 :)

Našli jste v článku chybu?

4. 8. 2006 10:11

renda (neregistrovaný)
dobry script hodne mi pomohl, jsem si ho upravil podle sebe a slape jak ma diky :-)

11. 10. 2002 14:48

B (neregistrovaný)

mutt root -s "skuska" -a ./subor -x

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: 7 originálních adventních kalendářů pro mlsné

7 originálních adventních kalendářů pro mlsné

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Vitalia.cz: Co pomáhá dítěti při zácpě?

Co pomáhá dítěti při zácpě?

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla