Другое

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 для загрузки файлов и встроенных утилит для создания архивов.

Содержание

Необходимые инструменты для реализации

Для создания полноценного решения “HTTP over Email” вам потребуются следующие инструменты:

  • mutt - мощный почтовый клиент для командной строки
  • curl или wget - для загрузки файлов по URL
  • zip - для создания архивов
  • cron - для автоматического запуска скрипта
  • procmail или getmail - для фильтрации входящих писем

Эти инструменты доступны в большинстве стандартных репозиториев Linux и не требуют сложной настройки.

Unix Stack Exchange предоставляет примеры использования munpack для извлечения вложений из писем прямо из командной строки.


Базовая структура скрипта

Основная логика скрипта должна включать следующие этапы:

  1. Проверка входящих писем с фильтрацией по теме “url”
  2. Извлечение URL из текста писем
  3. Загрузка файлов по указанным URL
  4. Создание архива из загруженных файлов
  5. Отправка ответа с вложенным ZIP-архивом
bash
#!/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

Вот полный пример скрипта, реализующего все требуемые функции:

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

bash
# Конфигурация procmail
:0
* ^Subject: url
{
    :0 c
    | /path/to/your/httpoe_script.sh
}

2. Решение с использованием Python

Для более сложных задач можно использовать 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:

bash
# Открыть crontab
crontab -e

# Добавить строку:
*/5 * * * * /usr/bin/flock -n /tmp/httpoe.lock /path/to/your/script.sh

Использование flock предотвращает множественный запуск скрипта одновременно.


Обработка ошибок и логирование

Включите в скрипт следующие элементы для надежности:

bash
# Проверка зависимостей
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, многие пользователи предпочитают кастомные решения для специфических задач автоматизации.


Рекомендации по безопасности

  1. Используйте пароли через переменные среды или файлы с ограниченным доступом
  2. Ограничьте размер загружаемых файлов
  3. Валидируйте URL перед загрузкой
  4. Используйте SSL/TLS для почтовых операций
  5. Регулярно обновляйте все компоненты системы
bash
# Пример безопасной конфигурации
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”:

  1. Используйте стандартные инструменты Linux - mutt, curl, zip, cron для создания надежного решения
  2. Реализуйте правильную обработку ошибок и логирование для отладки
  3. Применяйте меры безопасности при работе с паролями и загрузкой файлов
  4. Тестируйте решение в изолированной среде перед развертыванием
  5. Рассмотрите 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.

Источники

  1. Unix Stack Exchange - Downloading an attachment from Inbox using the command-line
  2. Reddit - Bash script to download particular email attachment
  3. Ask Ubuntu - How can I download attachments from emails through terminal using getmail
  4. Level1Techs Forum - Accessing email from command line + download attachment
  5. LinuxConfig - Download file from URL on Linux using command line
Авторы
Проверено модерацией
Модерация