2016-12-14 5 views
1

У меня есть функция, которая сохраняет вложение, когда пользователь отправляет мою форму и загружает файл, эта функция также отправляет электронное письмо. Я хочу, чтобы эта функция использовала поданный файл в качестве вложения для электронной почты. Я пытался сделать это так:Присоединить файл к электронной почте из отправленной формы

def send_email(subject, sender, recipients, text_body): 
    FILE_TYPES = set(['txt', 'doc', 'docx', 'odt', 'pdf', 'rtf', 'text', 'wks', 'wps', 'wpd']) 
    form = ApplicationForm (request.files) 
    submit_name = form.file_upload.data.filename 
    mail = Mail(app) 
    msg = Message(subject, sender=sender, recipients=recipients) 
    msg.body = text_body 
    if '.' in submit_name and submit_name.rsplit('.', 1)[1] in FILE_TYPES: 
     filename = secure_filename(submit_name) 
     form.file_upload.data.save('uploads/' + filename) 
     with app.open_resource('uploads/' + filename) as fp: 
      msg.attach(filename, fp.read()) #attaches the submitted file to the email 
     print 'file sent successfully' 
    mail.send(msg) 

Edit: Теперь получаю следующее сообщение об ошибке:

TypeError: __init__() takes exactly 3 arguments (75 given) 

Traceback:

Traceback (most recent call last): 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 2000, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1991, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1567, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1988, in wsgi_app 
    response = self.full_dispatch_request() 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1641, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1544, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "C:\PYTHON27\lib\site-packages\flask\app.py", line 1625, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "C:\Users\richard.danvers\application\app\views.py", line 87, in index 
    department_data=form.department.data 
    File "C:\Users\richard.danvers\application\app\views.py", line 30, in send_email 
    mail.send(msg) # if no file is uploaded email is sent without any attachment 
    File "C:\PYTHON27\lib\site-packages\flask_mail.py", line 492, in send 
    message.send(connection) 
    File "C:\PYTHON27\lib\site-packages\flask_mail.py", line 427, in send 
    connection.send(self) 
    File "C:\PYTHON27\lib\site-packages\flask_mail.py", line 190, in send 
    message.as_bytes() if PY3 else message.as_string(), 
    File "C:\PYTHON27\lib\site-packages\flask_mail.py", line 381, in as_string 
    return self._message().as_string() 
    File "C:\PYTHON27\lib\site-packages\flask_mail.py", line 349, in _message 
    f = MIMEBase(*attachment.content_type.split('/')) 
TypeError: __init__() takes exactly 3 arguments (75 given) 
+0

в вопросе всегда показывает полное сообщение об ошибке (Traceback). Может быть более полезная информация. – furas

+0

Traceback теперь включен. –

+1

У вас есть файл ''C: \\ Пользователи \\ richard.danvers \\ application \\ answer.docx''? Я вижу, что вы сохраняете файл в ''uploads /' + filename', но вы читаете его из' filename', а не ''uploads /' + filename'. – furas

ответ

1

Я вижу две проблемы

  • Вы экономите "upload/"+filename, но лет у читать из filename - вы должны прочитать из "upload/"+filename

  • когда вы Атташе файл, то вы не делаете mail.send(msg), так что вы не отправлять почту. Вам нужен код без `еще:

    if '.' in submit_name and submit_name.rsplit('.', 1)[1] in FILE_TYPES: 
        filename = secure_filename(submit_name) 
        form.file_upload.data.save('uploads/' + filename) 
        with app.open_resource('uploads/' + filename) as fp: 
         msg.attach(filename, fp.read()) 
         print 'file sent successfully' 
    
    # send mail with or without attachment 
    
    mail.send(msg) 
    
+0

Теперь я добавил mail.send (msg) и включил 'uploads /' + filename в read. Теперь, получая эту ошибку: __init __() принимает ровно 3 аргумента (75 данных) –

+0

, у вас есть новая проблема, поэтому вам нужно создать новый вопрос о SO. но сначала проверьте документацию, как файл атташе https://docs.python.org/3/library/email-examples.html – furas

+0

Я вижу, я не могу сейчас задавать больше вопросов, поскольку мне было запрещено делать это! Я просмотрю документацию и поиск исправления. Спасибо за вашу помощь. –