Skip to content

Commit

Permalink
SmtpServer: support multiple messages per one connection
Browse files Browse the repository at this point in the history
Closes #288 and #628
  • Loading branch information
sodabrew committed Apr 30, 2018
1 parent 168e406 commit 7feb4c5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 5 deletions.
2 changes: 1 addition & 1 deletion lib/em/protocols/smtpserver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ def process_data_line ln
(d ? succeeded : failed).call
end

@state.delete :data
@state -= [:data, :mail_from, :rcpt]
else
# slice off leading . if any
ln.slice!(0...1) if ln[0] == ?.
Expand Down
41 changes: 37 additions & 4 deletions tests/test_smtpserver.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
require 'net/smtp'
require 'em_test_helper'

class TestSmtpServer < Test::Unit::TestCase
Expand All @@ -13,45 +14,77 @@ class TestSmtpServer < Test::Unit::TestCase
#
class Mailserver < EM::Protocols::SmtpServer

attr_reader :my_msg_body, :my_sender, :my_recipients
attr_reader :my_msg_body, :my_sender, :my_recipients, :messages_count

def initialize *args
super
end

def receive_sender sender
@my_sender = sender
#p sender
true
end

def receive_recipient rcpt
@my_recipients ||= []
@my_recipients << rcpt
true
end

def receive_data_chunk c
@my_msg_body = c.last
end

def receive_message
@messages_count ||= 0
@messages_count += 1
true
end

def connection_ended
EM.stop
end
end

def test_mail
def run_server
c = nil
EM.run {
EM.start_server( Localhost, Localport, Mailserver ) {|conn| c = conn}
EM::Timer.new(2) {EM.stop} # prevent hanging the test suite in case of error
yield if block_given?
}
c
end

def test_mail
c = run_server do
EM::Protocols::SmtpClient.send :host=>Localhost,
:port=>Localport,
:domain=>"bogus",
:from=>"me@example.com",
:to=>"you@example.com",
:header=> {"Subject"=>"Email subject line", "Reply-to"=>"me@example.com"},
:body=>"Not much of interest here."

}
end
assert_equal( "Not much of interest here.", c.my_msg_body )
assert_equal( "<me@example.com>", c.my_sender )
assert_equal( ["<you@example.com>"], c.my_recipients )
end



def test_multiple_messages_per_connection
c = run_server do
Thread.new do
Net::SMTP.start( Localhost, Localport, Localhost ) do |smtp|
2.times do
smtp.send_message "This is a test e-mail message.", 'me@fromdomain.com', 'test@todomain.com'
end
end
end
end

assert_equal( 2, c.messages_count )
end
end

0 comments on commit 7feb4c5

Please sign in to comment.