Мкак с почты отправить в Телеграмм

Порадуем вас в середине недели важными обновлениями 🙂 На повестке дня новые фишки в почте, которые трудно оставить без внимания:

Отправка писем в Telegram

Добавили классный фильтр, который позволяет пересылать письма в Telegram. Для многих это любимый мессенджер, который всегда под рукой. А значит, письма от важных адресатов теперь будут на полном контроле.

Достаточно включить фильтр, привязать Telegram-аккаунт к почте, используя QR-код или ссылку. Как это сделать — показали в гифке.

Информация об удалении писем

Письма, которые попадают в спам или корзину, автоматически удаляются через 30 дней. Без шанса на восстановление. Лишний раз напомнили об этом в панели — добавили информационное сообщение.

Общие контакты

Теперь почтовые ящики, созданные в домене вашей компании, как на ладони. Они отображаются в подразделе «Общие контакты», их можно фильтровать по алфавиту, времени добавления или изменения.

А еще картинки в письмах на стороне почтовых программ получателя теперь отображаются корректно 😉

Как получать и отправлять письма Гугл почты в телеграм|Телеграм — бот для Гугл почты

Источник: timeweb.cloud

Шлюз SMTP в Telegram

С одной стороны, исторически сложилось, что многие сервисы в Unix/Linux уведомляют администратора о проблемах через электронную почту.

В качестве примеров можно привести cron, smartd и mdadm.

В самописных фоновых или долго выполняющихся сценариях неудачное завершение также не помешает сопровождать отправкой уведомлений, например:

Разумеется, имея больше одного сервера, такую почту удобнее просматривать не локально, а централизованно.

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

И наконец, электронная почта стремительно вытесняется системами мгновенной доставки сообщений: имеющими высокую скорость, простые протоколы взаимодействия и почти повсеместную распространённость.

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

Параметры Telegram:

В Телеграме нам потребуется зарегистрировать бота для отправки и получить token, а также узнать числовой идентификатор получателя (Chat ID).

Здесь проще сослаться на существующую документацию, чем пытаться сочинять свою:

  • создание бота и получение токена: https://tlgrm.ru/docs/bots#botfather;
  • определение Chat ID: найдите в Телеграме бота JsonDump и напишите ему что-нибудь.

Разумеется, шлюз надо размещать на сервере, у которого гарантированно не возникнет проблем с доступом к https://api.telegram.org из-за национальных систем фильтрации трафика.

Настройка шлюза:

Гугл находит две готовых реализации:

  • https://github.com/KostyaEsmukov/smtp_to_telegram
  • https://github.com/ircop/smtp2tg

Обе написаны на Golang. Первую из них мы проверили в работе и остались довольны.

Однако было решено написать вместо неё собственную утилиту, чтобы (а) уменьшить занимаемое на диске место в 10000 раз (с 10,7 мегабайт до 1140 байт) и (б) получить потенциальную гибкость для расширения (например, добавить в дальнейшем поддержку нескольких recipient_email_address=>TgChatId).

Еще по теме:  Element messenger добавить Телеграмм чат

Забегая вперёд, имеет смысл отметить, что при выполнении smtp_to_telegram занимает в ОЗУ вдвое меньше места, чем наша утилита на Python (13 мегабайт против 26), хотя отчасти это компенсируется наличием других запущенных Python-утилит (в т.ч. tuned, networkd-dispatcher и т.д.), потому что ОЗУ под значительную часть среды выполнения выделяется системой однократно, независимо от числа использующих её процессов.

Пишем собственный вариант:

Этот файл следует сохранить как /usr/local/bin/smtp2tg и сделать исполняемым:

