`echo $subject` is a convoluted way of writing
$subject (except that it mangles the value a bit more if it contains whitespace or
$subject outside quotes is treated as a whitespace-separated list of wildcard patterns, and then the result of the whole command substitution is again treated as a whitespace-separated list of wildcard patterns).
The only way for your command to result in this error is if
`echo $subject` `echo $mailadd` is empty. This happens only when both
`echo $subject` and
`echo $mailadd` consist only of whitespace, which in turns happens only if both variables
mailadd are empty (plus a few oddball cases, such as
subject being the character
? and the current directory containing a file whose name is a single space). So most likely you have some blank lines in your input file.
You should always put double quotes around variable substitutions and command substitutions (
"$(somecommand)") unless you really mean the values of the variables to be interpreted as whitespace-separated lists of file wildcard patterns.
mutt -s "$subject" "$mailaddr" <~/testeomail.txt
If there's a blank line in the input file, skip it.
while read -a line; do
if [ -z "$subject" ]; then continue; fi
mutt -s "$subject" "$mailadd" < /home/emanuele/testomail.txt
done < prova.txt