Форум сайта python.su
Добрый день.
Пишу бот отправка сообщение на почту с вложением.
Могу из бота сохранить вложение локально и потом сохраненные файлы отправить вложением на почту.
Но как миновать фазу сохранить вложения перед отправкой на почту локально, а сразу, получив из бота ссылку на файл бота типа ( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
отправить вложением на почту?
Для этого могу использовать yagmail или email + smtplib
Офлайн
например такой код, как модифицировать.
import os import smtplib import sys from configparser import ConfigParser from email import encoders from email.mime.text import MIMEText from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart from email.utils import formatdate #---------------------------------------------------------------------- def send_email_with_attachment(subject, body_text, to_emails, cc_emails, bcc_emails, file_to_attach): """ Send an email with an attachment """ base_path = os.path.dirname(os.path.abspath(__file__)) config_path = os.path.join(base_path, "email.ini") header = 'Content-Disposition', 'attachment; filename="%s"' % file_to_attach # get the config if os.path.exists(config_path): cfg = ConfigParser() cfg.read(config_path) else: print("Config not found! Exiting!") sys.exit(1) # extract server and from_addr from config host = cfg.get("smtp", "server") from_addr = cfg.get("smtp", "from_addr") # create the message msg = MIMEMultipart() msg["From"] = from_addr msg["Subject"] = subject msg["Date"] = formatdate(localtime=True) if body_text: msg.attach( MIMEText(body_text) ) msg["To"] = ', '.join(to_emails) msg["cc"] = ', '.join(cc_emails) attachment = MIMEBase('application', "octet-stream") try: with open(file_to_attach, "rb") as fh: data = fh.read() attachment.set_payload( data ) encoders.encode_base64(attachment) attachment.add_header(*header) msg.attach(attachment) except IOError: msg = "Error opening attachment file %s" % file_to_attach print(msg) sys.exit(1) emails = to_emails + cc_emails server = smtplib.SMTP(host) server.sendmail(from_addr, emails, msg.as_string()) server.quit() if __name__ == "__main__": emails = ["mike@someAddress.org", "nedry@jp.net"] cc_emails = ["someone@gmail.com"] bcc_emails = ["anonymous@circe.org"] subject = "Test email with attachment from Python" body_text = "This email contains an attachment!" path = "/path/to/some/file" send_email_with_attachment(subject, body_text, emails,cc_emails, bcc_emails, path)
Офлайн
Или такой код:
import yagmail def send_email(subject, body_text, html, imag, to_emails, bb_c): yagmail.SMTP({"name@gmail.com": ",bla@,bla.ru"}, "passwd").send( to=to_emails, subject=subject, contents=body_text, attachments=imag)
Офлайн
Как использовать в качестве вложения почтового сообщения не файл на диске, а ссылку типа
( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
??????
Отредактировано sanblchsun (Июль 12, 2021 15:26:06)
Офлайн
sanblchsunЭтот файл хранится в облаке Telegram'а.
Как использовать в качестве вложения почтового сообщения не файл на диске, а ссылку типа
( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
?
Офлайн
py.user.nextДобрый день, про секретный токен я в курсе и если я передаю ссылку в рамках своего приложения, то какая проблема? Это обычная ссылка и я конечно не планирую ее передавать в теле письма,
try: with open(file_to_attach, "rb") as fh: data = fh.read()
Офлайн
sanblchsunне знаю есть ли такая возможность через API,попробовать взять ссылку на пост, в самом телеграмме это когда нажимаешь правой кнопкой мыши на сообщение и там есть такой пункт,только вроде для открытых чатов, ну и ссылку уже передавать по почте
Но как миновать фазу сохранить вложения перед отправкой на почту локально, а сразу, получив из бота ссылку на файл бота типа ( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
Офлайн
sanblchsunПо-моему, ты даже не понимаешь, что такое письмо. Нет никакой разницы, где ты передаёшь ссылку, в теле письма или во вложении к письму. Она одинаково видна и там и там, потому что письмо - это единое целое. Когда письмо читается программным клиентом, оно берётся как единое целое и по знакам раскладывается на части, чтобы просто красиво смотреться. Так появляются поля “от кого”, “кому”, “тема” и другие, есть тело письма, и отдельно идут вложения. При этом оно как было целым, так и остаётся.
Это обычная ссылка и я конечно не планирую ее передавать в теле письма
sanblchsunДумаю, это возможно, так как используется протокол HTTP, но закачивание всего файла в оперативную память может привести к тому, что её не хватит. Поэтому сначала файл нужно куда-то сохранить, скачивая его по частям, а потом уже оттуда, где он сохранён и не исчезнет в течение часа, передавать его дальше.
Трудно поверить, что сие не возможно.
Офлайн
py.user.nextТы даже не понял, что я спрашивал. Это оставим.
По-моему, ты даже не понимаешь, что такое письмо. Нет никакой разницы, где ты передаёшь ссылку, в теле письма или во вложении к письму. Она одинаково видна и там и там, потому что письмо - это единое целое. Когда письмо читается программным клиентом, оно берётся как единое целое и по знакам раскладывается на части, чтобы просто красиво смотреться. Так появляются поля “от кого”, “кому”, “тема” и другие, есть тело письма, и отдельно идут вложения. При этом оно как было целым, так и остаётся.
py.user.nextА это интересно!
Думаю, это возможно, так как используется протокол HTTP, но закачивание всего файла в оперативную память может привести к тому, что её не хватит. Поэтому сначала файл нужно куда-то сохранить, скачивая его по частям, а потом уже оттуда, где он сохранён и не исчезнет в течение часа, передавать его дальше.
Отредактировано sanblchsun (Июль 14, 2021 16:11:49)
Офлайн
sanblchsunЕщё раз тебе пишу: 1) в хостинговой ссылке нет никакого токена для управления ботом (вплоть до стирания этого бота); 2) хостинговый файл никуда не денется сам по себе, когда там пройдёт час, пять часов, неделя.
Какая разница, как я буду передавать файл-вложение в почту скачивая с диска хоста или с HTTP/сылки.
sanblchsunОн может не поместиться в памяти, если он на несколько гигабайт, например. Также сетевое соединение может быть разорвано и файл нужно будет докачивать, а не качать заново. Telegram не будет тебя обслуживать. Он подождёт немножко и скинет тебя нафиг. Если ты не докачал там что-то, ему пофигу.
Ведь тут не идет о построчном скачивании, а в данном случае получаешь файл полностью и передаешь его на почтовый сервер.
Офлайн