通过 telnet ruby 脚本发送电子邮件
send email via telnet ruby script
我是 ruby 的新手,需要使用没有身份验证的中继主机通过 telnet 发送电子邮件。我可以用 linux shell 来做,但我需要把它放在脚本中,这样我才能 "simplify" 它的使用,我知道这不是最好的方法,但我找不到其他方法因为我工作的服务器受到严格限制和限制。
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 class 这是我的尝试...在 mail.cmd('helo MYDOMAIN')
之后我无法继续编写其他命令,我得到的是:
220 mail.server.com ESMTP
250 mail.server.com
之后我应该写 mail from
等来创建邮件。但是我不能在 ruby 脚本中。我尝试使用:
mail.puts('mail from: test...')
mail.write('mail from: test...')
mail.print('mail from: test...')
mail.cmd('mail from: test...')
我也不懂 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.
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
时,您不应该指定文件扩展名。随时为您处理。
感谢用户 ddubs 如何建议 net\smtp
gem(一个我不知道的)我能够创建一个简单的邮件发件人并使用 mailfactory
gem
Is it a strict requirement that you use telnet? Using ruby-doc.org/stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP.html will turn your "difficult to maintain" script into something that is much easier to maintain. Even for someone who is completely new to 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
我是 ruby 的新手,需要使用没有身份验证的中继主机通过 telnet 发送电子邮件。我可以用 linux shell 来做,但我需要把它放在脚本中,这样我才能 "simplify" 它的使用,我知道这不是最好的方法,但我找不到其他方法因为我工作的服务器受到严格限制和限制。
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 class 这是我的尝试...在 mail.cmd('helo MYDOMAIN')
之后我无法继续编写其他命令,我得到的是:
220 mail.server.com ESMTP
250 mail.server.com
之后我应该写 mail from
等来创建邮件。但是我不能在 ruby 脚本中。我尝试使用:
mail.puts('mail from: test...')
mail.write('mail from: test...')
mail.print('mail from: test...')
mail.cmd('mail from: test...')
我也不懂 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.
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
时,您不应该指定文件扩展名。随时为您处理。
感谢用户 ddubs 如何建议 net\smtp
gem(一个我不知道的)我能够创建一个简单的邮件发件人并使用 mailfactory
gem
Is it a strict requirement that you use telnet? Using ruby-doc.org/stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP.html will turn your "difficult to maintain" script into something that is much easier to maintain. Even for someone who is completely new to 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