Audioattachment mailen = Error

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
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo,
folgendes Progrämmchen habe ich mir im Netz zusammengesucht, um damit jeweils 1 MP3 File zu versenden. Ich verstehe den Parameter _subtype nicht und auch nicht, wie ich den für MP3s ermitteln kann ? ("None" ?, "plain" ?, ??)

Das Script:

Code: Alles auswählen

import smtplib
from email.MIMEAudio import MIMEAudio 
from email.MIMEMultipart import MIMEMultipart

absender = "absender@mail.de"
empfaenger = "empfaenger@mail.de"
betreff = "Betreff"
datei = "Pfad\soundfile.mp3"

msg = MIMEMultipart()
msg['From'] = absender
msg['To'] = empfaenger
msg['Subject'] = betreff
msg.preamble = ''
msg.epilogue = ''

att = open(datei, 'rb')
snd = MIMEAudio(att.read(),_subtype="None")
att.close()
msg.attach(snd)

smtp_server = smtplib.SMTP('smtp.provider.domain')
smtp_server.login('login','passwort')
smtp_server.sendmail(absender, empfaenger, msg) 
smtp_server.quit()
Die Fehlermeldung:

Code: Alles auswählen

smtp_server.sendmail(absender, empfaenger, msg)
  File "C:\Programme\Python24\lib\smtplib.py", line 689, in sendmail
    (code,resp) = self.data(msg)
  File "C:\Programme\Python24\lib\smtplib.py", line 482, in data
    q = quotedata(msg)
  File "C:\Programme\Python24\lib\smtplib.py", line 190, in quotedata
    re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data))
  File "C:\Programme\Python24\lib\sre.py", line 142, in sub
    return _compile(pattern, 0).sub(repl, string, count)
TypeError: expected string or buffer
Hier http://epydoc.sourceforge.net/stdlib/pu ... class.html steht auch was dazu, was mich der Lösung aber auch nicht näher gebracht hat.

Danke, Seven
Zuletzt geändert von snakeseven am Freitag 9. Dezember 2005, 22:52, insgesamt 1-mal geändert.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Der Subtype ist das hinter "audio/" also hier "mpeg"
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Joghurt hat geschrieben:Der Subtype ist das hinter "audio/" also hier "mpeg"
Wenn ich

Code: Alles auswählen

_subtype='mpeg'
einsetze bekomme ich das hier:

Code: Alles auswählen

TypeError: expected string or buffer
:roll:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:Ich verstehe den Parameter _subtype nicht und auch nicht, wie ich den für MP3s ermitteln kann?
Hi Seven!

Hier aus gekürzter Auszug aus "simplemail.py".

Code: Alles auswählen

                # Datentyp herausfinden
                ctype, encoding = mimetypes.guess_type(filename)
                if ctype is None or encoding is not None:
                    ctype = 'application/octet-stream'
                maintype, subtype = ctype.split('/', 1)
                if maintype == 'text':
                    fp = file(filename)
                    att = MIMEText(fp.read(), _subtype=subtype)
                    fp.close()
                elif maintype == 'audio':
                    fp = file(filename, 'rb')
                    att = MIMEAudio(fp.read(), _subtype=subtype)
                    fp.close()
