Portál AbcLinuxu, 12. května 2025 05:14

Dotaz: Davkove rozeslani vice ruznych mailu

26.7.2007 13:28 jarhmylla
Davkove rozeslani vice ruznych mailu
Přečteno: 621×
Odpovědět | Admin
Dobry den, potreboval bych vyrobit skript, ktery by prosel dany adresar, k jednotlivym souborum nasel v urcitem souboru (adresy.txt) odpovidajici adresy a na ne odeslal mail, ke kteremu by privesil prislusny soubor.

Doposud jsme pouzivali pro scriptove zasilani zprav mutt, system je centos 4.3.2.

soubor s adresami adresy.txt:

001 jenda@koza.com

002 pavel@ovce.com

.

240 franta@jetel.com

adresar s daty :

001.txt

002.txt

.

240.txt

Soubor 001.txt by se mel jako priloha odeslat na adresu jenda@koza.com, atp.

Diky za pomoc.
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

andree avatar 26.7.2007 13:47 andree | skóre: 39 | blog: andreeeeelog
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Odpovědět | | Sbalit | Link | Blokovat | Admin
skus pouzit awk.. prejst vsetky riadky suboru adries a rozparsovat to na dvojice subor+email nebude problem, myslim ze ani zavolat `mail` na poslanie posty :-)
26.7.2007 14:12 HS | skóre: 12
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dalo by se to take resit jednim cyklem while - ze souboru nactes radek, rozseknes ho na soubor a adresu a posles mail.
parazit
26.7.2007 14:54 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Odpovědět | | Sbalit | Link | Blokovat | Admin
naco zakladat na jeden dotaz druhe vlakno kdyz uz jsi jedno vytvoril. tady mas skript ktery mi funguje:

#!/bin/bash

