wysyłanie e-maili do wielu odbiorców

0

Dzień dobry,

Proszę o pomoc. Nie umiem programować.
Poniższy program wysyła tylko e-mail do pierwszego adresu z listy (plik test.txt) [email protected]. Kolejny odbiorca nie otrzymuje żadnego e-maila.
Jak zmodyfikować program, aby wysyłał e-maile do wszystkich adresów wpisanych w pliku test.txt ?

plik test.txt

katalog_test,[email protected]; [email protected];

plik test.conf

adress_file = /home/test/test.txt

plik test.py

import os
from os.path import join, getsize
import sys
import smtplib
import glob
import fnmatch
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
from email import Charset
import time
import logging
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read('/home/test/test.conf')
adres_serwera = config.get('serwer', 'adres_serwera')
logdir = config.get('log', 'logdir')
mail_from = config.get('mail', 'mail_nadawcy')
mail_password = config.get('mail', 'mail_haslo')
mail_temat_test = config.get('mail', 'mail_temat_test')
mail_tekst = config.get('mail', 'mail_tekst')
przedst = config.get('kontr', 'adress_file')
home_dir = config.get('kontr', 'home_dir')
'''print adres_serwera
print logdir
print mail_password
print mail_from
print mail_temat
print mail_tekst
print kontr'''
dzisiaj = time.strftime('%Y%m%d')
wiersz = []
fp = open(mail_tekst, 'rb')
mail_tekst = fp.read().
fp.close()
logfile = dzisiaj+"_list.log"
if not os.path.exists(logdir):
  os.mkdir(logdir)
logfile = logdir+logfile
if not os.path.exists(logfile):
  print "NIE MA PLIKU LOGOW, tworze plik".
  logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', filename=logfile, filemode='w', level=logging.DEBUG)
else:.
  logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', filename=logfile, filemode='a', level=logging.DEBUG)
s = smtplib.SMTP_SSL()
s.connect(adres_serwera,465)
s.login(mail_from, mail_password)
def sendMail(to, subject, text, files=[],server=adres_serwera):
    assert type(to)==list
    assert type(files)==list
   msg = MIMEMultipart()
    msg['From'] = mail_from
    msg['To'] = COMMASPACE.join(to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject
    msg.attach( MIMEText(text, 'plain', 'UTF-8'))
    for file in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
        % os.path.basename(file))
        msg.attach(part)
s.sendmail(mail_from, to, msg.as_string() )
file = open(przedst, "r")
for nr,line in enumerate(file): 
  line = line.strip()
  string = line
  if line:
    wiersz.append(line)  
    folder, mail = wiersz[nr].split(",") 
print mail
    for path, dirs, files in os.walk(home_dir+folder): 
      print path, files
      pliki = [] 
      pliki.append(path) 
      lista_plikow=[]
      for plik in files: 
      if plik.startswith(("XX", "XY")):
plik = pliki[0]+os.sep+plik 
lista_plikow.append(plik)
      print lista_plikow
      if len(lista_plikow) == 0:
         temat = 0
      elif len(lista_plikow) == 1:.
        try:
         sendMail([mail], mail_temat_test, mail_tekst ,lista_plikow)
        except smtplib.SMTPConnectError, komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPAuthenticationError, komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPRecipientsRefused, komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPResponseException, komunikat:
         logging.warning(komunikat)
        else:
         for plik in lista_plikow:
           to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
           print to_log
        else:.
        try:
         sendMail([mail], mail_temat_test, mail_tekst ,lista_plikow)
        except smtplib.SMTPConnectError, komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPAuthenticationError, komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPRecipientsRefused, komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPResponseException, komunikat:
         logging.warning(komunikat)
        else:
for plik in lista_plikow:
to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
print to_log
s.close()
0

Jak wyglada plik z adresami? Co mowi debugger?

0

plik z adresami jest na samej górze posta - plik test.txt; po wykonaniu test.py pokazuje, że wysłał na dwa adresy, ale tylko na pierwszy dochodzi

Prosze, odpowiadaj w postach. Czyli to jest plik z adresami? katalog_test,[email protected]; [email protected];
Gdzie on jest w programie otwierany i wysylane sa maile na adresy z niego? Pytam ponownie, debugowales?

0

Po pierwsze, źle wkleił Ci się kod - wcięcia są pomieszane, brak pustych linii utrudnia czytanie, ale na pierwszy rzut oka musisz logikę odpowiadającą za wysyłanie umieścić w pętli.

  • linia 87 - zmień kod na else:
  • po tej linijce dodaj wewnątrz else pętle for: for plik in lista_plikow:
  • cały kod od linijki 88 do 116 włącznie umieść w powyższej pętli
  • usuń kod z linii 114 (for plik in lista_plikow:)