Siehe: http://www.python-forum.de/viewtopic.php?t=3158

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi Gerold,
da es immer nur 1 MP3 File ist das versendet wird, spare ich mir die komplette Analyse und konzentriere mich in deinem 'simplemail.py' Script auf die Variable 'subtype'.
Wenn ich das richtig verstanden habe, geschieht das Wesentliche für mich hier (# Kommentar von mir):

Code: Alles auswählen

ctype, encoding = mimetypes.guess_type(filename)          # ctype = mimetypes.guess_type(filename)
if ctype is None or encoding is not None: 
                    ctype = 'application/octet-stream'    # ctype = 'application/octet-stream', falls encoding nicht 'None'
                maintype, subtype = ctype.split('/', 1)   # subtype =  ['application', 'octet-stream']                                                      
#(...)
if maintype == 'audio':                                   # Wie maintype 'audio' sein kann, verstehe ich allerdings nicht
        fp = file(filename, 'rb') 
        att = MIMEAudio(fp.read(), _subtype=subtype)      # _subtype = ['application', 'octet-stream']
        fp.close()
Wenn ich '_subtype = ['application', 'octet-stream']' einsetze, bleibt die Fehlermeldung leider die gleiche:

Code: Alles auswählen

File "C:\Programme\Python24\lib\sre.py", line 142, in sub
return _compile(pattern, 0).sub(repl, string, count)
TypeError: expected string or buffer
Muss eventuell doch ein '_encoder=' Parameter übergeben werden ? http://epydoc.sourceforge.net/stdlib/pu ... class.html

Gruss + Danke, Seven
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:...und konzentriere mich in deinem 'simplemail.py' Script auf die Variable 'subtype'.
[...]
Wenn ich '_subtype = ['application', 'octet-stream']' einsetze, bleibt die Fehlermeldung leider die gleiche:
Hi Seven!
Du hast da einen kleinen Einrückungsfehler.
Der _subtype kan nicht application/octet-stream sein.
Bei diesem Type ist *application* der Haupttyp und *octet-stream* der Untertyp.

Ich habe "simplemail.py" mal mit folgendem Skript getestet. Bis auf einen Schlampigkeitsfehler im "simplemail.py" (ein Unterstrich zu viel), ist mir nichts aufgefallen. Das Email mit dem MP3 wird versendet.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import simplemail

mail = simplemail.Email(
    from_address = "gerold@gp-server.gp", 
    to_address = "gerold@gp-server.gp",
    subject = "Hallo mit MP3",
    message = "Servus",
    smtp_server = "gps.gp",
    attachment_file = "/home/gerold/MUSIK/lords of acid - out comes the evil.mp3"
)

print mail.send()
Mein Vorschlag: Konzentriere dich auf das was du eigentlich machen wolltest und überlasse das Versenden "simplemail.py".

lg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 11. Dezember 2005, 00:59, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi Gerold,
ich will dir wirklich nicht deine kostbare Zeit stehlen. Aber wenn ich 'simplemail' importiere und dann ausführen lasse, bekomme ich auch
eine Fehlermeldung:

Code: Alles auswählen

 File "C:\Programme\Python24\lib\site-packages\simplemail.py", line 499
 email.message = \
                      ^
SyntaxError: invalid token

Du hattest natürlich recht:

Code: Alles auswählen

>>> ctype = 'application/octet-stream'
>>> maintype, subtype = ctype.split('/', 1)
>>> print maintype," ", subtype
application   octet-stream
>>> 
_subtype = 'octet-stream' ergibt aber auch besagten 'string/buffer' Error.
Das MP3 ist ok. Dachte erst, es könnte daran liegen. Werd' noch ein bischen probieren. Manchmal übersieht man ja ganz dumme Kleinigkeiten.
Gruss, Seven
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:wenn ich 'simplemail' importiere und dann ausführen lasse, bekomme ich auch
eine Fehlermeldung:

Code: Alles auswählen

 File "C:\Programme\Python24\lib\site-packages\simplemail.py", line 499
 email.message = \
                      ^
SyntaxError: invalid token
Hi Seven!

Ich habe den Code aus dem Forum heraus kopiert, in einem eigenen Ordner als "simplemail.py" abgespeichert und mit dem oben schon erwähnten Skript ausprobiert. Zuerst mit Linux und dann mit Windows. Es funktionierte.

Vielleicht hast du beim Kopieren einen Fehler gemacht. Versuche es doch noch einmal und verwende diesmal IDLE als Editor. Der sollte das Coding des Quellcodes auch korrekt speichern.

Wäre super, wenn ich von dir dazu noch einmal eine Rückmeldung bekomme. Vielleicht habe ich ja noch einen Fehler im Skript, der bei meiner Umgebung nicht aufscheint.

Edit:
Wie ich soeben ausprobiert habe --> IDLE ist ein genau so dummer Editor wie viele andere. # -*- coding: utf-8 -*- bedeutet noch lange nicht, dass IDLE sich auch daran hält und beim Speichern eine UTF-8-Datei daraus macht. Dummes Ding, ... --> # -*- coding: iso-8859-1 -*- verwenden.


lg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 11. Dezember 2005, 01:04, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Deine simplemail.py ist kaputt!

Installiere Python mal in bester Windowstradition neu ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Joghurt hat geschrieben:Deine simplemail.py ist kaputt!
Installiere Python mal in bester Windowstradition neu ;)
Hi Joghurt!

