Cześć,
Jesteś pewny, że sposób wywołania funkcji jest poprawny? Bo rozumiem, że chcesz uruchomić funkcje po przez wpisanie w konsole :
python nazwa_pliku.py funkcja(argumenty)
Pierwszy raz spotykam się z taką konwencją - w celu wywołania funkcji. Bo taka konwencja istnieje ale w celu uruchomienia skryptu python z argumentami.
Przykładowo mamy plik test.py z zawartością:
import sys
def fun():
print("funkcja")
for arg in sys.argv:
print(arg, type(arg))
Uruchamiając plik z konsoli z argumentami otrzymamy:
$ python3 test.py argument1 argument2 fun 1 2
test.py <class 'str'>
argument1 <class 'str'>
argument2 <class 'str'>
fun <class 'str'>
1 <class 'str'>
2 <class 'str'>
Zauważ, że podane argumenty są obiektami typu string. Mimo, że w pliku istnieje funkcja o nazwie fun to podanie nazwy fun w argumencie nie powoduje wywołania funkcji - fun jest traktowany jako obiekt typu str, a nie nazwa zmiennej czy funkcji. Co więcej przy próbie uruchomienia tego pliku i podaniu argumentów z nawiasami otrzymuję błąd - dlatego wydaję mi się, że tutaj jest problem. Ten problem można obejść w dwóch krokach:
Zaimportowanie modułu sys:
import sys
Oraz dodanie kodu na koniec Twojego kodu.
if __name__ == '__main__' and len(sys.argv) > 1:
sys.argv = sys.argv[1:]
send_email(to_emails=sys.argv)
Rozwiązanie działa. Uruchamiając serwer smtp do debugowania:
python3 -m smtpd -n -c DebuggingServer localhost:1025
I uruchamiając kod poleceniem:
python main.py test@test.pl nelson@test.pl
Otrzymuję w oknie w którym jest uruchomiony testowy serwer smtp następującą odpowiedź:
---------- MESSAGE FOLLOWS ----------
b'Content-Type: multipart/alternative; boundary="===============4781625906044727916=="'
b'MIME-Version: 1.0'
b'From: =?utf-8?b?IEthbWlsIDwobcOzaiBlbWFpbCk+?='
b'To: test@test.pl, nelson@test.pl'
b'Subject: Hello'
b'X-Peer: 127.0.0.1'
b''
b'--===============4781625906044727916=='
b'Content-Type: text/plain; charset="us-ascii"'
b'MIME-Version: 1.0'
b'Content-Transfer-Encoding: 7bit'
b''
b'Email Body'
b'--===============4781625906044727916==--'
------------ END MESSAGE ------------
Co oznacza, że wiadomość trafiła na serwer i gdyby nie był to serwer do debugowania to wiadomość powinna zostać wysłana do podanych odbiorców.
Gdybyś chciał sprawdzić działanie kodu na tym serwerze co ja, to w kodzie musisz zakomentować/usunąć tę dwie linie:
serwer.starttls()
serwer.login(username, password)
Bo ten serwer nie obsługuje tls i nie ma konieczności logowania się.
Pozdrawiam,
Nelson