通过telnet ruby​​脚本发送电子邮件

时间:2017-09-06 15:38:20

标签: ruby telnet

我是ruby的新手,需要使用没有身份验证的中继主机通过telnet发送电子邮件。我可以用linux shell做到这一点,但我需要把它放在一个脚本中,这样我才能简化"它的使用,我知道这不是最好的方法,但我无法找到其他的,因为我正在处理它的服务器受到严格的限制和限制。

require 'net/telnet.rb'

mail = Net::Telnet::new(
     "Host"       => "domain.ip",  # default: "localhost"
     "Port"       => 25,           # default: 23
     "Output_log" => "output_log", # default: nil (no output)
     "Dump_log"   => "dump_log",   # default: nil (no output)
     "Prompt"     => /[$%#>] \z/n, # default: /[$%#>] \z/n
     "Telnetmode" => true,         # default: true
     "Timeout"    => 10,           # default: 10
     "Waittime"   => 0,            # default: 0
   )

mail.cmd('helo MYDOMAIN'){ |c| print c }
mail.cmd('mail from: test@domain.com')
mail.cmd('rcpt to: test2@domain.com')
mail.cmd('data')
mail.cmd("subject: test cmd \n\n mensaje de prueba\n\n")
mail.cmd(".\n")
mail.close

我找到了net/telnet.rb ruby​​类,这是我的尝试...在mail.cmd('helo MYDOMAIN')之后我不能继续编写其他命令,我得到的是:

220 mail.server.com ESMTP
250 mail.server.com

在此之后我会写mail from等来创建邮件。但我不能用红宝石脚本。我尝试使用:

mail.puts('mail from: test...')
mail.write('mail from: test...')
mail.print('mail from: test...')
mail.cmd('mail from: test...')

正如documentation

所述

另外,我没有收到telnetmode(true|false)命令,也许你可以向我解释一下。

- 编辑 -

Shell代码试图模仿:

telnet domain.ip 25
#=> Trying domain.ip...
#=> Connected to domain.ip.
#=> Escape character is '^]'.
#=> 220 mail.server.com ESMTP
helo MYDOMAIN
#=>250 mail.server.com
mail from:test@mydomain.com
#=> 250 2.1.0 Ok
rcpt to:test2@mydomain.com
#=> 250 2.1.0 Ok
data
#=> 354 End data with <CR><LF>.<CR><LF>
subject: test mail

test mail body

.
#=> 250 2.0.0 =k: queued as B6F08480D12
quit
#=> 221 2.0.0 Bye
#=> Connection closed by foreign host.

2 个答案:

答案 0 :(得分:0)

telnet协议确实非常简陋,这就是telnet命令对测试基于TCP / IP的服务(如SMTP或HTTP)有用的原因。这并不意味着这些服务实际上使用的是telnet协议,因为它们并不适用。它们在本质上非常方便纯文本,这意味着使用telnet进行简单测试是切实可行的。

你应该将Telnet模块用于连接到telnet服务以外的任何其他设备,但鉴于2017年的情况,您不太可能找到任何这些服务周围。

应该使用类似Socket的内容进行连接。这可以创建一个完全控制发送的裸TCP / IP连接。由于这是常规POSIX文件句柄的包装器,因此您可以使用其上的所有IO方法来读取,写入和其他控制函数,例如正确的套接字shutdown

编写SMTP适配器并不像看起来那么容易,在IO方面需要解决许多棘手的问题。您需要使用IO.select来正确测试新数据,以及套接字可以清楚地编写您的电子邮件。

这是一个新的存根:

require 'socket'

mail = TCPSocket.new("smtp.example.com", 25)

mail.write("HELO example.com\r\n")

另一个注意事项是,当您致电require时,您永远不应指定文件扩展名。它总是为你处理。

答案 1 :(得分:0)

感谢用户ddubs的帮助,如何建议net\smtp gem(一个我不知道的)我能够创建一个简单的邮件发件人并使用mailfactory gem < / p>

  

您是否严格要求使用telnet?使用ruby-doc.org/stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP.html将使您的#34;难以维护&#34;将脚本编写成易于维护的内容。即使是对Ruby完全陌生的人也是如此。 - ddubs

以下是代码示例

require 'net/smtp'
require 'mailfactory'

mail_body_HTML = '<h1> mail title</h1> your text in <b>HTML</b>'    
mail_body_PLAIN = 'this is plain text'
mail_subject = 'test email'     
mail_from = 'noreply@mydomain.com'
mail_to = 'user@otherdomain.com'
# mail_filePath = ''

mail = MailFactory.new()
mail.to = mail_to
mail.from = mail_from
mail.subject = mail_subject
mail.html = mail_body_HTML
# mail.text = mail_body_PLAIN
# mail.attach(mail_filePath)

relay_ip = x.x.x.x

Net::SMTP.start(relay_ip,25) do |smtp|
   smtp.send_message(mail.to_s, mail_from, mail_to)
end