Вопрос или проблема
Этот очень старый поток показывает, как использовать 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. Это обеспечит долгосрочную устойчивость вашей почтовой системы и предотвратит возможные сбои в будущем.