uuencode
é um remanescente do início dos anos 90 e deve ser evitado em favor de ferramentas MIME adequadas, se possível.
Infelizmente, ainda não existe um utilitário de linha de comando Unix simples para enviar mensagens MIME, embora mutt
chegue perto (mas ainda é basicamente um programa interativo, e portanto inclui um quantidade de inchaço, se tudo que você precisa é enviar uma mensagem ao seu MTA de um script).
Com modernas linguagens de script, uma ferramenta para enviar uma mensagem multipartes com uma parte do corpo de texto in-line com um anexo binário é apenas algumas linhas de código. No shell script, o código é um pouco mais volumoso; mas o verdadeiro desafio é, muitas vezes, saber o suficiente sobre o MIME para poder executá-lo corretamente. Resumidamente, você precisa entender a estrutura geral de uma mensagem MIME e como codificar o tipo de parte do corpo que deseja usar.
( printf 'From: %s\nTo: %s\nSubject: %s\n' "$sender" "$recipient" "$subject"
printf 'Mime-Version: 1.0\nContent-type: multipart/mixed; boundary="foooobar"\n'
printf '\n--foooobar\n\n'
cat "$TFILE1"
printf '\n--foooobar\nContent-type: application/octet-stream; name="%s"\n' "${output_file##*/}"
printf 'Content-transfer-encoding: base64\n\n'
base64 "$output_file"
printf '\n--foooobar--\n' ) |
sendmail -t
Isso deve funcionar para o texto básico US-ASCII de 7 bits; se você precisa de texto de 8 bits, especialmente nos cabeçalhos, há várias reviravoltas adicionais (RFC 2047 para texto legível por humanos, RFC 2231 para nomes de arquivos e semelhantes), no ponto em que você realmente deseja mudar para um linguagem que encapsula esses detalhes para que você não precise entendê-los ou se preocupar com eles.
Além da dependência de base64
e sendmail
para o envio real, isso é puro e utilitários de shell muito básicos. A expansão de parâmetro ${output_file##*/}
deve funcionar com os shells recentes para remover tudo através da barra final, embora se você estiver realmente em um antigo, talvez queira usar basename
.