Netter Scherz :lol:

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Wäre super, wenn ich von dir dazu noch einmal eine Rückmeldung bekomme. Vielleicht habe ich ja noch einen Fehler im Skript, der bei meiner Umgebung nicht aufscheint.
Bekommst du. Heute ist aber zu wenig Zeit, weil ich gleich wieder zur Arbeit muss. Ich würde aber dennoch gerne verstehen, wo in meinem "Minimalscript" der Fehler liegt.
Kann es sein, daß Python den Soundtyp überhaupt nicht kennt ?

Code: Alles auswählen

IDLE 1.1.2      
>>> import sndhdr
>>> autype = sndhdr.what("E:/test.mp3")
>>> print autype
None
Eigendlich müsste in autype ein Tupel stehen mit den benötigten Infos:

(...) The sndhdr provides utility functions which attempt to determine the type of sound data which is in a file. When these functions are able to determine what type of sound data is stored in a file, they return a tuple (type, sampling_rate, channels, frames, bits_per_sample). The value for type indicates the data type and will be one of the strings 'aifc', 'aiff', 'au', 'hcom', 'sndr', 'sndt', 'voc', 'wav', '8svx', 'sb', 'ub', or 'ul'. (...). http://python.active-venture.com/lib/module-sndhdr.html

Schönen Sonntag ! Seven
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:Ich würde aber dennoch gerne verstehen, wo in meinem "Minimalscript" der Fehler liegt.
Hi Seven!

OK, dann her mit deinem Skript. Das hast du ja sicher seit dem letzten Mal ein wenig verändert. :)

Und hier noch eine Basisinformation:
Du kannst jeden Anhang als Type "application/octet-stream" verschicken. Egal ob es ein Bild oder ein MP3-File ist. Es muss funktionieren. Das mit der Unterscheidung zwischen den verschiedenen Content-Typen hat den Vorteil, dass die Codierung evt. effizienter gewählt werden kann und ein empfangendes Email-Programm evt. auch mit der Zusatzinformationen (audio/mpeg) etwas anfangen kann. Z.B. einen kleinen Audioplayer einblenden.
Wird *MIMEAudio* verwendet und der Parameter "_subtype" nicht angegeben, dann versucht *MIMEAudio* diesen selbst herauszufinden. Findet es den Subtype nicht heraus, dann wird ein Fehler geworfen.

Die Codezeile

Code: Alles auswählen

ctype, encoding = mimetypes.guess_type(filename)
gibt bei mir ("audio/mpeg", None) zurück, was ja auch korrekt ist. Das *encoding* ist nur für Textdateien wichtig.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

OK, dann her mit deinem Skript. Das hast du ja sicher seit dem letzten Mal ein wenig verändert. :)
Habe nur deine Analyse eingebaut. Wenn ich das hier eingebe,

Code: Alles auswählen

>>> import mimetypes
>>> ctype, encoding = mimetypes.guess_type('E:/test.mp3')
>>> print ctype," ",encoding
audio/mpeg   None
bekomme ich auch 'audio/mpeg'. Wenn ich mein Script starte bekomme ich die Fehlermeldung:
File "C:\Programme\Python24\lib\sre.py", line 142, in sub
return _compile(pattern, 0).sub(repl, string, count)
TypeError: expected string or buffer
_maintype wird richtig erkannt, das habe ich geprüft (maintype = 'audio')

Das Script:

Code: Alles auswählen

import smtplib, mimetypes
from email.MIMEAudio import MIMEAudio 
from email.MIMEMultipart import MIMEMultipart

absender = "absender@mail.de" 
empfaenger = "empfaenger@mail.de" 
betreff = "Betreff" 
datei = "Pfad\soundfile.mp3" 