Ponieważ nie programujesz i pokazałeś kod pełen bałaganu, pewnie będziesz musiał sobie popróbować z odpowiednimi wcięciami.
Powodzenia

0
lion137 napisał(a):

plik z adresami jest na samej górze posta - plik test.txt; po wykonaniu test.py pokazuje, że wysłał na dwa adresy, ale tylko na pierwszy dochodzi

Prosze, odpowiadaj w postach. Czyli to jest plik z adresami? katalog_test,[email protected]; [email protected];
Gdzie on jest w programie otwierany i wysylane sa maile na adresy z niego? Pytam ponownie, debugowales?

nie ogarniam programowania, więc mam problem z debugowaniem. Odziedziczyłem działający programik i muszę wykonać zmianę nie mając o tym pojęcia :-)

w test.py jest wpis - config.read('/home/test/test.conf')

w test.conf jest adress_file = /home/test/test.txt, gdzie jego zawartość to:

katalog_test,[email protected]; [email protected];

katalog_test - przeszukuje ten katalog i wysyła z niego pliki na adresy [email protected]; [email protected];

0

To przykre, ze nie ogarniajac programowania, musisz programowac; minimalistycznie zobacz, pdb:
https://realpython.com/python-debugging-pdb/
Ustaw sie gdzies w srodku, sendMail i sprawdz, czy parametry sa w porzadku. Acha, tak na oko, s.sendmail powinno byc w funkcji i petli.

0

Wiesz co... w ramach nauki to sugerowałbym napisanie tego skryptu od nowa (tym bardziej, że jest w już od dość dawna nie wspieranym pythonie 2).

@lion137:
patrząc po argumentach - ten s.sendmail musi być wewnątrz funkcji sendMail(). Pętla nie jest potrzebna, bo mail jest wysyłany do listy odbiorców (wiersz 55 - choć ja bym użył BCC zamiast To: )

Problem najprawdopodobniej jest tu:

# wiersz 73
folder, mail = wiersz[nr].split(",")    

po tej operacji zmienna mail zawiera tekst [email protected]; [email protected] a nie listę adresów !

# wiersz 89 (i potem kolejne)
sendMail([mail], mail_temat_test, mail_tekst ,lista_plikow)  

a tu z tego tekstu w mail robisz jednoelementową listę - bo tego wymaga potem

# wiersz 55
msg['To'] = COMMASPACE.join(to)

Rozwiązanie które być może zadziała

# wiersz 73
folder, mail = wiersz[nr].split(",")  
mail = mail.split(';')

i potem wszędzie tam gdzie jest wywołanie sendMail zamień [mail] na mail

Jeszcze raz tylko podkreślę - masowe wysyłanie listów z odbiorcami wpisanymi w pole "To" jest czymś, za co powinno się dostać indywidualny kociołek w piekle. Jeśli już musisz - użyj BCC !

0
Bartłomiej Golenko napisał(a):

Wiesz co... w ramach nauki to sugerowałbym napisanie tego skryptu od nowa (tym bardziej, że jest w już od dość dawna nie wspieranym pythonie 2).

@lion137:
patrząc po argumentach - ten s.sendmail musi być wewnątrz funkcji sendMail(). Pętla nie jest potrzebna, bo mail jest wysyłany do listy odbiorców (wiersz 55 - choć ja bym użył BCC zamiast To: )

Problem najprawdopodobniej jest tu:

# wiersz 73
folder, mail = wiersz[nr].split(",")    

po tej operacji zmienna mail zawiera tekst [email protected]; [email protected] a nie listę adresów !

# wiersz 89 (i potem kolejne)
sendMail([mail], mail_temat_test, mail_tekst ,lista_plikow)  

a tu z tego tekstu w mail robisz jednoelementową listę - bo tego wymaga potem

# wiersz 55
msg['To'] = COMMASPACE.join(to)

Rozwiązanie które być może zadziała

# wiersz 73
folder, mail = wiersz[nr].split(",")  
mail = mail.split(';')

i potem wszędzie tam gdzie jest wywołanie sendMail zamień [mail] na mail

Jeszcze raz tylko podkreślę - masowe wysyłanie listów z odbiorcami wpisanymi w pole "To" jest czymś, za co powinno się dostać indywidualny kociołek w piekle. Jeśli już musisz - użyj BCC !

niestety nie zadziałało:

