LINUX.ORG.RU

Не понимаю, какой надо указать путь до файла

 


1

1

Всем привет.

Скрипт https://github.com/yatakoi/python-scripts/blob/master/email_to_telegram/main.py

Столкнулся с проблемой в блоке 102-106

        if os.path.exists("attachments"):  # Если есть вложения в письме, то отправляем и их.
            for file in os.listdir("attachments"):
                bot.send_document(chat_id, open(file, "rb"))
                os.remove(file)  # Удаляем отправленный файл
            os.rmdir("attachments")  # Удаляем пустую папку

Скрипт корректно получает письмо из ящика вместе с вложением, но когда он переходит на шаг отправки этого письма в телеграм, то начинает ругаться, что не может найти вложенный файл для отправки его в телеграм. Не могу понять, в какой строке надо указать правильный путь?

Ругается так

Traceback (most recent call last):
  File "main.py", line 143, in <module>
    send_emails_telegram(bot, chat)
  File "main.py", line 104, in send_emails_telegram
    bot.send_document(chat_id, open(file, "rb"))
FileNotFoundError: [Errno 2] No such file or directory: 'screenshot.PNG'

Скрипт находится по пути /home/m.kostromin/send_tickets и как я понял, он пытается найти файл screenshot.PNG по пути /home/m.kostromin/send_tickets/screenshot.PNG, а должен по /home/m.kostromin/send_tickets/INBOX/папка_тема_письма/attachments/screenshot.PNG

Где же ошибка в пути и как он тогда должен выглядеть этот путь?

Где же ошибка в пути и как он тогда должен выглядеть этот путь?

bot.send_document(chat_id, open("attachments/" + file, "rb"))

Не?

anonymous
()

он пытается

найти файл по пути в переменной file, чего тут годать то, print и посмотреть.

Скорее всего там путь относительно каталога запуска скрипта.

vvn_black ★★★★★
()
Ответ на: комментарий от anonymous

Урраааа, работает! Миллион спасибо )))

yatakoi
() автор топика

Но как обычно, всплывает другая проблема.

Если вложение с именем на русском, например «снимок.jpg», то

Traceback (most recent call last):
  File "main.py", line 139, in <module>
    last_uid = get_emails(host, login, password, last_uid=last_uid)
  File "main.py", line 54, in get_emails
    mail = mailparser.parse_from_bytes(message_data[b"RFC822"])
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-package                                                                                        s/mailparser/mailparser.py", line 116, in parse_from_bytes
    return MailParser.from_bytes(bt)
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-package                                                                                        s/mailparser/mailparser.py", line 239, in from_bytes
    return cls(message)
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-package                                                                                        s/mailparser/mailparser.py", line 136, in __init__
    self.parse()
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-package                                                                                        s/mailparser/mailparser.py", line 374, in parse
    p.get('content-disposition'))
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-package                                                                                        s/mailparser/utils.py", line 80, in wrapper
    return normalize('NFC', func(*args, **kwargs))
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-package                                                                                        s/mailparser/utils.py", line 114, in ported_string
    return six.text_type(raw_data, encoding).strip()
TypeError: decoding to str: need a bytes-like object, Header found

Кто-нибудь боролся с «TypeError: decoding to str: need a bytes-like object, Header found»?

yatakoi
() автор топика
Ответ на: комментарий от Morin

Не, тут дело в авторе скрипта.

anonymous
()
Ответ на: комментарий от yatakoi

Если вложение с именем на русском, например «снимок.jpg»

Замени «имя» на «хэш» (MD5, например). А то замучаешься этот свой mailparser «разгадывать».

anonymous
()
Ответ на: комментарий от eternal_sorrow

Можно узнать почему?

Сделал как ты написал

if os.path.exists("attachments"):  # Если есть вложения в письме, то отправляем и их.
            for file in os.listdir("attachments"):
                bot.send_document(chat_id, os.path.join('attachments', file))
                os.remove("attachments/" + file)  # Удаляем отправленный файл
            os.rmdir("attachments")  # Удаляем пустую папку

Но

Traceback (most recent call last):
  File "./main.py", line 143, in <module>
    send_emails_telegram(bot, chat)
  File "./main.py", line 104, in send_emails_telegram
    bot.send_document(chat_id, os.path.join('attachments', file))
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-packages/telebot/__init__.py", line 764, in send_document
    parse_mode, disable_notification, timeout, caption=caption))
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-packages/telebot/apihelper.py", line 604, in send_data
    return _make_request(token, method_url, params=payload, files=files, method='post')
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-packages/telebot/apihelper.py", line 69, in _make_request
    return _check_result(method_name, result)['result']
  File "/home/m.kostromin/send_tickets/send_tickets/lib64/python3.6/site-packages/telebot/apihelper.py", line 88, in _check_result
    raise ApiException(msg, method_name, result)
telebot.apihelper.ApiException: A request to the Telegram API was unsuccessful. The server returned HTTP 400 Bad Request. Response body:
[b'{"ok":false,"error_code":400,"description":"Bad Request: wrong HTTP URL specified"}']

Ругается на 104 строку это как раз строка bot.send_document(chat_id, os.path.join(‘attachments’, file))

yatakoi
() автор топика
Ответ на: комментарий от yatakoi

нет, он просто пришел отметиться в питонотеме, возможно даже сейчас чего сказанет нелицеприятного. Ты дружочек чего собственно хочешь? Если хочешь чтобы тебе исправили скрипт и доработали, то в job если ищешь инфу, то в документацию и гугл.

anonymous
()
Ответ на: комментарий от anonymous

Мне кажется, что много не прошу. Пытался погуглить по своей проблеме, но ничего не нашел. Так же гуглил «TypeError: decoding to str: need a bytes-like object, Header found», а там совсем не по моей проблеме.

Проблема собственно в том, что если файл вложение на кириллице, то TypeError: decoding to str: need a bytes-like object, Header found. Сижу и думаю: что еще за байтовый объект?

И как-то не понятно: А форум зачем? Просто поболтать?

yatakoi
() автор топика
Последнее исправление: yatakoi (всего исправлений: 2)
Ответ на: комментарий от yatakoi

Это тебе кажется, дорабатывать скрипт до вменяемого состояния это в job если сам не хочешь разбираться ну или довольствуйся чем есть, обходной путь тебе тоже уже сказали, всегда есть транслит, есть возможность получить хеш от строки, вариантов как обойти кириллицу и не связываться с юникодом в python достаточно. В этом и суть, все что у тебя вызывает вопросы, написано в книгах и документации, их нужно просто прочитать и разобраться. А ты хочешь разгребать жар чужими руками. Тебе уже на изначальную проблему ответили, ты продолжаешь приходить с «теперь другая проблема» дорабатывая свой скрипт за счет других сочувствующих. Кстати, все гуглится без проблем, просто ты не знаешь языка реализации и не программируешь на нем, поэтому даже если ты найдешь нужную информацию она для тебя бесполезна.

Форум уж точно не для того, чтобы решать за тебя твои задачки. Если бы у тебя была реально какая-то проблема, или баг которого нет в трекере или любой другой аналог, то да можно было бы обсуждать, а у тебя банальная лень и нежелание что-то делать самому и чему-то учиться, ты не пытаешься решить свою задачу.

anonymous
()
Ответ на: комментарий от anonymous

Не лень уж точно. Стараюсь разобраться.

yatakoi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.