Seite 1 von 1

email mit Anhang versenden

Verfasst: Montag 27. März 2017, 07:43
von muscat
hallo,

bin noch nicht so fit, und würde gerne eine email mit Anhang versenden.
Ich habe Python version 2.7.9 und folgendes script aus dem IN

Code: Alles auswählen

import smtplib
fromaddr = "*@gmail.com"
toaddrs = "*@gmail.com"

msg = "help I cannot send an attachment to save my life"
attachment = "/home/pi/v1.txt"
#print type (attachment)

username = "*@gmail.com"
password = "*"

server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg, attachment)
server.quit()
leider endet das script immer mit der Fehlermeldung:

Traceback (most recent call last):
File "*", line 15, in <module>
server.sendmail(fromaddr, toaddrs, msg, attachment)
File "/usr/lib/python2.7/smtplib.py", line 736, in sendmail
raise SMTPSenderRefused(code, resp, from_addr)
smtplib.SMTPSenderRefused: (555, '5.5.2 Syntax error. u145sm13059786wmu.1 - gsmtp', '*')

hat jemand eine Idee?

thanks georg

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 07:51
von /me
Ich habe ja gewisse Zweifel daran, dass deine Mailadresse wirklich *@gmail.com ist.

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 10:05
von muscat
hey /me

richtig, wollte meine Daten halt nicht offen legen. Im script stehen halt schon meine richtigen Daten. Wenn ich das attachmend lösche, arbeitet das script. Aber mit attachmend halt nicht.

mfg

georg

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 12:02
von Sirius3
@muscat: vielleicht solltest Du nicht die Syntax raten. Woher hast Du denn die absurde Idee, dass Attachements als vierter Parameter von sendmail angegeben werden könnten?

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 13:16
von muscat

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 13:21
von Sirius3
@muscat: bei Stackoverflow stellt jemand eine Frage und bekommt dann eine gewisse Anzahl an Antworten. Die Antwort mit den meisten Punkten steht dann ganz oben und ist dann nach Schwarmintelligenz die beste Antwort. Es macht wenig Sinn den fehlerhaften Code der Frage zu benutzen.

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 14:31
von muscat
ok, danke.

werde es berücksichtigen.

habe mein kleines problem inzwischen auch gelöst.

mfg

georg

Re: email mit Anhang versenden

Verfasst: Montag 27. März 2017, 15:15
von aaron
Es wäre super, wenn Du deine Lösung hier zeigen würdest.

Re: email mit Anhang versenden

Verfasst: Dienstag 28. März 2017, 08:07
von muscat
hallo,

na klar. hier ist die datei. wenn es verbesserungen etc gibt, wäre ich natürlich auch interessiert.

Code: Alles auswählen

# holt von einer email das attachment und speichert es im ordner /home/pi.
# dabei wird die alte datei ueberschrieben-

import poplib
import email

server = poplib.POP3_SSL('pop.googlemail.com', '995')
server.user("user")
server.pass_("pass")

# get amount of new mails and get the emails for them
messages = [server.retr(n+1) for n in range(len(server.list()[1]))]

# for every message get the second item (the message itself) and convert it to a string with \n; then create python email with the strings
emails = [email.message_from_string('\n'.join(message[1])) for message in messages]

for mail in emails:
    # check for attachment;
    for part in mail.walk():
        if not mail.is_multipart():
            continue
        if mail.get('Content-Disposition'):
            continue
        file_name = part.get_filename()
        # check if email park has filename --> attachment part

        if file_name:
            file = open("/home/pi/"+file_name,'w+')
            file.write(part.get_payload(decode=True))
            file.close()
in der Vorschau zeigt er mir die Einrückungen an, aber nach dem Absenden nicht mehr?

mfg

georg

Re: email mit Anhang versenden

Verfasst: Dienstag 28. März 2017, 09:44
von Sirius3
@muscat: Dein gezeigt Code hat jetzt nur nichts mehr mit Senden sondern nur mit Empfangen zu tun. Zum Darstellen von Code im Forum gibt es die CodeBox, das Dropdown "Code auswählen" direkt über dem Editfeld.

continue sollte man vermeiden, und wie oft glaubst Du ist die Bedingung mail.is_multipart gültig, wenn sie schon beim ersten part nicht gültig war?
Du möchtest Dateien mit dem Modus "wb" und nicht "w+" öffnen. Die Frage ist, wie vertrauenswürdig sind Dateinamen in Emails, dass man sie so einfach irgendwohin auf der Platte speichern möchte.

Code: Alles auswählen

# holt von einer email das attachment und speichert es im ordner /home/pi.
# dabei wird die alte datei ueberschrieben-

import poplib
import email

server = poplib.POP3_SSL('pop.googlemail.com', '995')
server.user("user")
server.pass_("pass")

# get amount of new mails and get the emails for them
num_messages = len(server.list()[1])
messages = [server.retr(n) for n in range(1, num_messages+1)]

# for every message get the second item (the message itself) and convert it to a string with \n; then create python email with the strings
emails = [email.message_from_string('\n'.join(message[1])) for message in messages]

for mail in emails:
    # check for attachment;
    if mail.is_multipart() and mail.get('Content-Disposition'):
        for part in mail.walk():
            file_name = part.get_filename()
            # check if email park has filename --> attachment part

            if file_name:
                with open(os.path.join("/home/pi", os.path.basename(file_name)), 'wb') as output:
                    output.write(part.get_payload(decode=True))