HTTP через Email: простой скрипт для сервера Linux
Полное руководство по реализации HTTP через Email на Linux. Узнайте, как создать скрипт для чтения почты, скачивания файлов и отправки ZIP-архивов каждые 5 секунд.
Какие существуют простые скрипты для реализации ‘HTTP over Email’ для установки на сервере?
Нужен скрипт, который:
- Запускается каждые 5 секунд через cron на Linux VPS
- Читает электронный почтовый ящик
- Обрабатывает письма с темой “url”
- Извлекает URL-адреса из текста писем
- Скачивает указанные URL-адреса
- Упаковывает скачанные файлы в архив ZIP
- Отправляет ZIP-архив обратно через почтовый ящик
Какие инструменты или софт вы использовали для решения подобных задач?
Я нашел один вариант: https://github.com/meiamsome/HTTPoE, но интересуюсь, есть ли более эффективные альтернативы.
Вы можете реализовать “HTTP over Email” с использованием комбинации стандартных инструментов Linux для обработки почты и загрузки файлов. Наиболее эффективный подход включает использование mutt для работы с почтой, curl/wget для загрузки файлов и встроенных утилит для создания архивов.
Содержание
- Необходимые инструменты для реализации
- Базовая структура скрипта
- Пример реализации на Bash
- Альтернативные подходы
- Настройка cron для запуска
- Обработка ошибок и логирование
- Сравнение с HTTPoE
- Рекомендации по безопасности
Необходимые инструменты для реализации
Для создания полноценного решения “HTTP over Email” вам потребуются следующие инструменты:
- mutt - мощный почтовый клиент для командной строки
- curl или wget - для загрузки файлов по URL
- zip - для создания архивов
- cron - для автоматического запуска скрипта
- procmail или getmail - для фильтрации входящих писем
Эти инструменты доступны в большинстве стандартных репозиториев Linux и не требуют сложной настройки.
Unix Stack Exchange предоставляет примеры использования munpack для извлечения вложений из писем прямо из командной строки.
Базовая структура скрипта
Основная логика скрипта должна включать следующие этапы:
- Проверка входящих писем с фильтрацией по теме “url”
- Извлечение URL из текста писем
- Загрузка файлов по указанным URL
- Создание архива из загруженных файлов
- Отправка ответа с вложенным ZIP-архивом
#!/bin/bash
# Настройки
EMAIL_USER="your-email"
EMAIL_PASS="your-password"
ATTACH_DIR="/tmp/httpoe_downloads"
ZIP_FILE="/tmp/response.zip"
LOG_FILE="/var/log/httpoe.log"
# Создание директорий
mkdir -p "$ATTACH_DIR"
Пример реализации на Bash
Вот полный пример скрипта, реализующего все требуемые функции:
#!/bin/bash
# Конфигурация
EMAIL_USER="your-email@example.com"
EMAIL_PASS="your-password"
MAIL_DIR="$HOME/Mail/INBOX"
ATTACH_DIR="/tmp/httpoe_downloads"
ZIP_FILE="/tmp/response_$(date +%Y%m%d_%H%M%S).zip"
LOG_FILE="/var/log/httpoe.log"
MAX_FILES=50 # Максимальное количество файлов в архиве
# Инициализация
mkdir -p "$ATTACH_DIR"
touch "$LOG_FILE"
# Функция логирования
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# Очистка старых файлов
cleanup() {
find "$ATTACH_DIR" -type f -mtime +1 -delete
find /tmp -name "response_*.zip" -mtime +1 -delete
}
# Основная логика
process_emails() {
# Используем mutt для чтения писем с темой "url"
mutt -f "$MAIL_DIR" -F /dev/null <<EOF
s~^Subject: url~~
t~.~
y
q
EOF
# Обработка каждого письма
for email_file in "$MAIL_DIR"/new/*; do
if [ -f "$email_file" ]; then
# Извлечение URL из письма
urls=$(grep -Eo 'https?://[^[:space:]]*' "$email_file")
if [ -n "$urls" ]; then
log "Найдены URL для обработки: $urls"
# Загрузка файлов
file_count=0
for url in $urls; do
if [ $file_count -ge $MAX_FILES ]; then
log "Достигнут лимит файлов ($MAX_FILES)"
break
fi
filename=$(basename "$url")
filepath="$ATTACH_DIR/$filename"
# Загрузка с помощью curl
curl -s -L -o "$filepath" "$url"
if [ $? -eq 0 ]; then
log "Успешно загружен: $url"
((file_count++))
else
log "Ошибка загрузки: $url"
fi
done
# Создание архива
if [ $file_count -gt 0 ]; then
cd "$ATTACH_DIR"
zip -r "$ZIP_FILE" ./*
# Отправка ответа
echo "Загружено файлов: $file_count" | mutt -s "HTTP over Email Response" -a "$ZIP_FILE" -- "$EMAIL_USER"
log "Отправлен архив с $file_count файлами"
# Очистка
rm -f "$ZIP_FILE"
rm -rf "$ATTACH_DIR"/*
fi
fi
# Удаление обработанного письма
mv "$email_file" "$MAIL_DIR/cur/"
fi
done
}
# Основной цикл
while true; do
cleanup
process_emails
sleep 5
done
Альтернативные подходы
1. Использование fetchmail + procmail
# Конфигурация procmail
:0
* ^Subject: url
{
:0 c
| /path/to/your/httpoe_script.sh
}
2. Решение с использованием Python
Для более сложных задач можно использовать Python с библиотеками:
import imaplib
import email
import urllib.request
import zipfile
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
import os
3. Комбинация с getmail
Как указано на Ask Ubuntu, getmail может использоваться для более надежной обработки почты.
Настройка cron для запуска
Для запуска скрипта каждые 5 секунд добавьте в crontab:
# Открыть crontab
crontab -e
# Добавить строку:
*/5 * * * * /usr/bin/flock -n /tmp/httpoe.lock /path/to/your/script.sh
Использование flock предотвращает множественный запуск скрипта одновременно.
Обработка ошибок и логирование
Включите в скрипт следующие элементы для надежности:
# Проверка зависимостей
check_dependencies() {
local deps=("mutt" "curl" "zip")
for dep in "${deps[@]}"; do
if ! command -v "$dep" &> /dev/null; then
log "Ошибка: $dep не установлен"
exit 1
fi
done
}
# Ограничение ресурсов
limit_resources() {
ulimit -t 30 # Ограничение времени выполнения в секундах
ulimit -v 100000 # Ограничение памяти в КБ
}
Сравнение с HTTPoE
Решение HTTPoE представляет собой специализированный инструмент с некоторыми преимуществами:
Преимущества HTTPoE:
- Специально разработан для “HTTP over Email”
- Включает дополнительные функции безопасности
- Имеет более простую настройку
- Поддерживает сложные сценарии
Преимущества кастомного решения:
- Гибкость настройки под конкретные задачи
- Лучшая интеграция с существующей инфраструктурой
- Прозрачность работы и возможность модификации
- Отсутствие зависимостей от внешних проектов
Как отмечено на Reddit, многие пользователи предпочитают кастомные решения для специфических задач автоматизации.
Рекомендации по безопасности
- Используйте пароли через переменные среды или файлы с ограниченным доступом
- Ограничьте размер загружаемых файлов
- Валидируйте URL перед загрузкой
- Используйте SSL/TLS для почтовых операций
- Регулярно обновляйте все компоненты системы
# Пример безопасной конфигурации
EMAIL_USER="${EMAIL_USER:-}"
EMAIL_PASS="${EMAIL_PASS:-}"
if [ -z "$EMAIL_USER" ] || [ -z "$EMAIL_PASS" ]; then
log "Ошибка: не заданы учетные данные email"
exit 1
fi
Conclusion
Ключевые выводы по реализации “HTTP over Email”:
- Используйте стандартные инструменты Linux - mutt, curl, zip, cron для создания надежного решения
- Реализуйте правильную обработку ошибок и логирование для отладки
- Применяйте меры безопасности при работе с паролями и загрузкой файлов
- Тестируйте решение в изолированной среде перед развертыванием
- Рассмотрите HTTPoE для более сложных сценариев, где нужна специализированная функциональность
Кастомное решение на Bash provides excellent flexibility and control over the HTTP over Email process while being easy to maintain and extend. The key is proper error handling, resource management, and security considerations.
Источники
- Unix Stack Exchange - Downloading an attachment from Inbox using the command-line
- Reddit - Bash script to download particular email attachment
- Ask Ubuntu - How can I download attachments from emails through terminal using getmail
- Level1Techs Forum - Accessing email from command line + download attachment
- LinuxConfig - Download file from URL on Linux using command line