enviar email do mau comportamento do terminal

0

Eu tenho o seguinte script que eu coloco junto da web, para enviar e-mails do terminal pelo 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="[email protected]"
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!

Mas quando eu envio e-mails, tenho os seguintes comportamentos:

  • com / sem anexos: se $subject for "algum tema aleatório", o email será enviado para $TO e [email protected] , [email protected] e theme@ mipc.localdomain .
  • sem anexos: $BODY está no corpo do email
  • com anexos: o corpo do email está vazio

EDIT: graças a @ilkkachu, primeiro problema foi corrigido, novo código:

#!/bin/bash

#sendGmail "FROM" "TO" "SUBJECT" "BODY" "ATTACHMENTS (optional)"
FROM=$1
TO=$2
SUBJECT=$3
BODY=$4

if [ "$FROM" == "" ]; then
    FROM="[email protected]"
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!
    
por kurokirasama 03.07.2018 / 19:19

1 resposta

2

Isso é por causa da divisão de palavras . Se SUBJECT contiver some random theme , então mail -s $SUBJECT será igual a mail -s some random theme . O conteúdo de $subject é dividido em palavras no espaço em branco. Você precisa usar aspas: mail -s "$SUBJECT" .

Sobre os anexos, você provavelmente precisará adicionar a opção -A para cada arquivo. Assim, em vez de -A file1 file2 , talvez seja necessário -A file1 -A file2 . Se os nomes dos seus arquivos não contiverem espaço em branco, você poderá adicionar o -A em ATTACHMENTS para cada nome de arquivo, por exemplo: ATTACHMENTS="$ATTACHMENTS -A $attachment" e usar $ATTACHMENTS no comando mail (você não usa) Não quero aspas aqui, uma vez que os nomes das opções e dos arquivos precisam ser divididos).

A maneira correta seria, claro, usar uma matriz para manter os argumentos da linha de comando, mas o seu for loop já causa a divisão de palavras nos anexos, portanto, uma matriz não ajudaria.

Então:

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

Também presumo que você tenha verificado seu mail usa -A para receber anexos. Existem várias versões de mail e as que encontrei não conhecem essa opção. Por exemplo. aquele cujo página de manual está no die.net leva -a para anexos, e usa -A para algo outro. Então, você pode querer checar se isso não funciona.

    
por 03.07.2018 / 19:59