command.txt
위에 표시된 대로 텔넷과 해당 SMTP 서버로 전송된 명령이 포함된 명령 파일을 사용하여 원격 셸을 통해 SMTP 원격 서버에 액세스하려고 합니다.https://tecadmin.net/ways-to-send-email-from-linux-command-line/#(참고: 위 웹사이트에서는 이 작업이 대화형으로 수행되었습니다.) 그러나 여기서는 명령 파일(노란색/빨간색(사용자 입력)을 복사했습니다)에서 이 작업을 명령 파일에 수행하고 싶습니다.
HELO yahoo.com
mail from: [email protected]
rcpt to: [email protected]
data
Hey
This is test email only
Thanks
.
quit
그런 다음 Always를 사용하여 telnet IP smtp < command.txt
다음을 반환합니다.
Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
Connection closed by foreign host.
그리고 내가 상호작용할 때:
perlhook@bbis:~/temp_25$ telnet 1.1.65.49 smtp
Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
220 miraino-manabi.jp ESMTP Postfix
HELO yahoo.com
250 miraino-manabi.jp
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
554 5.7.1 <[email protected]>: Relay access denied
^]
telnet> quit
반환 코드를 받았습니다 220 250 554
.
나는 또한 다음과 같은 here-doc 쉘 스크립트에서 그것을 시도했습니다.
telnet 1.1.65.49 smtp <<END_SCRIPT
HELO yahoo.com
mail from: [email protected]
rcpt to: [email protected]
data
Hey
This is test email only
Thanks
.
quit
END_SCRIPT
동일한 결과를 얻습니다.
이 문제를 해결하고 스크립트가 대화형으로 작동하도록 하려면 어떻게 해야 합니까?
답변1
telnet
여러 가지 이유로 실패했습니다. 첫째, 표준 입력에 TTY가 필요하지만 (리디렉션으로 인해) TTY가 없다는 strace
관련 오류가 발견 되면 실패합니다.telnet
telnet
$ 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)
nc
대신 OR을 사용하면 netcat
비대화형 전송이 여전히 문제가 될 수 있습니다. 한 번에 너무 많은 데이터가 전송되거나(원격 서버를 혼란스럽게 함) 서버가 너무 많은 데이터를 너무 빨리 거부합니다. SMTP는 대화형 대화입니다. 한쪽이 폭탄을 터뜨리면 다른 쪽이 지연하거나 거부할 수 있습니다(너무 빨리 보내는 경우 스팸 발송자가 될 수 있음). 당신이 nc
지지 --delay
하고 원격 메일 서버가 당신을 용서 한다면가능한보낼 수 있습니다.
$ 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",
여기서 OpenSMTPD는 전송을 거부하고 다른 서버(여기에는 표시되지 않음)에서 위의 전송을 허용합니다.
실제로는 SMTP 프로토콜을 사용하는 SMTP 클라이언트를 사용해야 합니다.expect
https://stackoverflow.com/questions/12320592/telnet-smtp-with-expect-or-shell-script그렇지 않으면 TLS, SMTP AUTH, 오류 처리 등을 지원하는 다양한 언어로 된 다양한 SMTP 라이브러리가 있습니다. 여기서 쉘은 좋은 선택이 아닙니다... ZSH와 같은 쉘의 TCP 기능을 사용하지 않는 한, "여기에서 발명되지 않은" 다른 SMTP 클라이언트보다 더 나은 작업이 있을 수 있습니다...