отправка электронной почты с терминала плохое поведение

У меня есть следующий скрипт, который я поставил вместе из Интернета, чтобы отправлять электронные письма с терминала через gmail.

#!/bin/bash #sendGmail "FROM" "TO" "SUBJECT" "BODY" "ATTACHMENTS (optional)" FROM=$1 TO=$2 SUBJECT=$3 BODY=$4 # Function to check if entered file names are really files function check_files() { output_files="" for file in $1; do if [ -s $file ]; then output_files="${output_files}${file} " fi done echo $output_files } if [ "$FROM" == "" ]; then FROM="default@gmail.com" else if [[ "$FROM" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then echo error in FROM exit fi fi if [[ "$TO" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then echo error in TO exit fi if [ -z "$5" ]; then echo $BODY | mail -r $FROM -s $SUBJECT $TO else ATT=$5 ATTACHMENTS="" attachments=$(check_files "$ATT") for attachment in $attachments; do ATTACHMENTS="$ATTACHMENTS $attachment" done echo $ATTACHMENTS echo $BODY | mail -r $FROM -s $SUBJECT -A $ATTACHMENTS $TO fi echo email sent! 

Но когда я отправляю электронные письма, у меня следующие поведения:

  • с / без вложений: если $subject – это «какая-то случайная тема», то электронное письмо отправляется по some@mipc.localdomain $TO и some@mipc.localdomain , random@mipc.localdomain и theme@ mipc.localdomain .
  • без вложений: $BODY находится в теле письма
  • с вложениями: тело письма пусто

РЕДАКТИРОВАТЬ: благодаря @ilkkachu, первая проблема была исправлена, новый код:

 #!/bin/bash #sendGmail "FROM" "TO" "SUBJECT" "BODY" "ATTACHMENTS (optional)" FROM=$1 TO=$2 SUBJECT=$3 BODY=$4 if [ "$FROM" == "" ]; then FROM="default@gmail.com" else if [[ "$FROM" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then echo error in FROM exit fi fi if [[ "$TO" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then echo error in TO exit fi if [ -z "$5" ]; then echo "$BODY" | mail -r "$FROM" -s "$SUBJECT" "$TO" else ATT=$5 ATTACHMENTS="" for attachment in $ATT; do if [ -f $attachment ]; then ATTACHMENTS="$ATTACHMENTS-A $attachment " else echo something wrong with $attachment, therefore not attached fi done echo "$BODY" | mail -r "$FROM" -s "$SUBJECT" $ATTACHMENTS "$TO" fi echo email sent! 

Это из-за разделения слов . Если SUBJECT содержит some random theme , то mail -s $SUBJECT совпадает с mail -s some random theme . Содержимое $subject разбивается на слова в пробеле. Вам нужно использовать кавычки: mail -s "$SUBJECT" .

Что касается вложений, вам, вероятно, нужно добавить опцию -A для каждого файла, поэтому вместо -A file1 file2 вам может понадобиться -A file1 -A file2 . Если ваши имена файлов не содержат пробелов, вы можете сделать это, добавив -A в ATTACHMENTS для каждого имени файла, например: ATTACHMENTS="$ATTACHMENTS -A $attachment" а затем использовать $ATTACHMENTS самостоятельно в команде mail (вы не здесь не нужны кавычки, так как имена параметров и файлов должны быть разделены).

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

Так:

 for f in files... ; do ATTACHMENTS="-A $f" done echo "$BODY" | mail -r "$FROM" -s "$SUBJECT" $ATTACHMENTS "$TO" 

Я также предполагаю, что вы проверили, что ваша mail использует -A для вложения. Существует несколько версий mail , и те, которые я нашел, не знают об этом. Например, тот, чья страница руководства находится на die.net, принимает -a для вложений и использует -A для чего-то другого. Итак, вы можете проверить это дважды, если это не работает.