Уведомления

Группа в Telegram: @pythonsu

#1 Июль 12, 2021 13:44:43

sanblchsun
Зарегистрирован: 2021-07-12
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

telegram bot

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

Для этого могу использовать yagmail или email + smtplib

Офлайн

#2 Июль 12, 2021 15:16:56

sanblchsun
Зарегистрирован: 2021-07-12
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

telegram bot

например такой код, как модифицировать.

 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)

Офлайн

#3 Июль 12, 2021 15:23:12

sanblchsun
Зарегистрирован: 2021-07-12
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

telegram bot

Или такой код:

 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)

Офлайн

#4 Июль 12, 2021 15:25:54

sanblchsun
Зарегистрирован: 2021-07-12
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

telegram bot

Как использовать в качестве вложения почтового сообщения не файл на диске, а ссылку типа
( http://api.telegram.org/file/bot{API_TOKEN}/{file_info.file_path} )
??????

Отредактировано sanblchsun (Июль 12, 2021 15:26:06)

Офлайн

#5 Июль 12, 2021 23:54:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

telegram bot

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

Так что бот на хостинге должен скачать файл на хостинг, потом послать этот файл по почте, а потом стереть файл с хостинга.



Офлайн

#6 Июль 13, 2021 12:34:16

sanblchsun
Зарегистрирован: 2021-07-12
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

telegram bot

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

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

Файл считывался прямо из облака Telegram'а.
Я такого способа не нахожу в интернете. Трудно поверить, что сие не возможно. Что же буду искать.

Офлайн

#7 Июль 13, 2021 18:53:29

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

telegram bot

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

Офлайн

#8 Июль 14, 2021 01:27:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

telegram bot

sanblchsun
Это обычная ссылка и я конечно не планирую ее передавать в теле письма
По-моему, ты даже не понимаешь, что такое письмо. Нет никакой разницы, где ты передаёшь ссылку, в теле письма или во вложении к письму. Она одинаково видна и там и там, потому что письмо - это единое целое. Когда письмо читается программным клиентом, оно берётся как единое целое и по знакам раскладывается на части, чтобы просто красиво смотреться. Так появляются поля “от кого”, “кому”, “тема” и другие, есть тело письма, и отдельно идут вложения. При этом оно как было целым, так и остаётся.

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



Офлайн

#9 Июль 14, 2021 16:03:30

sanblchsun
Зарегистрирован: 2021-07-12
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

telegram bot

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

Отредактировано sanblchsun (Июль 14, 2021 16:11:49)

Офлайн

#10 Июль 15, 2021 03:28:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

telegram bot

sanblchsun
Какая разница, как я буду передавать файл-вложение в почту скачивая с диска хоста или с HTTP/сылки.
Ещё раз тебе пишу: 1) в хостинговой ссылке нет никакого токена для управления ботом (вплоть до стирания этого бота); 2) хостинговый файл никуда не денется сам по себе, когда там пройдёт час, пять часов, неделя.

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

sanblchsun
Ведь тут не идет о построчном скачивании, а в данном случае получаешь файл полностью и передаешь его на почтовый сервер.
Он может не поместиться в памяти, если он на несколько гигабайт, например. Также сетевое соединение может быть разорвано и файл нужно будет докачивать, а не качать заново. Telegram не будет тебя обслуживать. Он подождёт немножко и скинет тебя нафиг. Если ты не докачал там что-то, ему пофигу.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version