Как установить тему письма с использованием переменной и убедиться, что вложение не включено в тело электронной почты

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

У меня есть следующий фрагмент скрипта оболочки.

var_name="ZZPCI"
for emailadd in `cat /tmp/email_list.tmp`
do
   subject_text="Тема с именем переменной "$var_name
   subj_text_novar="Тема без имени переменной"
   email_mssge="это сообщение с именем переменной "$var_name
   echo "$email_mssge"|mailx -a /tmp/my_report.txt -s "$subject_text" "$emailadd"
   echo "$email_mssge"|mailx -a /tmp/my_report.txt -s "$subj_text_novar" "$emailadd"
done

Что он делает это:
a. Устанавливает переменную var_name
b. Читает список адресов электронной почты, хранящийся в /tmp/email_list.tmp
c. Компилирует и отправляет электронное письмо с /tmp/my_report.txt (текстовый файл) в качестве вложения

Скрипт предназначен для работы на нескольких разных серверах, поэтому var_name будет меняться на каждом сервере. Команда mail с $subj_text_novar (не включает $var_name в строку темы) отправляет письмо корректно. Однако команда mail с $subject_text, которая включает $var_name, помещает содержимое вложения в основной текст письма. Насколько я могу судить, это фактический знак $ вызывает проблему, потому что жесткое кодирование значения var_name в строку нормально, но я не понимаю, почему, ведь var_name – это просто конкатенированная строка. Как я могу установить тему для mail, чтобы она включала $var_name, и мой текстовый файл был отправлен в качестве вложения?

Я запускаю это на SuSE 11.3, но решение в идеале должно работать и на AIX 6.1 и HP UX11.31.

С уважением

У меня есть нечто для вас, используя heirloom-mailx:

enviaremail() {
values=$(echo "$@" | tr -d '\n')
listargs=()
listargs+=($values)
heirloom-mailx $( attachment=""
for (( a = 5; a < ${#listargs[@]}; a++ )); do
attachment=$(echo "-a ${listargs[a]} ")
echo "${attachment}"
done) -v -s "${titulo}" \
-S smtp-use-starttls \
-S ssl-verify=ignore \
-S smtp-auth=login \
-S smtp=smtp://$1 \
-S from="${2}" \
-S smtp-auth-user=$3 \
-S smtp-auth-password=$4 \
-S ssl-verify=ignore \
$5 < ${cuerpo}
}

Вызов функции:
enviaremail smtp.mailserver:port from_address authuser ‘pass’ список получателей вложений, разделённых пробелом

Кроме того, пожалуйста, не забудьте заранее определить внешние переменные $titulo (тема) и $cuerpo (текст) электронной почты перед использованием функции. Вы можете поместить эту функцию в скрипт (mailsend.sh) в путь, а затем просто использовать ее в своих скриптах с помощью source или разместить в вашем файле .bashrc.

С наилучшими пожеланиями

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

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

Обновленный фрагмент кода

var_name="ZZPCI"
for emailadd in $(cat /tmp/email_list.tmp); do
    subject_text="Subject with Var Name $var_name"
    subj_text_novar="Subject without Var Name"
    email_msg="Это сообщение с переменной имя $var_name"

    # Отправка email с переменной в заголовке и вложением
    echo "$email_msg" | mailx -a /tmp/my_report.txt -s "$subject_text" "$emailadd"

    # Отправка email без переменной в заголовке и с тем же вложением
    echo "$email_msg" | mailx -a /tmp/my_report.txt -s "$subj_text_novar" "$emailadd"
done

Объяснение изменений

  1. Обработка переменной: Убедитесь, что переменная var_name правильно интерпретируется. Используйте двойные кавычки, чтобы избежать проблем с интерпретацией символа $ в заголовке.

  2. Использование foreach в bash: Вместо использования старой конструкции for emailadd in \cat /tmp/email_list.tmp`я применил более современный подход с использованием$(…)`, который лучше обрабатывает пробелы и специальные символы.

  3. Избежание проблем с вложением: Убедитесь, что при отправке письма используется команда echo без каких-либо дополнительных символов или конструкций, которые могут вызвать проблемы с интерпретацией содержимого вложения. Ваша проблема, как вы уже заметили, возникает из-за неправильно интерпретируемых переменных. Применение одинарных кавычек не позволит интерпретировать переменные как нужные вам строки.

Тестирование

Предлагаю протестировать вышеуказанный скрипт, чтобы убедиться в правильной работе на всех целевых платформах (SuSE 11.3, AIX 6.1 и HP-UX 11.31). Если возникнут дополнительные проблемы, проверьте версии пакетов mailx и наличие необходимых библиотек для обработки вложений.

Заключение

Следуя данному примеру, вы сможете корректно задать тему письма с использованием переменной без включения содержимого вложения в тело письма. Если у вас будут дополнительные вопросы или понадобятся разъяснения, не стесняйтесь обращаться.

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

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