Prozesszeit einer Mail ermitteln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich möchte gern die Prozessdauer einer E-Mail ermitteln.
D.h. die Zeit, die zwischen

Code: Alles auswählen

#start
mailserver = smtplib.SMTP('mail.gmx.net', 587)
mailserver.ehlo()
mailserver.starttls()
mailserver.ehlo()
mailserver.login(FROM, PASSWORD)
mailserver.sendmail(FROM, TO, msg.as_string())
mailserver.quit()
#ende
vergeht.
Bisher hab ichs mit

Code: Alles auswählen

import timeit
import time
tic=timeit.default_timer()
mailserver = smtplib.SMTP('mail.gmx.net', 587)
mailserver.ehlo()
mailserver.starttls()
mailserver.ehlo()
mailserver.login(FROM, PASSWORD)
mailserver.sendmail(FROM, TO, msg.as_string())
mailserver.quit()
toc=timeit.default_timer()
process = toc - tic
print process
versucht. Funktioniert aber natürlich nicht!?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: was heißt »Funktioniert aber natürlich nicht!?«?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Er gibt mir zwei Zeiten aus, von denen die zweite korrekt ist..
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zwei Zeilen bei nur einer `print`-Anweisung? Ist der gezeigte Code wirklich zu 100% der von dir tatsächlich verwendete Code?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ah ok, da ich es nicht hinbekommen habe, das fenster mit dem fortschrittsbalken nach dem angegebenen prozess wieder zu schliessen, hab
ich wohl nochmal auf E-Mail senden gedrückt :)
also ich bekomm damit nur eine zeitangabe.
folgender code funktioniert:

Code: Alles auswählen

import time
import timeit
import Tkinter
import ttk

rooter = Tkinter.Tk()
rooter.geometry('400x30+670+180')
ft = ttk.Frame()
tic=timeit.default_timer()
ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate')
pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
pb_hD.start(50)

toc=timeit.default_timer()
process = int((toc - tic)*1000)
print process
ft.after(process, lambda: rooter.destroy())
rooter.mainloop()
aber so:

Code: Alles auswählen

import time
import timeit
import Tkinter
import ttk

rooter = Tkinter.Tk()
rooter.geometry('400x30+670+180')
ft = ttk.Frame()
tic=timeit.default_timer()
ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate')
pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
pb_hD.start(50)

[...]
mailserver = smtplib.SMTP('mail.gmx.net', 587)
mailserver.ehlo()
mailserver.starttls()
mailserver.ehlo()
mailserver.login(FROM, PASSWORD)
mailserver.sendmail(FROM, TO, msg.as_string())
mailserver.quit()