#!/usr/bin/python import os import io import asyncore import requests # yum install python-requests import smtpd from datetime import datetime # Optional: listen_addr = os.environ[‘SMTP2TG_LISTEN_ADDR’] if ‘SMTP2TG_LISTEN_ADDR’ in os.environ else ‘localhost’ listen_port = os.environ[‘SMTP2TG_LISTEN_PORT’] if ‘SMTP2TG_LISTEN_PORT’ in os.environ else 2525 # Required: bot_token = os.environ[‘SMTP2TG_BOT_TOKEN’] chat_id = os.environ[‘SMTP2TG_CHAT_ID’] class smtp2tg(smtpd.SMTPServer): def process_message(self, peer, mailfrom, rcpttos, data, mail_options=None, rcpt_options=None): nowstr = datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’) markdown = ‘**%s:**nn%s’ % (mailfrom, data.decode(«utf-8»)) msgfmt = ‘https://api.telegram.org/bot%s/sendMessage?chat_id=%stext=%s’ response = requests.get(msgfmt % (bot_token, chat_id, markdown)) print(«%s — from=%s to=%s response=%sn» % (nowstr, mailfrom, rcpttos, response.json())) server = smtp2tg((listen_addr, int(listen_port)), None) print(«Started on %s:%s. » % (listen_addr, listen_port)) try: asyncore.loop() except KeyboardInterrupt: pass

Чтобы уменьшить и упростить исходный текст, а также повысить безопасность, необходимые для работы параметры передаются не через командную строку, а через переменные окружения SMTP2TG_xx.

Сценарий проверен на совместимость с Python 2.7 и 3.6. Из дополнительных пакетов требуется только python-requests (или python3-requests), который называется одинаково и Debian/Ubuntu, и в CentOS.

При написании пришлось столкнуться со следующими проблемами:

    В отличие от большинства сетевых сервисов, модуль smtpd не позволяет заканчивать строки в запросах сокращённой односимвольной последовательностью «n» и понимает только полную двухсимвольную «rn». Поэтому для тестирования надо запускать netcat с ключом «-C», а socat с флагом «crlf», и только telnet заработает правильно без дополнительных настроек (но потребует явную задержку, потому что без неё закроет сетевое соединение сразу, как только получит EOF из stdin, и не успеет из-за этого принять из сети ответ):

echo -e «HELO testnQUIT» | netcat -C 127.0.0.1 2525 echo -e «HELO testnQUIT» | socat — TCP:127.0.0.1:2525,crlf < echo -e «HELO testnQUIT»; sleep 1; >| telnet 127.0.0.1 2525

Автоматический запуск:

Сервис для systemd будет выглядеть так:

[Unit] Description=SMTP to Telegram Gateway Documentation=https://cdnnow.ru/blog/smtp2tg After=nss-lookup.target After=network.target [Service] User=smtp2tg Environment=’SMTP2TG_LISTEN_ADDR=0.0.0.0′ Environment=’SMTP2TG_BOT_TOKEN=885500333:AAaabbcc_ddeeffgghhSSWW88hhnnzzkkQQ’ Environment=’SMTP2TG_CHAT_ID=77113355′ ExecStart=/usr/local/bin/smtp2tg [Install] WantedBy=multi-user.target

Сохраните его в файл /etc/systemd/system/smtp2tg.service, активируйте и запустите, предварительно создав псевдопользователя:

  • useradd -d /nonexistent -s /bin/false -r smtp2tg
  • systemctl daemon-reload
  • systemctl enable smtp2tg
  • systemctl start smtp2tg
  • systemctl status smtp2tg

Настройка отправителей почты:

Нам нужен любой консольный клиент (т.е. предоставляющий команду mail) и любой агент доставки почты, умеющий использовать relay:

apt-cache search mailx apt-cache search mail-transport-agent

В Debian/Ubuntu мы предпочитаем для этого следующую связку:

apt install dma bsd-mailx

Для CentOS в стандартных репозиториях нет готового пакета dma, но он собран в repo.cdnnow.pro:

yum install https://repo.cdnnow.pro/pub/linux/centos/7/x86_64/cdnnow-release-1-1.cdnnow.el7.noarch.rpm yum install dma mailx

Еще по теме:  Имя пользователя для Телеграмма для бизнеса пример

В /etc/dma/dma.conf обязаны присутствовать следующие строки:

SMARTHOST 10.20.30.40 PORT 2525

