Найти - Пользователи
Полная версия: telegram bot
Начало » Python для экспертов » telegram bot
1 2
sanblchsun
Добрый день.
Пишу бот отправка сообщение на почту с вложением.
Могу из бота сохранить вложение локально и потом сохраненные файлы отправить вложением на почту.
Но как миновать фазу сохранить вложения перед отправкой на почту локально, а сразу, получив из бота ссылку на файл бота типа ( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
отправить вложением на почту?

Для этого могу использовать yagmail или email + smtplib
sanblchsun
например такой код, как модифицировать.

 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)
sanblchsun
Или такой код:

 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)
sanblchsun
Как использовать в качестве вложения почтового сообщения не файл на диске, а ссылку типа
( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
??????
py.user.next
sanblchsun
Как использовать в качестве вложения почтового сообщения не файл на диске, а ссылку типа
( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
?
Этот файл хранится в облаке Telegram'а.
https://core.telegram.org/bots/api#file
Ссылку ты не можешь отправлять. Во-первых, в ней секрет находится, во-вторых, она действует временно.
Для отправки файла его надо скачать сначала.

Так что бот на хостинге должен скачать файл на хостинг, потом послать этот файл по почте, а потом стереть файл с хостинга.
sanblchsun
py.user.next
Добрый день, про секретный токен я в курсе и если я передаю ссылку в рамках своего приложения, то какая проблема? Это обычная ссылка и я конечно не планирую ее передавать в теле письма,

Просто хочу вместо этого примера, где файл считывается с диска хостинга:
     
    try:
        with open(file_to_attach, "rb") as fh:
            data = fh.read()

Файл считывался прямо из облака Telegram'а.
Я такого способа не нахожу в интернете. Трудно поверить, что сие не возможно. Что же буду искать.
xam1816
sanblchsun
Но как миновать фазу сохранить вложения перед отправкой на почту локально, а сразу, получив из бота ссылку на файл бота типа ( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
не знаю есть ли такая возможность через API,попробовать взять ссылку на пост, в самом телеграмме это когда нажимаешь правой кнопкой мыши на сообщение и там есть такой пункт,только вроде для открытых чатов, ну и ссылку уже передавать по почте
py.user.next
sanblchsun
Это обычная ссылка и я конечно не планирую ее передавать в теле письма
По-моему, ты даже не понимаешь, что такое письмо. Нет никакой разницы, где ты передаёшь ссылку, в теле письма или во вложении к письму. Она одинаково видна и там и там, потому что письмо - это единое целое. Когда письмо читается программным клиентом, оно берётся как единое целое и по знакам раскладывается на части, чтобы просто красиво смотреться. Так появляются поля “от кого”, “кому”, “тема” и другие, есть тело письма, и отдельно идут вложения. При этом оно как было целым, так и остаётся.

sanblchsun
Трудно поверить, что сие не возможно.
Думаю, это возможно, так как используется протокол HTTP, но закачивание всего файла в оперативную память может привести к тому, что её не хватит. Поэтому сначала файл нужно куда-то сохранить, скачивая его по частям, а потом уже оттуда, где он сохранён и не исчезнет в течение часа, передавать его дальше.
sanblchsun
py.user.next
По-моему, ты даже не понимаешь, что такое письмо. Нет никакой разницы, где ты передаёшь ссылку, в теле письма или во вложении к письму. Она одинаково видна и там и там, потому что письмо - это единое целое. Когда письмо читается программным клиентом, оно берётся как единое целое и по знакам раскладывается на части, чтобы просто красиво смотреться. Так появляются поля “от кого”, “кому”, “тема” и другие, есть тело письма, и отдельно идут вложения. При этом оно как было целым, так и остаётся.
Ты даже не понял, что я спрашивал. Это оставим.
py.user.next
Думаю, это возможно, так как используется протокол HTTP, но закачивание всего файла в оперативную память может привести к тому, что её не хватит. Поэтому сначала файл нужно куда-то сохранить, скачивая его по частям, а потом уже оттуда, где он сохранён и не исчезнет в течение часа, передавать его дальше.
А это интересно!
Какая разница, как я буду передавать файл-вложение в почту скачивая с диска хоста или с HTTP/сылки. Ведь тут не идет о построчном скачивании, а в данном случае получаешь файл полностью и передаешь его на почтовый сервер. И в любом случае используется объем оперативной памяти одинаково. Как думаешь?
py.user.next
sanblchsun
Какая разница, как я буду передавать файл-вложение в почту скачивая с диска хоста или с HTTP/сылки.
Ещё раз тебе пишу: 1) в хостинговой ссылке нет никакого токена для управления ботом (вплоть до стирания этого бота); 2) хостинговый файл никуда не денется сам по себе, когда там пройдёт час, пять часов, неделя.

Ты просто файл берёшь с Telegram'а и отсоединяешь его от Telegram'овских правил хранения и передачи файла. Там эти правила зависят от того, сколько пользователей у Telegram'а и сколько пользователей там одновременно что-то качают. Поэтому он и ограничения вводит.

sanblchsun
Ведь тут не идет о построчном скачивании, а в данном случае получаешь файл полностью и передаешь его на почтовый сервер.
Он может не поместиться в памяти, если он на несколько гигабайт, например. Также сетевое соединение может быть разорвано и файл нужно будет докачивать, а не качать заново. Telegram не будет тебя обслуживать. Он подождёт немножко и скинет тебя нафиг. Если ты не докачал там что-то, ему пофигу.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB