Вложение электронной почты, созданное в bash-скрипте с помощью uuencode и ssmtp, доставляется с поврежденным именем файла и нулевой длиной.

Вопрос или проблема

Этот очень старый поток показывает, как использовать uuencode и ssmtp для отправки письма с вложением из bash-скрипта.

Я создал этот тестовый скрипт для отладки:

#!/bin/bash
set -x

NOW=$( date '+%F' )     #( date '+%F_%H-%M-%S' )
LOGPATH=/home/pi/logs
LOGFILE=test-log-$NOW.txt

FULL_LOG=$LOGPATH"https://unix.stackexchange.com/"$LOGFILE

echo "This is a test of the log email send $LOGPATH $LOGFILE   $FULL_LOG " > $FULL_LOG

echo -e "To: [email protected]\nSubject: test log send\n\n" | (cat - && /usr/bin/uuencode $FULL_LOG) | /usr/sbin/ssmtp -t

Вывод выглядит так:

+ echo 'This is a test of the log email send /home/pi/logs test-log-2025-02-22.txt   /home/pi/logs/test-log-2025-02-22.txt '
+ echo -e 'To: [email protected]\nSubject: test log send\n\n'
+ cat -
+ /usr/sbin/ssmtp -t
+ /usr/bin/uuencode /home/pi/logs/test-log-2025-02-22.txt

Ошибок не возникает, и письмо доставляется с темой на правильный адрес.
Проблема в том, что вложение отправляется как файл с именем
homepilogstest-log-2025-02-222.txt

Вложение представляет собой файл нулевой длины. Файл правильно создан на Pi и содержит ожидаемое содержание:

 $ ls -l logs/test-log-2025-02-22.txt
-rw-r--r-- 1 pi pi 116 Feb 22 12:19 logs/test-log-2025-02-22.txt

$ cat logs/test-log-2025-02-22.txt
    This is a test of the log email send /home/pi/logs test-log-2025-02-22.txt   /home/pi/logs/test-log-2025-02-22.txt

Что я упускаю?

С одним параметром для uuencode вы указываете имя выходного файла.

Так что эта часть

(cat - && /usr/bin/uuencode $FULL_LOG)

не сделает то, что вы ожидаете, и приведет к файлу нулевой длины.

Вы должны указать как входной файл, так и имя выходного файла, если не хотите использовать программу как фильтр.

Впрочем, вам, вероятно, не следует указывать полный путь к выходному файлу, поэтому часть с uuencode может быть лучше так:

uuencode $FULL_LOG $LOGFILE

Рекомендую использовать программу s-nail. У нее есть переключатель -a, специально для отправки файлов.

$ apt-cache show s-nail
Package: s-nail
Architecture: amd64
Version: 14.9.24-2build2
Multi-Arch: foreign
Priority: optional
Maintainer: Paride Legovini <[email protected]>
Provides: imap-client, mail-reader
Depends: base-files (>= 2.2.0), debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.38), libgssapi-krb5-2 (>= 1.17), libidn2-0 (>= 2.0.0), libssl3t64 (>= 3.0.0), libtinfo6 (>= 6)
Suggests: default-mta | mail-transport-agent
Replaces: nail
[...]
Homepage: https://www.sdaoden.eu/code.html
Description-en: feature-rich BSD mail(1)
 S-nail is a mail processing system with a command syntax reminiscent
 of ed(1) with lines replaced by messages. It is intended to provide
 the functionality of the POSIX mailx(1) command and offers (mostly
 optional) extensions for line editing, IDNA, MIME, S/MIME, SMTP and
 POP3 (and IMAP). It is usable as a mail batch language. S-nail is a
 derivative of Heirloom mailx, formerly known as nail, which
 itself is based upon Berkeley Mail that has a history back to the 70s.

И LESS='+/^ +-a file' man s-nail

   -a file[=input-charset[#output-charset]], --attach=..
             (Send  mode) Attach file.  For (Compose mode) opportunities refer to ~@ and ~^.  file is subject to tilde expansion
             (see “Filename transformations” and folder); if it is not accessible but contains a ‘=’ character, anything  before
             the last ‘=’ will be used as the filename, anything thereafter as a character set specification, as shown.

             If  only  an input character set is specified, the input side is fixed, and no character set conversion will be ap‐
             plied; an empty or the special string hyphen-minus ‘-’ is taken for ttycharset (the default).  If an output charac‐
             ter set has also been specified the desired conversion is performed immediately, not considering file type and con‐
             tent, except for an empty string or hyphen-minus ‘-’, which select the default conversion algorithm (see “Character
             sets”): no immediate conversion is performed, file and its contents will be MIME-classified (“HTML  mail  and  MIME
             attachments, The mime.types files”) first — only the latter mode is available unless features includes ‘,+iconv,’.

Пример:

s-nail -a file.pdf -s 'title of email' [email protected] < /dev/null

И последнее, но не менее важное, ssmtp больше не поддерживается.

Лучше использовать msmtp вместо него.

.

Ответ или решение

Для решения вашей проблемы с отправкой электронной почты через сценарий bash с использованием uuencode и ssmtp, необходимо, во-первых, понять причину возникновения ошибок, связанных с формированием имени файла и его нулевой длиной. Разбор предоставленного скрипта и рекомендация по альтернативным инструментам помогут исправить текущие ошибки.

Теория

Когда используется uuencode, чтобы прикрепить файл к email-сообщению, важно правильно указать параметры команды. uuencode используется для преобразования бинарных файлов в текстовый формат, подходящий для пересылки через протоколы передачи сообщений, которые поддерживают только текст. В вашем случае, при использовании только одного параметра для uuencode, вы задаёте лишь имя выходного файла, а не исходного, что приводит к ошибке.

Пример

Давайте рассмотрим строчку кода:

(cat - && /usr/bin/uuencode $FULL_LOG) | /usr/sbin/ssmtp -t

здесь происходит проблема, так как uuencode требуется два параметра: имя файла, который кодируется, и предполагаемое имя файла в email. Ваша версия использует только первый параметр, из-за чего производит ненулевую кодировку файла и отправляет пустой файл с некорректным именем. Этот код не совпадает с тем, что вы ожидаете, так как фактически, вы задаёте полное имя выходного файла вместо имени входного файла.

Применение

Рекомендую изменить строчку с uuencode следующим образом:

uuencode $FULL_LOG $LOGFILE

Это изменение гарантирует, что uuencode знает точное имя как для вводимого, так и для выходного файла.

Альтернативные инструменты

Кроме того, применение sSMTP может не быть оптимальным, так как проект sSMTP больше не поддерживается, что может создавать потенциальные угрозы безопасности. Вместо sSMTP стоит использовать более поддерживаемые и безопасные инструменты, такие как s-nail или msmtp.

Преимущества s-nail

s-nail это более функционально насыщенное решение для отправки email и имеет несколько ключевых преимуществ. Вы можете использовать флаг -a для добавления вложений, что делает процесс более простым и надежным, избегая необходимости использования uuencode:

s-nail -a $FULL_LOG -s "test log send" recipient@example.com < /dev/null

Преимущества msmtp

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

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

Резюмируя, чтобы устранить имеющиеся проблемы, следуйте предложенным решениям для uuencode, а также рассмотрите возможность перехода на s-nail или msmtp для более надежной и безопасной обработки отправки email-сообщений в вашем сценарии bash. Это обеспечит долгосрочную устойчивость вашей почтовой системы и предотвратит возможные сбои в будущем.

Оцените материал
Добавить комментарий

Капча загружается...