telnet
falha por diversos motivos. Primeiro, se você strace
os erros relevantes são telnet
desejando um TTY na entrada padrão, dos quais não há nenhum (por causa do redirecionamento), então telnet
falha.
$ strace telnet mx.example.edu 25 < input
...
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(0, SNDCTL_TMR_START or TCSETS, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)
Se, em vez disso, nc
ou netcat
for usado, o envio não interativo ainda pode ser um problema; ou muito é enviado de uma só vez (o que confundirá o servidor remoto) ou o servidor se oporá a muitos dados muito rapidamente; SMTP é uma conversa interativa. Se um lado estiver detonando, o outro pode atrasar ou rejeitar isso (o envio rápido demais pode ser uma indicação de um spammer). Se o seu nc
suportar --delay
e o servidor de correio remoto estiver perdoando, maio poderá enviar.
$ strace -s 80 nc --crlf --delay 1 mx.example.edu 25 < input
...
recvfrom(3, "220 mx.example.edu ESMTP OpenSMTPD\r\n", 8192, ...
...
sendto(3, "HELO client.example.edu\r\nmail from: [email protected]\r\n...
...
shutdown(3, SHUT_WR) = 0
...
recvfrom(3, "500 5.5.1 Invalid command: Pipelining not supported\r\n",
O OpenSMTPD aqui rejeita o envio; O postfix em um servidor diferente (não mostrado aqui) permite o envio acima.
Um cliente SMTP que fala o protocolo SMTP deve ser usado em vez disso; isso pode ser feito junto com algo como expect
link ou de outra forma existem várias bibliotecas SMTP em vários idiomas que suportarão TLS, SMTP AUTH, erros de identificador e assim por diante. O shell não é uma boa escolha aqui ... a menos que você use os recursos TCP de um shell como o ZSH, mas provavelmente há coisas melhores para fazer do que "não inventado aqui", mas outro cliente SMTP ...