Выберите случайный файл из каталога и отправьте его (Python, MIME) - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю над программой на python, которая случайным образом выбирает файл из каталога и затем отправляет его вам с помощью модуля email.mime.У меня проблема с тем, что я могу выбрать случайный файл, но не могу отправить его из-за этой ошибки:

 File "C:\Users\Mihkel\Desktop\dnak.py", line 37, in sendmemeone
    attachment  =open(filename, 'rb')
TypeError: expected str, bytes or os.PathLike object, not list

Вот код:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import  MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os
import random

path ='C:/Users/Mihkel/Desktop/memes'
files = os.listdir(path)
index = random.randrange(0, len(files))
print(files[index])

def send():
    email_user = 'yeetbotmemes@gmail.com'
    email_send = 'miku.rebane@gmail.com'
    subject = 'Test'
    msg = MIMEMultipart()
    msg['From'] = email_user
    msg['To']   = email_send
    msg['Subject'] = subject
    body = 'Here is your very own dank meme of the day:'
    msg.attach(MIMEText (body, 'plain'))
    filename=files
    attachment  =open(filename, 'rb')
    part = MIMEBase('application','octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition',"attachment; 
    filename= "+filename)
    msg.attach(part)
    text = msg.as_string()
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(email_user,"MY PASSWORD")
    server.sendmail(email_user,email_send,text)
    server.quit()

Я верю в этопросто получает имя файла в качестве выбранного случайного выбора, как я могу получить его, чтобы выбрать сам файл?

РЕДАКТИРОВАТЬ: После внесения рекомендуемых изменений я получаю эту ошибку:

File "C:\Users\Mihkel\Desktop\e8re.py", line 29, in send
    part.add_header('Content-Disposition',"attachment; filename= "+filename)
TypeError: can only concatenate str (not "list") to str

Похоже, эта часть все еще находится в списке, как бы это исправить?

1 Ответ

0 голосов
/ 11 декабря 2018

Вы выбираете случайный файл и затем выбрасываете его (ну, вы распечатываете , затем выбрасываете его):

files = os.listdir(path)
index = random.randrange(0, len(files))
print(files[index])

(кстати, вы можете сделать это с помощью random.choice(files))

и при вызове open вы передаете ему весь список files:

filename = files
attachment  = open(filename, 'rb')

Вместо этого передайте open выбранный вами файл:

attachment  = open(random.choice(files), 'rb')

Но , это все равно не сработает, поскольку listdir возвращает только имена файлов, а не полный путь, поэтому вам нужно будет вернуть его обратно, предпочтительно с os.path.join:

attachment  = open(os.path.join(path, random.choice(files)), 'rb')
...