IP-адрес должен указывать на сервер, на котором запущен smtp2tg. В данном случае рекомендуется использовать именно IP-адрес, т.к. это позволит сохранить работоспособность при проблемах с DNS.

Email получателя может быть любым — шлюз в любом случае отправит сообщение пользователю Telegram, указанному в SMTP2TG_CHAT_ID.

Подпишитесь на новые статьи:

Спасибо за Вашу заявку! В скором времени наш менеджер свяжется с Вами.

Источник: cdnnow.ru

Перенаправляем почту в Telegram

В виду того, что спам всё ещё не вышел из моды, а всякая малварь не перестаёт захватывать сайты с целью использования сервера в качестве “говномёта”, в некоторых датацентрах и в сети интернет провайдеров домашнего интернета встречается ограничение исходящих соединений на 25 порт. Конечно, можно использовать какой-нибудь внешний smtp по шифрованному 465, но в моём случае в этом было мало проку. Мне нужны были только отчёты и уведомления со всех виртуалок на сервере и гарантия их доставки. Немного подумав, я решил, что интереснее всего было бы получать из в мой любимый на сегодняшний день, мессенджер Telegram.
Погуглив по сабжу, я практически сразу наткнулся про проект smtp2tg.

smpt2tg написан на языке Go, так что для начала нужно установить его. Первым делом, я попытался сделать это через пакетный менеджер и таким образом убил лишние полчаса. Поняв, что так ничего не будет работать, я грохнул всё ранее установленное и пошёл наипростейшим путём.

wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz tar -C /usr/local -xzf go1.15.6.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin echo «export PATH=$PATH:/usr/local/go/bin» >> ~/.bashrc

Теперь, убедимся, что мы засунули язык в нужное место. 🙂

Добавляем к этому делу пакеты-зависимости.

go get github.com/veqryn/go-email/email go get github.com/spf13/viper go get gopkg.in/telegram-bot-api.v4 go get github.com/ircop/smtp2tg

Необходимо создать конфиг для программы

Можно расположить его в /etc/smtp2tg.toml

[bot] token = «ключ телеграм бота» [receivers] «*» = «id чата/канала/группы для wildcard» «[email protected]» = «id чата/канала/группы для конкретного адреса» [smtp] listen = «0.0.0.0:25» name = «ex.uz» [logging] file = «/var/log/smtp2tg.log» debug = false

Теперь можно запустить прогу

