telegram email

This commit is contained in:
Vladimir V Maksimov
2025-12-10 17:14:16 +03:00
parent b20e040fae
commit 1d9d56dc87
5 changed files with 156 additions and 4 deletions

31
email.go Normal file
View File

@@ -0,0 +1,31 @@
package notify
import (
"errors"
"net/mail"
"net/smtp"
"github.com/scorredoira/email"
)
type SmtpAuth struct {
Addr string
Auth smtp.Auth
}
func SendEmailHTML(auth SmtpAuth, message, subject string, from mail.Address, to ...mail.Address) error {
if len(to) == 0 {
return errors.New("expected least one receiver")
}
mes := email.NewMessage(subject, message)
mes.BodyContentType = "text/html;"
mes.From = from
for _, ito := range to {
mes.AddTo(ito)
}
return email.Send(auth.Addr, auth.Auth, mes)
}
func SenndEmailMessage(auth SmtpAuth, mes *email.Message) error {
return email.Send(auth.Addr, auth.Auth, mes)
}

7
go.mod
View File

@@ -4,10 +4,9 @@ go 1.25.1
require (
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
github.com/mattn/go-runewidth v0.0.19
github.com/scorredoira/email v0.0.0-20191107070024-dc7b732c55da
gopkg.in/yaml.v2 v2.4.0
)
require (
github.com/clipperhouse/uax29/v2 v2.2.0 // indirect
github.com/mattn/go-runewidth v0.0.19 // indirect
)
require github.com/clipperhouse/uax29/v2 v2.2.0 // indirect

2
go.sum
View File

@@ -4,6 +4,8 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGi
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/scorredoira/email v0.0.0-20191107070024-dc7b732c55da h1:hhmnjfzz7szp75AyXxn8tDfEA0oU4REQLmpuW6zNAOY=
github.com/scorredoira/email v0.0.0-20191107070024-dc7b732c55da/go.mod h1:Q5ljvYIBpukMH+wgB8kcPV1i9NX8TqU++8GgBKq3pt0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

View File

