PageRenderTime 56ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/spec/mail/network/delivery_methods/smtp_spec.rb

https://github.com/okkez/mail
Ruby | 207 lines | 160 code | 41 blank | 6 comment | 7 complexity | 19d74c5f222cafc24685b95bc850e6ba MD5 | raw file
  1. # encoding: utf-8
  2. require 'spec_helper'
  3. describe "SMTP Delivery Method" do
  4. before(:each) do
  5. # Reset all defaults back to original state
  6. Mail.defaults do
  7. delivery_method :smtp, { :address => "localhost",
  8. :port => 25,
  9. :domain => 'localhost.localdomain',
  10. :user_name => nil,
  11. :password => nil,
  12. :authentication => nil,
  13. :enable_starttls_auto => true,
  14. :openssl_verify_mode => nil,
  15. :tls => nil,
  16. :ssl => nil
  17. }
  18. end
  19. MockSMTP.clear_deliveries
  20. end
  21. describe "general usage" do
  22. it "should send emails from given settings" do
  23. mail = Mail.deliver do
  24. from 'roger@moore.com'
  25. to 'marcel@amont.com'
  26. subject 'invalid RFC2822'
  27. smtp_envelope_from 'smtp_from'
  28. smtp_envelope_to 'smtp_to'
  29. end
  30. expect(MockSMTP.deliveries[0][0]).to eq mail.encoded
  31. expect(MockSMTP.deliveries[0][1]).to eq 'smtp_from'
  32. expect(MockSMTP.deliveries[0][2]).to eq %w(smtp_to)
  33. end
  34. it "should be able to send itself" do
  35. mail = Mail.deliver do
  36. from 'roger@moore.com'
  37. to 'marcel@amont.com'
  38. subject 'invalid RFC2822'
  39. end
  40. mail.deliver!
  41. expect(MockSMTP.deliveries[0][0]).to eq mail.encoded
  42. expect(MockSMTP.deliveries[0][1]).to eq mail.from[0]
  43. expect(MockSMTP.deliveries[0][2]).to eq mail.destinations
  44. end
  45. it "should be able to return actual SMTP protocol response" do
  46. Mail.defaults do
  47. delivery_method :smtp, :address => 'smtp.mockup.com', :port => 587, :return_response => true
  48. end
  49. mail = Mail.deliver do
  50. from 'roger@moore.com'
  51. to 'marcel@amont.com'
  52. subject 'invalid RFC2822'
  53. end
  54. response = mail.deliver!
  55. expect(response).to eq 'OK'
  56. end
  57. end
  58. describe "enabling tls" do
  59. def redefine_verify_none(new_value)
  60. OpenSSL::SSL.send(:remove_const, :VERIFY_NONE)
  61. OpenSSL::SSL.send(:const_set, :VERIFY_NONE, new_value)
  62. end
  63. it "should use OpenSSL::SSL::VERIFY_NONE if a context" do
  64. # config can't be setup until redefined
  65. redefine_verify_none(OpenSSL::SSL::SSLContext.new)
  66. Mail.defaults do
  67. delivery_method :smtp, :address => 'smtp.mockup.com', :port => 587
  68. end
  69. mail = Mail.deliver do
  70. from 'roger@moore.com'
  71. to 'marcel@amont.com'
  72. subject 'invalid RFC2822'
  73. end
  74. expect { mail.deliver! }.not_to raise_error
  75. end
  76. it "should ignore OpenSSL::SSL::VERIFY_NONE if it is 0" do
  77. # config can't be setup until redefined
  78. redefine_verify_none(0)
  79. Mail.defaults do
  80. delivery_method :smtp, :address => 'smtp.mockup.com', :port => 587
  81. end
  82. mail = Mail.deliver do
  83. from 'roger@moore.com'
  84. to 'marcel@amont.com'
  85. subject 'invalid RFC2822'
  86. end
  87. expect { mail.deliver! }.not_to raise_error
  88. end
  89. end
  90. describe "enabling ssl" do
  91. def redefine_verify_none(new_value)
  92. OpenSSL::SSL.send(:remove_const, :VERIFY_NONE)
  93. OpenSSL::SSL.send(:const_set, :VERIFY_NONE, new_value)
  94. end
  95. it "should use OpenSSL::SSL::VERIFY_NONE if a context" do
  96. # config can't be setup until redefined
  97. redefine_verify_none(OpenSSL::SSL::SSLContext.new)
  98. Mail.defaults do
  99. delivery_method :smtp, :address => 'smtp.mockup.com', :port => 587, :tls => true
  100. end
  101. mail = Mail.deliver do
  102. from 'roger@moore.com'
  103. to 'marcel@amont.com'
  104. subject 'invalid RFC2822'
  105. end
  106. expect { mail.deliver! }.not_to raise_error
  107. end
  108. it "should ignore OpenSSL::SSL::VERIFY_NONE if it is 0" do
  109. # config can't be setup until redefined
  110. redefine_verify_none(0)
  111. Mail.defaults do
  112. delivery_method :smtp, :address => 'smtp.mockup.com', :port => 587, :tls => true
  113. end
  114. mail = Mail.deliver do
  115. from 'roger@moore.com'
  116. to 'marcel@amont.com'
  117. subject 'invalid RFC2822'
  118. end
  119. expect { mail.deliver! }.not_to raise_error
  120. end
  121. end
  122. describe "SMTP Envelope" do
  123. it "uses the envelope From and To addresses" do
  124. Mail.deliver do
  125. to "to@someemail.com"
  126. from "from@someemail.com"
  127. message_id "<1234@someemail.com>"
  128. body "body"
  129. smtp_envelope_to "smtp_to@someemail.com"
  130. smtp_envelope_from "smtp_from@someemail.com"
  131. end
  132. expect(MockSMTP.deliveries[0][1]).to eq 'smtp_from@someemail.com'
  133. expect(MockSMTP.deliveries[0][2]).to eq %w(smtp_to@someemail.com)
  134. end
  135. it "supports the null sender in the envelope from address" do
  136. Mail.deliver do
  137. to "to@someemail.com"
  138. from "from@someemail.com"
  139. message_id "<1234@someemail.com>"
  140. body "body"
  141. smtp_envelope_to "smtp_to@someemail.com"
  142. smtp_envelope_from Mail::Constants::NULL_SENDER
  143. end
  144. expect(MockSMTP.deliveries[0][1]).to eq '<>'
  145. expect(MockSMTP.deliveries[0][2]).to eq %w(smtp_to@someemail.com)
  146. end
  147. it "should raise if there is no envelope From address" do
  148. expect do
  149. Mail.deliver do
  150. to "to@somemail.com"
  151. subject "Email with no sender"
  152. body "body"
  153. end
  154. end.to raise_error('An SMTP From address is required to send a message. Set the message smtp_envelope_from, return_path, sender, or from address.')
  155. end
  156. it "should raise an error if no recipient if defined" do
  157. expect do
  158. Mail.deliver do
  159. from "from@somemail.com"
  160. subject "Email with no recipient"
  161. body "body"
  162. end
  163. end.to raise_error('An SMTP To address is required to send a message. Set the message smtp_envelope_to, to, cc, or bcc address.')
  164. end
  165. end
  166. end