/root/go/bin/smtp2tg -c /etc/smtp2tg.toml os» «strconv» «strings» «flag» «bytes» «log» «net» «gopkg.in/telegram-bot-api.v4» «github.com/spf13/viper» «github.com/veqryn/go-email/email» «github.com/ircop/smtp2tg/smtpd» ) var receivers map[string]string var bot *tgbotapi.BotAPI var debug bool func main() < configFilePath := flag.String(«c», «./smtp2tg.toml», «Config file location») //pidFilePath := flag.String(«p», «/var/run/smtp2tg.pid», «Pid file location») flag.Parse() // Load log.Fatal(err.Error()) >// Logging logfile := viper.GetString(«logging.file») if( logfile == «» ) < log.Println(«No logging.file defined in config, outputting to stdout») >else < lf, err := os.OpenFile(logfile, os.O_APPEND | os.O_CREATE | os.O_RDWR, 0666) if( err != nil ) < log.Fatal(err.Error()) >log.SetOutput(lf) > // Debug? debug = viper.GetBool(«logging.debug») receivers = viper.GetStringMapString(«receivers») if( receivers[«*»] == «» ) < log.Fatal(«No wildcard receiver (*) found in config.») >var token string = viper.GetString(«bot.token») if( token == «» ) < log.Fatal(«No bot.token defined in config») >var listen string = viper.GetString(«smtp.listen») var name string = viper.GetString(«smtp.name») if( listen == «» ) < log.Fatal(«No smtp.listen defined in config.») >if( name == «» ) < log.Fatal(«No smtp.name defined in config.») >// Initialize TG bot bot, err = tgbotapi.NewBotAPI( token ) if( err != nil ) < log.Fatal(err.Error()) >log.Printf(«Bot authorized as %s», bot.Self.UserName ) log.Printf(«Initializing smtp server on %s. «, listen) // Initialize SMTP server err_ := smtpd.ListenAndServe(listen, mailHandler, «mail2tg», «», debug) if( err_ != nil ) < log.Fatal(err_.Error()) >> func mailHandler(origin net.Addr, from string, to []string, data []byte) < from = strings.Trim(from, » «) to[0] = strings.Trim(to[0], » «) to[0] = strings.Trim(to[0], «<«) to[0] = strings.Trim(to[0], «>») msg, err := email.ParseMessage(bytes.NewReader(data)) if( err != nil ) < log.Printf(«[MAIL ERROR]: %s», err.Error()) return >subject := msg.Header.Get(«Subject») myBytes := msg.Body log.Printf(«Received mail from ‘%s’ for ‘%s’ with subject ‘%s'», from, to[0], subject) // Find receivers and send to TG var tgid string if( receivers[to[0]] != «» ) < tgid = receivers[to[0]] >else < tgid = receivers[«*»] >textMsgs := msg.MessagesContentTypePrefix(«text») images := msg.MessagesContentTypePrefix(«image») if len(textMsgs) == 0 len(images) == 0 < if len(myBytes) == 0 < log.Printf(«mail doesn’t contain text or image») return >> log.Printf(«Relaying message to: %v», tgid) i, err := strconv.ParseInt(tgid, 10, 64) if( err != nil ) < log.Printf(«[ERROR]: wrong telegram id: not int64″) return >if len(textMsgs) > 0 < bodyStr := » from: «+from + » «+ subject + » rnrn» + string(textMsgs[0].Body) tgMsg := tgbotapi.NewMessage(i, bodyStr) tgMsg.ParseMode = tgbotapi.ModeMarkdown _, err = bot.Send(tgMsg) if err != nil < log.Printf(«[ERROR]: telegram message send: ‘%s'», err.Error()) return >> else if len(myBytes) > 0 < bodyStr := » from: «+from + » «+ subject + » rnrn» +string(myBytes) tgMsg := tgbotapi.NewMessage(i, bodyStr) tgMsg.ParseMode = tgbotapi.ModeMarkdown _, err = bot.Send(tgMsg) if err != nil < log.Printf(«[ERROR]: telegram message send: ‘%s'», err.Error()) return >> // TODO Better to use ‘sendMediaGroup’ to send all attachments as a // single message, but go telegram api has not implemented it yet // https://github.com/go-telegram-bot-api/telegram-bot-api/issues/143 for _, part := range msg.MessagesContentTypePrefix(«image») < _, params, err := part.Header.ContentDisposition() if err != nil < log.Printf(«[ERROR]: content disposition parse: ‘%s'», err.Error()) return >text := params[«filename»] tgFile := tgbotapi.FileBytes tgMsg := tgbotapi.NewPhotoUpload(i, tgFile) tgMsg.Caption = text // It’s not a separate message, so disable notification tgMsg.DisableNotification = true _, err = bot.Send(tgMsg) if err != nil < log.Printf(«[ERROR]: telegram photo send: ‘%s'», err.Error()) return >> >

Еще по теме:  Восстановить фото из кэша Телеграмма

Понятия не имею, почему изначально разработчик решил, что всё это не нужно, но в оригинальном коде предусмотрена доставка только тела письма.

Собирается этот код следующим образом:

mkdir ~/smtp2tg/ vi ~/smtp2tg/main.go

Вставляем вышеупомянутый код в main.go и запускаем “go build”

Запускаем, проверяем, получаем примерно такой результат:

Осталось только пихнуть в автозагрузку. (например в rc.local ?)

Наверное я допишу статью, когда найду нормальный способ демонизировать этот процесс под centos 7. А пока, отдаю на ваш суд, как говорится “as is”.

Источник: ex.uz

Рейтинг
( Пока оценок нет )
Загрузка ...