Вопрос или проблема
У меня есть следующий фрагмент скрипта оболочки.
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
Объяснение изменений
-
Обработка переменной: Убедитесь, что переменная
var_name
правильно интерпретируется. Используйте двойные кавычки, чтобы избежать проблем с интерпретацией символа$
в заголовке. -
Использование foreach в bash: Вместо использования старой конструкции
for emailadd in \
cat /tmp/email_list.tmp`я применил более современный подход с использованием
$(…)`, который лучше обрабатывает пробелы и специальные символы. -
Избежание проблем с вложением: Убедитесь, что при отправке письма используется команда
echo
без каких-либо дополнительных символов или конструкций, которые могут вызвать проблемы с интерпретацией содержимого вложения. Ваша проблема, как вы уже заметили, возникает из-за неправильно интерпретируемых переменных. Применение одинарных кавычек не позволит интерпретировать переменные как нужные вам строки.
Тестирование
Предлагаю протестировать вышеуказанный скрипт, чтобы убедиться в правильной работе на всех целевых платформах (SuSE 11.3, AIX 6.1 и HP-UX 11.31). Если возникнут дополнительные проблемы, проверьте версии пакетов mailx
и наличие необходимых библиотек для обработки вложений.
Заключение
Следуя данному примеру, вы сможете корректно задать тему письма с использованием переменной без включения содержимого вложения в тело письма. Если у вас будут дополнительные вопросы или понадобятся разъяснения, не стесняйтесь обращаться.