If your shell supports them, you could use an associative array for the first case:
declare -A list=([john]="john@gmail.com" [doe]="doe@outlook.com" [jenny]="jenny@another.domain")
for i in "${!list[@]}"; do
echo "Dear $i, email text" | mail -s "Hello $i" "${list[$i]}"
done
For the second case, a while loop:
while IFS=, read -r i j; do
echo "Dear $i, email text" | mail -s "Hello $i" "$j"
done < file.csv
(this assumes your file is correctly formatted CSV, without a header line).