for file in /home/hates/maily/*; do
    FILE="$file"
    ID=`echo $file | cut -d "." -f 1-1 | cut -d "/" -f 5-5`
    MAIL=`grep ${ID} /home/hates/adresy.txt | cut -d " " -f 2-2`
    echo "Soubor $file odeslan na mail ${MAIL}"
    cat $file | mail ${MAIL}
done;

Staci malinko upravit pro tvoje potreby. mozna to jde i jednoduseji. pomoci awk primo rozparsovat ten radek v adresy.txt a potom odeslat prislusny soubor.
27.7.2007 08:33 jarhmylla
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu

Za druhe vlakno se velmi omlouvam, trochu se mi to nepovedlo, nebyl to umysl.


Za skript velmi dekuji, po napasovani na moje podminky funguje velmi dobre. Mel bych jen dve poznamky.


1) Potrebuji poslat soubor jako prilohu, nikoli jako telo mailu. Neco jako:
mutt -s "soubor" -a $file $(MAIL) < default_message.txt
coz mi zatim nefunguje, ale snad to nejak doladim. Pokud by jste vedel, rad se poucim.

2)V puvodnim dotazu jsem nezminil moznost, ze pocet souboru nemusi korespondovat s poctem adres. Dalo by se to jeste zohlednit?


Diky.

27.7.2007 10:02 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Tohle odesila mail i s prilohou. musis na to vyuzit mutt. prikaz mail nejspis neumi prilohy. Nezalezi na tom ze nekoresponduje pocet adres a souboru. skript prochazi adresar a ke kazdemu jmenu hleda v souboru adresy.txt adresu. pokud neexistuje tak to zaloguje a pokracuje dal. A ted uz ten skript:
#!/bin/bash

# soubor s obsahem mailu musi byt ve tvaru
# <jmeno>.<pripona>

SOUBOR_ADRES="/home/hates/adresy.txt"

SUBJECT="Automaticky odesilany mail"

echo `date +%c` >> /home/hates/neodeslane_maily.txt
for file in /home/hates/maily/*; do
    FILE="$file"
    ID=`echo $file | cut -d "." -f 1-1 | cut -d "/" -f 5-5`
    MAIL=`grep ${ID} ${SOUBOR_ADRES} | cut -d " " -f 2-2`
    if [ -z ${MAIL} ]; then
        echo "Soubor $file nebyl odeslan. Adresa s ID ${ID} neexistuje" << /home/hates/neodeslane_maily.txt
    else
        echo "Soubor $file odeslan na mail ${MAIL}"
        echo "Odeslan mail s ID ${ID}" | mutt -s "${SUBJECT}" -a $file ${MAIL} > $file
    fi
done;
27.7.2007 10:53 jarhmylla
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Bylo by to presne ono, kdyby to stale nehlasilo:

./mailista: line 22: syntax error: unexpected end of file
27.7.2007 11:02 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Bylo by určitě lepší odeslat soubory v _jednom_ mailu spíš než každý soubor odesílat zvlášť. Krom toho je v tom zadání pár nejednoznačností a jestli chceš řešení, ozvi se mi na jabber, bude to rychlejší a dáme sem pak výsledek. Prozatím tohle
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

adresy = {}
for line in file('adresy.txt'):
    f, addr = line.split()
    filename = f + '.txt'
    try:
        if filename not in adresy[addr]:
            adresy[addr].append(filename)
        else:
            print "Duplicit line", filename, addr
    except KeyError:
        adresy[addr] = [filename]

for adresa, soubory in adresy.iteritems():
    att = '-a ' + ' -a '.join(soubory)
    print 'mutt -s "Rozeslane soubory"', adresa, att
projde seznam adres, zjistí co komu poslat, oznámí duplicity a nachystá příkaz pro odeslání. Třeba z tohohle:
001 jenda@koza.com
002 pavel@ovce.com
230 franta@jetel.com 
003 pavel@ovce.com
240 franta@jetel.com 
200 franta@jetel.com 
240 franta@jetel.com 
Udělá toto:
Duplicit line 240.txt franta@jetel.com
mutt -s "Rozeslane soubory" jenda@koza.com -a 001.txt
mutt -s "Rozeslane soubory" pavel@ovce.com -a 002.txt -a 003.txt
mutt -s "Rozeslane soubory" franta@jetel.com -a 230.txt -a 240.txt -a 200.txt
27.7.2007 13:29 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Davkove rozeslani vice ruznych mailu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Společnými silami jsme vytvořili tenhle skript:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

subject = 'rozeslane soubory'
body = 'Rozeslane soubory\n'
datadir = '/home/honza/datadir'

def posli(adresa, soubory):    
    cmd = ['mutt', '-s', subject]
    for soubor in soubory:
        cmd.extend(('-a', os.path.join(datadir, soubor)))
    cmd.append(adresa)
    print cmd
    #w, r = os.popen2(cmd)
    #w.write(body)
    #w.close()


adresy = {}
souborynadisku = dict([(x, None) for x in os.listdir(datadir)])
souboryvadresach = {}
for linenum, line in enumerate(file('adresy.txt')):
    try:
        f, addr = line.split()
    except:
        print 'radek %d: "%s" je divny' %(linenum, line.strip())
        continue
    filename = f + '.txt'
    souboryvadresach[filename] = None
    if filename not in souborynadisku:
        print 'radek %d: soubor "%s" chybi' %(linenum, filename)
        continue
    try:
        adresy[addr].append(filename)
    except KeyError:
        adresy[addr] = [filename]

for snd in souborynadisku:
    if snd not in souboryvadresach:
        print 'Soubor "%s" neni komu poslat' %snd

adr = adresy.keys()
adr.sort()
for adresa in adr:
    soubory = adresy[adresa]
    posli(adresa, soubory)
Ukázalo se, že je potřeba odchytit co nejvíc chybových situací (divné řádky, chybějící soubory, přebývající soubory), tak se to trochu nafouklo a na efektivitu jsem pak už přestal hledět. Ale prý to funguje ;-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.