@@ -55,6 +55,10 @@ func NewTelegram(token string, disableIPV6 bool) (*Bot, error) {
return bot, nil
}
func (s *Bot) GetAPI() *tgbotapi.BotAPI {
return s.api
}
func (s *Bot) SendTextMessage(chatID int64, text string) (tgbotapi.Message, error) {
message := tgbotapi.NewMessage(chatID, text)
message.ParseMode = "Markdown"
@@ -66,3 +70,54 @@ func (s *Bot) SendHTMLMessage(chatID int64, text string) (tgbotapi.Message, erro
message.ParseMode = "HTML"
return s.api.Send(message)
}
func (s *Bot) SendPhotoFromFile(chatID int64, filePath string, caption string) (tgbotapi.Message, error) {
photo := tgbotapi.NewPhoto(chatID, tgbotapi.FilePath(filePath))
photo.Caption = caption
photo.ParseMode = "Markdown" // или "HTML"
return s.api.Send(photo)
}
func (s *Bot) SendPhotoFromURL(chatID int64, fileURL string, caption string) (tgbotapi.Message, error) {
photo := tgbotapi.NewPhoto(chatID, tgbotapi.FileURL(fileURL))
photo.Caption = caption
photo.ParseMode = "Markdown"
return s.api.Send(photo)
}
func (s *Bot) SendPhotoFromBytes(chatID int64, data []byte, filename string, caption string) (tgbotapi.Message, error) {
file := tgbotapi.FileBytes{
Name: filename,
Bytes: data,
}
photo := tgbotapi.NewPhoto(chatID, file)
photo.Caption = caption
photo.ParseMode = "Markdown"
return s.api.Send(photo)
}
func (s *Bot) SendDocumentFromFile(chatID int64, filePath string, caption string) (tgbotapi.Message, error) {
doc := tgbotapi.NewDocument(chatID, tgbotapi.FilePath(filePath))
doc.Caption = caption
doc.ParseMode = "Markdown"
return s.api.Send(doc)
}
func (s *Bot) SendDocumentFromURL(chatID int64, fileURL string, caption string) (tgbotapi.Message, error) {
doc := tgbotapi.NewDocument(chatID, tgbotapi.FileURL(fileURL))
doc.Caption = caption
doc.ParseMode = "Markdown"
return s.api.Send(doc)
}
func (s *Bot) SendDocumentFromBytes(chatID int64, data []byte, filename string, caption string) (tgbotapi.Message, error) {
file := tgbotapi.FileBytes{
Name: filename,
Bytes: data,
}
doc := tgbotapi.NewDocument(chatID, file)
doc.Caption = caption
doc.ParseMode = "Markdown"
return s.api.Send(doc)
}

View File

@@ -1,10 +1,12 @@
package notify_test
import (
"encoding/json"
"os"
"testing"
"git.gm6.ru/icewind/notify"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"gopkg.in/yaml.v2"
)
@@ -13,6 +15,14 @@ type ConfigTelegram struct {
Token string `yaml:"token"`
}
func loadText(t *testing.T) []byte {
cData, err := os.ReadFile("test_data/text.txt")
if err != nil {
t.Fatal(err)
}
return cData
}
func loadConfig(t *testing.T) (conf ConfigTelegram) {
cData, err := os.ReadFile("test_data/telegram.yaml")
if err != nil {
@@ -63,3 +73,58 @@ func TestSendTable(t *testing.T) {
}
t.Log(m)
}
func TestTelegramUpdate(t *testing.T) {
conf := loadConfig(t)
bot, err := notify.NewTelegram(conf.Token, true)
if err != nil {
t.Fatal(err)
}
u := tgbotapi.NewUpdate(0)
u.AllowedUpdates = []string{
"message",
"chat_member",
"my_chat_member",
}
u.Timeout = 30
for {
updates, err := bot.GetAPI().GetUpdates(u)
if err != nil {
t.Fatal(err)
}
if len(updates) > 0 {
data, _ := json.Marshal(updates)
t.Log(string(data))
}
}
}
func TestTelegramDocument(t *testing.T) {
conf := loadConfig(t)
bot, err := notify.NewTelegram(conf.Token, true)
text := loadText(t)
caption := `Голотип номинативного подвида был собран на склонах горы Натсфорд в горах Оуэн-Стэнли. Он был описан английским орнитологом Чарлзом Де Висом в 1890 году. В том же году Адольф Питер Гудвин (Adolph Peter Goodwin) описал синонимичный вид Xanthomelus macgregori, полученный на том же хребте, но на горе Масгрейв[14]. Птицы этого подвида обитают в юго-восточной части Новой Гвинеи от водораздела Экути (Ekuti Divide) южнее города Вау до горы Натсфорд и Порт-Морсби[14][11]. Возможно, ареал простирается ещё южнее[14], юго-восточные границы ареала неизвестны[11]. Международный союз охраны природы (МСОП) приводит площадь ареала (англ. Estimated extent of occurrence) этого подвида 10 800 км²[15].
Подвид C. m. sanguineus был описан австралийским орнитологом Томом Айрдейлом в 1948 году как самостоятельный вид на основе экземпляров, добытых капитаном Нептьюном Бладом (Neptune B. Blood) в 1944—1945 годах в окрестностях города Маунт-Хаген в провинции Уэстерн-Хайлендс в центральной части Папуа — Новой Гвинеи. Птицы этого подвида распространены на нагорье Кайенде, горе Гилуве, вулкане Хаген и далее на восток до гор Бисмарка и хребта Кубор[себ.] в восточной части острова. К этому же подвиду относят популяцию в центральной части острова, обитающую на высокогорьях к северу от озера Хаббема (Lake Habbema)[14]. МСОП приводит площадь ареала этого подвида 87 600 км²[16]. У самцов C. m. sanguineus длина крыла составляет 110—118 мм, у самок — 101—115 мм, длина хвоста — 86-96 мм и 80—97 мм, клюва — 26—31 мм и 23—28 мм, цевки — 38—44 мм и 38—43 мм, соответственно[14].
Синонимичным ему является подвид C. m. kuboriensis, который был описан американскими орнитологами Эрнстом Майром и Эрнестом Гиллиардом[англ.] в 1954 году на основе экземпляра самца, пойманного на хребте Кубор на высоте 2760 метров в мае 1952 года. Причиной выделения в отдельный подвид был назван более насыщенный красноватый верх и менее красный налёт снизу, а также более короткий хвост и более длинные крылья[14]. Экземпляр птицы, полученный британским орнитологом Реджиналдом Симсом (Reginald William Sims) в тех же горах в 1953 году, не отличался раскраской оперения от C. m. sanguineus[17]. Современные учёные синонимизируют C. m. kuboriensis и C. m. sanguineus в силу изменчивости и незначительности указанных признаков[14].
Основное отличие подвидов заключается в окраске самцов в верхней части тела, оттенки окраски остального оперения менее показательны. Чёткое разделение подвидов затруднено из-за промежуточного положения птиц, обитающих на хребте Кратке[англ.] в восточной части острова[14]. Не совсем ясно, к какому подвиду отнести популяцию на западе ареала (то есть на границе двух стран). Американские учёные Брюс Билер[англ.] и Тейн Пратт[англ.] в 2016 году предлагали выделить её в отдельный таксон, для которого, однако, не смогли определить географические границы[14]. `
if err != nil {
t.Fatal(err, bot)
}
_, err = bot.SendDocumentFromBytes(
conf.GroupID,
text,
"1.txt",
caption,
)
if err != nil {
t.Fatal(err)
}
}