toc=timeit.default_timer()
process = int((toc - tic)*1000)
print process
ft.after(process, lambda: rooter.destroy())
rooter.mainloop()
nicht mehr.
Jedenfalls nicht so wie ich es gern hätte :(
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: was hättest Du denn gerne? Einen Progressbar der anzeigt, wie lange es dauert bis eine Mail geschickt ist? Da GUIs nicht nebenläufig sind, passiert halt gar nichts bis die Mail gesendet wurde. Du mußt das Mail-Senden in einen eigenen Thread packen, dann kannst Du nebenher auch noch Deine GUI anzeigen. Das ist jetzt nicht so einfach, wie Du Dir das wünschst, aber war hat behauptet, dass GUI-Programmierung einfach wäre?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Bisher versuche ich es so:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

import Tkinter
from Tkinter import *
import Tkinter as tk
import locale
from time import *
import timeit
import datetime
import ttk
import calendar
import datetime as dt
import tkFont
import tkMessageBox
import os
import sqlite3
import tkFileDialog
import errno
import numpy
import itertools
import glob
import zipfile
import smtplib
import lepl.apps.rfc3696
from collections import defaultdict
from operator import itemgetter
import sys

#reload(sys)
#sys.setdefaultencoding('UTF8')

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.pagesizes import A4, cm, landscape
from reportlab.platypus import SimpleDocTemplate
from reportlab.lib import colors

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import email.mime.application

pdfDatei =[u'Pfad eines pdf-Ordners']
moanatName='May 2016'
zip_Ordnername = 'TESTORDNER...'
TO = 'Empfaenger Email-Aresse'
FROM ='Sender Email-Adresse'
PASSWORD = 'Sender Email-Password'


def ueberMitteln(rooter):
    #rooter.after(2000, lambda: rooter.destroy()) ---> dieser befehl wird nicht ausgefuehrt,
    										#wenn ich ihn aktiviere und den anderen deaktiviere
    print 'tachchen'

    SUBJECT = 'Hallo'
    MESSAGE = 'Na wie gehts'

    msg = MIMEMultipart()
    msg['From'] = FROM
    msg['To'] = TO
    msg['Subject'] = SUBJECT

    msg.attach(MIMEText(MESSAGE))
    for pfad in pdfDatei:
        ordnerPfad = str(pfad)

    def zip_dir(zipname, dir_to_zip):
        dir_to_zip_len = len(dir_to_zip.rstrip(os.sep)) + 1
        with zipfile.ZipFile(zipname, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
            for dirname, subdirs, files in os.walk(dir_to_zip):
                for filename in files:
                    path = os.path.join(dirname, filename)
                    entry = path[dir_to_zip_len:]
                    zf.write(path, entry)

    zipname = (zip_Ordnername+moanatName)
    zip_dir(zipname, ordnerPfad)

    tic=timeit.default_timer()

    fp=open(zipname,'rb')
    att = email.mime.application.MIMEApplication(fp.read(),_subtype="zip")
    fp.close()
    att.add_header('Content-Disposition','attachment',filename=zipname)
    msg.attach(att)
    mailserver = smtplib.SMTP('mail.gmx.net', 587)
    mailserver.ehlo()
    mailserver.starttls()
    mailserver.ehlo()
    mailserver.login(FROM, PASSWORD)
    mailserver.sendmail(FROM, TO, msg.as_string())
    mailserver.quit()

    toc=timeit.default_timer()
    process = int((toc - tic)*1000)
    print process

rooter = Tkinter.Tk()
rooter.geometry('400x30+670+180')
ft = ttk.Frame()
ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate')
pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
pb_hD.start(50)
rooter.after(2000, lambda: rooter.destroy()) 
rooter.mainloop()
ueberMitteln(rooter)
wie kann ich einen neuen thread denn verwirklichen?
Zuletzt geändert von Anonymous am Montag 16. Mai 2016, 13:46, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

wie kann ich denn das Mail-Senden in einen eigenen Thread packen?
kannst du mir das so ein grobes "code layout" mal zeigen?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ok. ich hab mich jetzt mal schlau gelesen und
einen neuen code erstellt

Code: Alles auswählen

import Tkinter
from Tkinter import *
import Tkinter as tk
import ttk
import threading
from threading import Thread
import time


def function_1():
    print 'Funktion 1'

    rooter = Tkinter.Tk()
    rooter.geometry('400x30+670+180')
    ft = ttk.Frame()
    ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
    pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='determinate')
    pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
    pb_hD.start(50)
    rooter.after(4000, lambda: rooter.destroy())
    rooter.mainloop()


def function_2():
    print 'Funktion 2'


if __name__ == '__main__':
    Thread(target = function_1()).start()
    Thread(target = function_2()).start()
aber müssten nicht die beiden Funktionsausgaben gleichzeitig kommen???
BlackJack

@DMD-OL: Nein, weil Du beide nacheinander aufrufst. Die Threads benutzt Du überhaupt nicht, weil Du denen als `target` den Wert `None` übergibst → Der Rückgabewert der von Dir an der Stelle aufgerufenen Funktionen.

Tk solltest Du allerdings auch gar nicht in einem anderen Thread als dem Hauptthread laufen lassen, das funktioniert entweder gar nicht, oder es können komische Sachen passieren.
Antworten