• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wysyłanie emaila python

Object Storage Arubacloud
0 głosów
410 wizyt
pytanie zadane 4 czerwca 2020 w Python przez kamil g Nowicjusz (140 p.)

Dzień dobry!

Próbuje wysłać maila z pomocą tego:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
username ='(mój email)'
password = '(moje hasło)'


def send_email(text='Email Body', subject='Hello', from_email=' Kamil <(mój email)>', to_emails = None ):
    assert isinstance(to_emails, list)
    msg = MIMEMultipart('alternative')
    msg ['From'] = from_email
    msg['To'] = ", ".join(to_emails)
    msg ['Subject'] = subject

    text_part = MIMEText(text,'plain')
    msg.attach(text_part)

    msg_str = msg.as_string()
    serwer = smtplib.SMTP(host = 'smtb.gmail.com', port = 587)
    serwer.ehlo()
    serwer.starttls()
    serwer.login(username, password)
    serwer.sendmail(from_email, to_emails, msg_str)
    serwer.quit()
  

funkcję wywołuje komendą:

python (nazwa pliku).py send_email(to_emails=['(mój email)')

Niestety po kliknięciu enter w terminalu dzieje się takie coś: 

D:\programy\bot\1>python start.py send_email(to_emails=['(mój email'])

 

D:\programy\bot\1>

Jedna linijka zostaje wolna, a mail nie zostaje wysłany.

Oczywiście dostęp mniej bezpiecznych aplikacji mam włączony.

Z góry dziękuje za wszystkie odpowiedzi. Liczę że ktoś mi uświadomi gdzie popełniam błąd.

komentarz 4 czerwca 2020 przez Velta Maniak (52,010 p.)
Zacznijmy od poprawy literówki w adresie serwera poczty wychodzącej: w L19 w adresie jest "smtb" zamiast "smtp".
komentarz 4 czerwca 2020 przez kamil g Nowicjusz (140 p.)
Ok, to już mam, ale nadal nie działa.

2 odpowiedzi

+1 głos
odpowiedź 6 czerwca 2020 przez Nelson89 Dyskutant (7,720 p.)

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

komentarz 6 czerwca 2020 przez kamil g Nowicjusz (140 p.)
Wielkie dzięki, zadziałało.

Pozdrawiam,

Kamil
komentarz 6 czerwca 2020 przez Nelson89 Dyskutant (7,720 p.)
Elegancko!
0 głosów
odpowiedź 6 czerwca 2020 przez VBService Ekspert (252,740 p.)
edycja 6 czerwca 2020 przez VBService

Jakiś czas temu potrzebowałem prosty skrypt do sprawdzenia czy serwer odpowiada, z funkcją wysyłania email. Może będzie przydatny. wink


import os
import smtplib
import requests
from datetime import datetime

# ----------------------------------------------------------------------------------------
# 5 sekund na odpowiedź serwera
SERVER_TIMEOUT = 5
# adres url do sprawdzenie stanu
SERVER_URL = 'https://twoj.adres.pl'
# autoryzacja do konta email - zapisane otwartym tekstem
# konto używane tylko do tego celu ...
EMAIL_NAME = 'test.serwer.alert@gmail.com' # EMAIL_NAME = 'twoj.serwer.alert@gmail.com'
EMAIL_PASS = 'tajny1poufny' # EMAIL_PASS = 'twoje_haslo'
# ... bardziej bezpieczne utworzenie zmiennych typu env
# w systemie i zczytanie do skryptu
# MAIL_NAME = os.environ.get('EMAIL_NAME_TEST_SERVER_ALERT')
# EMAIL_PASS = os.environ.get('EMAIL_PASS_TEST_SERVER_ALERT')

EMAIL_TIME_STAMP = str(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
EMAIL_SUBJECT = 'Serwer nie odpowiada ' + EMAIL_TIME_STAMP
EMAIL_BODY_TEXT_LINE1 = 'Uwaga!\nSerwer nie odpowiada.'
EMAIL_BODY_TEXT_LINE2 = '\nTest wykonany został: ' + EMAIL_TIME_STAMP
EMAIL_BODY_FOOTER_CALL_SCRIPT = 'monitor_serwer_v.1.0'
EMAIL_BODY_FOOTER = '\n\nWiadomość wygenerowana automatycznie, skrypt: ' + EMAIL_BODY_FOOTER_CALL_SCRIPT

EMAIL_BODY = EMAIL_BODY_TEXT_LINE1 + EMAIL_BODY_TEXT_LINE2 + EMAIL_BODY_FOOTER

EMAIL_SENDER = EMAIL_NAME
EMAIL_RECEIVER = EMAIL_NAME

# czyszczenie okna terminala
def cls():
        if os.name == 'nt': os.system("cls"); # windows
        else: os.system("clear"); # linux/mac

cls();

# ----------------------------------------------------------------------------------------

respons = requests.get(SERVER_URL, timeout=SERVER_TIMEOUT)

#    do testów:  if respons.status_code == 200:
# do działania:  if respons.status_code != 200:

if respons.status_code != 200:
    with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
        smtp.ehlo()
        smtp.starttls()
        smtp.ehlo()

        smtp.login(EMAIL_NAME, EMAIL_PASS)
        subject = EMAIL_SUBJECT
        body = EMAIL_BODY
        msg = f'Subject: {subject}\n\n{body}'

        smtp.sendmail(EMAIL_SENDER, EMAIL_RECEIVER, msg.encode('utf-8'))
else:
        print()
        print('Serwer działa - ' + EMAIL_TIME_STAMP)
        print()
        msg = ''

# Test output cmd ------------------------------------------------------------------------
print()
print('  Email sender:  ' + EMAIL_SENDER)
print('Email receiver:  ' + EMAIL_RECEIVER)
print()
print(msg)

Mail prezentuje się tak

Podobne pytania

0 głosów
1 odpowiedź 170 wizyt
pytanie zadane 19 października 2020 w PHP przez Kacperhehe Bywalec (2,930 p.)
0 głosów
2 odpowiedzi 247 wizyt
0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 7 kwietnia 2018 w Sieci komputerowe, internet przez kotuszek Nowicjusz (120 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...