['[email protected]', '[email protected] ', '']
/home/test/test [x.pdf']
['/home/test/test/x.pdf']
Traceback (most recent call last):
File "./test.py", line 157, in <module>
to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
TypeError: cannot concatenate 'str' and 'list' objects

0

niestety nie zadziałało:

['[email protected]', '[email protected] ', '']
/home/test/test [x.pdf']
['/home/test/test/x.pdf']
Traceback (most recent call last):
File "./test.py", line 157, in <module>
to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
TypeError: cannot concatenate 'str' and 'list' objects

Komunikat błędu mówi wszystko - nie można "sklejać" napisu z listą
Zamień (w wierszu 157 (?))

to_log = "wyslano wiadomosc do: "+",".join(mail)+" z plikiem "+plik
0
Bartłomiej Golenko napisał(a):

niestety nie zadziałało:

['[email protected]', '[email protected] ', '']
/home/test/test [x.pdf']
['/home/test/test/x.pdf']
Traceback (most recent call last):
File "./test.py", line 157, in <module>
to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
TypeError: cannot concatenate 'str' and 'list' objects

Komunikat błędu mówi wszystko - nie można "sklejać" napisu z listą
Zamień (w wierszu 157 (?))

to_log = "wyslano wiadomosc do: "+",".join(mail)+" z plikiem "+plik

Bartłomieju, bardzo dziękuję. Działa :-)
dla mnie ten komunikat nie mówił nic :-), więc tym bardziej dziękuję za pomoc.

Możesz doradzić jakiś materiał w Internecie, który pomoże przerobić ten programik z Python2 na Python3 ?

0
aro_2003 napisał(a):
Bartłomiej Golenko napisał(a):

niestety nie zadziałało:

['[email protected]', '[email protected] ', '']
/home/test/test [x.pdf']
['/home/test/test/x.pdf']
Traceback (most recent call last):
File "./test.py", line 157, in <module>
to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
TypeError: cannot concatenate 'str' and 'list' objects

Komunikat błędu mówi wszystko - nie można "sklejać" napisu z listą
Zamień (w wierszu 157 (?))

to_log = "wyslano wiadomosc do: "+",".join(mail)+" z plikiem "+plik

Bartłomieju, bardzo dziękuję. Działa :-)
dla mnie ten komunikat nie mówił nic :-), więc tym bardziej dziękuję za pomoc.

Możesz doradzić jakiś materiał w Internecie, który pomoże przerobić ten programik z Python2 na Python3 ?

Mam jeszcze pytanie, gdyż program przestał zapisywać wysłane e-maile do pliku logu. Wcześniej zapisywał na jaki e-mail i jakie pliki wysłał.

Czy w tym zakresie też nie trzeba jakiś zmian zrobić ?

0
aro_2003 napisał(a):

Mam jeszcze pytanie, gdyż program przestał zapisywać wysłane e-maile do pliku logu. Wcześniej zapisywał na jaki e-mail i jakie pliki wysłał.

Czy w tym zakresie też nie trzeba jakiś zmian zrobić ?

W kodzie z pierwszego posta nie ma żadnego zapisywania do logu (poza logowaniem wyjątków z smtplib). Albo pokazujesz mi inny kod niż ten z którym pracujesz, albo coś innego generowało te logi.

0
Bartłomiej Golenko napisał(a):
aro_2003 napisał(a):

Mam jeszcze pytanie, gdyż program przestał zapisywać wysłane e-maile do pliku logu. Wcześniej zapisywał na jaki e-mail i jakie pliki wysłał.

Czy w tym zakresie też nie trzeba jakiś zmian zrobić ?

W kodzie z pierwszego posta nie ma żadnego zapisywania do logu (poza logowaniem wyjątków z smtplib). Albo pokazujesz mi inny kod niż ten z którym pracujesz, albo coś innego generowało te logi.

Przepraszam, ale zapomniałem napisać na początku postu, że w pliku test.conf mam jeszcze wpis

[log]
logdir = /var/log/test/test/

w tym katalogu tworzy się pusty plik logu (logfile = dzisiaj+"_list.log") 20220901_list.log, ale nie ma w nim żadnej zawartości.

0

A ja jeszcze raz - w tym kodzie do logu idą wyłącznie wyjątki.

Jeśli kiedyś do logu szło to o czym mówisz, to może coś zmieniałeś w tym fragmencie (zanim jeszcze zacząłeś tu pytać)?

for plik in lista_plikow:
  to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
  print to_log

1 użytkowników online, w tym zalogowanych: 0, gości: 1