Вопрос или проблема
#!/bin/bash
ATTACH1=file.xls
SUBJECT=”subj”
[электронная почта защищена]
[электронная почта защищена]
[электронная почта защищена]
MIME=”Application/vnd.ms-excel”
FILE=$ATTACH1
boundary=”—my-unlikely-text-for-mime-boundary—$$–”
(cat <Привет,
Вышеуказанный код может отправлять файл xls с помощью оболочки. Но проблема в том, что полученный файл нельзя открыть. Кроме того, размер файла xls становится меньше. Например: оригинальный размер вложения xls составляет 17 КБ до отправки, а полученный файл составляет 378 байт после отправки..
Что я могу сделать, чтобы полученный xls стал читаемым при открытии получателем? Что не так или чего не хватает в приведенном выше скрипте? Пожалуйста, помогите!!!!
Кстати.. Я НЕ МОГУ ИСПОЛЬЗОВАТЬ MUTT
Вам нужно указать Content-Transfer-Encoding для части MIME с вложением. Я не знаю, является ли uuencode стандартным. Base64 – да.
Вам также нужно отправить закрывающий маркер границы.
Ваша перенаправление в cat неверно.
(cat << !
From: $FROM
To: $TO
Subject: $SUBJECT
Date: $(date +"%a, %b %e %Y %T %z")
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="$boundary"
Это электронное письмо содержит вложенный файл
--$boundary
Content-Type: text/plain; charset=ISO-8859-1
Пожалуйста, посмотрите вложенный файл.
--$boundary
Content-Transfer-Encoding: base64
Content-Type: $MIME;name="$ATTACH1"
Content-Disposition: attachment;filename="$ATTACH1"
$(base64 "$ATTACH1")
--$boundary--
!
) | sendmail -v "$TO"
Вместо того чтобы создавать свою программу для отправки почты, просто используйте одну из множества, которые уже существуют. То, что вам нужно, это агент пользовательской почты (MUA). Существует множество вариантов для отправки почты из командной строки. Например, используя Mutt:
mutt [электронная почта защищена] -s "Мой пример темы" -a attachment.xlsx < mailbody.txt
Это отправит письмо на [электронная почта защищена], прочитав текст письма из файла "mailbody.txt" и с вложением attachment.xlsx. Mutt выполнит всю рутинную работу за вас, например, правильно закодируя текст письма и выбирая нужный MIME-тип для вложения.
Конечно, вы можете написать это все сами, но вам, возможно, придется вложить в это несколько месяцев...
Ответ или решение
Для того чтобы отправить электронное письмо с вложением в формате XLS без потери читаемости и с правильной рассылкой MIME-типов, необходимо учесть несколько важных моментов. Рассмотрим пошагово, как исправить приведенный вами скрипт, чтобы вложенный XLS-файл корректно открывался у получателя.
Проблемы в исходном скрипте
-
Неправильное кодирование: Использование uuencode
может быть не стандартным решением. Корректным подходом будет использование кодирования base64
, которое поддерживается во многих почтовых клиентах.
-
Отсутствие закрывающего маркера границы: Важно не забыть добавить завершающий маркер для границ в конце MIME-сообщения.
-
Неправильная форма данных для cat
: Использование cat
с here document
было с ошибками в вашем примере.
Исправленный скрипт
Для правильной отправки письма с XLS-вложением мы можем использовать следующий скрипт:
#!/bin/bash
# Задаем необходимые параметры
ATTACH1="file.xls"
SUBJECT="Тема письма"
FROM="ВашеИмя <ваш email>"
TO="получатель@example.com"
MIME="application/vnd.ms-excel"
boundary="---my-unlikely-text-for-mime-boundary---"
DATE=$(date +"%a, %b %e %Y %T %z")
# Формируем и отправляем письмо
{
printf "From: %s\n" "$FROM"
printf "To: %s\n" "$TO"
printf "Subject: %s\n" "$SUBJECT"
printf "Date: %s\n" "$DATE"
printf "Mime-Version: 1.0\n"
printf "Content-Type: multipart/mixed; boundary=\"%s\"\n" "$boundary"
printf "\n"
printf "This email has attached the file\n"
printf "--$boundary\n"
printf "Content-Type: text/plain; charset=ISO-8859-1\n"
printf "Content-Transfer-Encoding: 7bit\n"
printf "\n"
printf "Пожалуйста, найдите вложенный файл.\n"
printf "\n"
printf "--$boundary\n"
printf "Content-Type: %s; name=\"%s\"\n" "$MIME" "$ATTACH1"
printf "Content-Disposition: attachment; filename=\"%s\"\n" "$ATTACH1"
printf "Content-Transfer-Encoding: base64\n"
printf "\n"
base64 "$ATTACH1"
printf "\n"
printf "--$boundary--\n"
} | sendmail -t
Объяснение команд
-
Параметры: Каждые переменные, такие как FROM
, TO
, SUBJECT
, MIME
, и boundary
, заданы в начале скрипта для простоты настройки.
-
Формирование MIME-сообщения:
- Используется конструкция
printf
для более предсказуемого вывода.
- Указываются все необходимые заголовки, включая
Mime-Version
, Content-Type
, и Content-Disposition
.
-
Кодировка с помощью base64:
base64 "$ATTACH1"
— преобразует файл в строку base64, что гарантирует сохранение структуры и содержимого файла.
-
Отправка через sendmail
: Используется стандартный метод отправки почты через команду sendmail
, которая ожидает входные данные через стандартный ввод.
Вывод
Этот скрипт позволяет отправить электронное письмо с вложением в формате XLS, обеспечивая его корректное открытие у получателя. Основные аспекты, на которые следует обращать внимание при отправке email с вложениями, заключаются в правильной кодировке содержимого и соблюдении формата MIME. Следуя этой инструкции, вы сможете избежать проблем с несоответствием формата файла и его повреждением при отправке.