msg = MIMEMultipart()
msg['From'] = absender
msg['To'] = empfaenger
msg['Subject'] = betreff
msg.preamble = ''
msg.epilogue = ''

ctype, encoding = mimetypes.guess_type(datei)
if ctype is None or encoding is not None: 
    ctype = 'application/octet-stream' 
maintype, subtype = ctype.split('/', 1)

if maintype == 'text': 
    fp = file(datei) 
    att = MIMEText(fp.read(), _subtype=subtype) 
    fp.close() 
elif maintype == 'audio': 
    fp = file(datei, 'rb') 
    att = MIMEAudio(fp.read(), _subtype=subtype) 
    fp.close()
    
msg.attach(att)

smtp_server = smtplib.SMTP('smtp.provider.domain') 
smtp_server.login('login','passwort') 
smtp_server.sendmail(absender, empfaenger, msg) 
smtp_server.quit()
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

gerold hat geschrieben:Netter Scherz :lol:
War ernst gemeint! Der Fehler tritt in "C:\Programme\Python24\lib\site-packages\simplemail.py" auf, was erstens auf eine Windowsinstallation und zweitens auf ein defektes simplemail.py schließen läßt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Joghurt hat geschrieben:
gerold hat geschrieben:Netter Scherz :lol:
War ernst gemeint!
Hi Joghurt!

Dir ist vielleicht nur nicht aufgefallen, dass es sich nicht um das Modul "sendmail.py" sondern um das von mir erstellte Modul "simplemail.py" handelt. :wink: Da der Fehler in einem selbst erstellten Modul auftritt, ist es ziemlich unwahrscheinlich, dass ein fehlerhaftes Python daran schuld ist.

Simplemail siehe: http://www.python-forum.de/viewtopic.php?t=3158

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Seven!

Ich komme heute nicht mehr dazu, mir deinen Quellcode anzusehen. Werde mich Morgen darum kümmern.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

So gehts. Mini-MP3-Mailer:

Code: Alles auswählen

import smtplib 
from email.MIMEAudio import MIMEAudio 
from email.MIMEMultipart import MIMEMultipart 

absender = 'absender@mail.de' 
empfaenger = 'empfaenger@mail.de' 
betreff = 'Betreff'
pfad = 'pfad'
datei = 'soundfile.mp3' 

msg = MIMEMultipart() 
msg['From'] = absender 
msg['To'] = empfaenger 
msg['Subject'] = betreff 
msg.preamble = '' 
msg.epilogue = '' 

att = open(pfad + datei, 'rb') 
snd = MIMEAudio(att.read(),_subtype='audio/mpeg') 
snd.add_header('Content-Disposition', 'attachment', filename = datei)
msg.attach(snd)
att.close()

smtp_server = smtplib.SMTP('smtp.provider.domain') 
smtp_server.login('login','passwort') 
smtp_server.sendmail(absender, empfaenger, msg.as_string()) 
smtp_server.quit()
Es muss ein Header und ein Bezeichner für das Attachment definiert werden (snd.add_header()) und beim Senden muß es msg.as_string() heißen. Irgendwas fehlt aber noch. Auf Platte gespeichert kann der Mediaplayer das File abspielen. Aus dem Mail heraus läßt es sich aber nicht öffnen. :roll:

Seven
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

gerold hat geschrieben:Dir ist vielleicht nur nicht aufgefallen, dass es sich nicht um das Modul "sendmail.py" sondern um das von mir erstellte Modul "simplemail.py" handelt.
Oops. Wer lesen kann, ist klar im Vorteil. :roll:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:Irgendwas fehlt aber noch. Auf Platte gespeichert kann der Mediaplayer das File abspielen. Aus dem Mail heraus läßt es sich aber nicht öffnen.
Hi Seven!

Bis auf

Code: Alles auswählen

snd = MIMEAudio(att.read(), _subtype='mpeg')
fällt mir nichts mehr auf. Sollte eigentlich so funktionieren.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Ok, geht nur bei GMX nicht. Ein anderer Account tuts.
Gruss, Seven
Antworten