1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
# encoding: utf-8
# frozen_string_literal: true
require 'spec_helper'
describe "SMTP Delivery Method" do
before(:each) do
# Reset all defaults back to an original state
Mail.defaults do
delivery_method :smtp, { :address => "localhost",
:port => 25,
:domain => 'localhost.localdomain',
:user_name => nil,
:password => nil,
:authentication => nil,
:enable_starttls_auto => true }
end
end
after(:each) do
files = Dir.glob(File.join(Mail.delivery_method.settings[:location], '*'))
files.each do |file|
File.delete(file)
end
end
describe "general usage" do
tmpdir = File.expand_path('../../../../tmp/mail', __FILE__)
it "should send an email to a file" do
Mail.defaults do
delivery_method :file, :location => tmpdir
end
mail = Mail.deliver do
from 'roger@moore.com'
to 'marcel@amont.com'
subject 'invalid RFC2822'
end
delivery = File.join(Mail.delivery_method.settings[:location], 'marcel@amont.com')
expect(File.read(delivery)).to eq mail.encoded
end
it "should send multiple emails to multiple files" do
Mail.defaults do
delivery_method :file, :location => tmpdir
end
mail = Mail.deliver do
from 'roger@moore.com'
to 'marcel@amont.com, bob@me.com'
subject 'invalid RFC2822'
end
delivery_one = File.join(Mail.delivery_method.settings[:location], 'marcel@amont.com')
delivery_two = File.join(Mail.delivery_method.settings[:location], 'bob@me.com')
expect(File.read(delivery_one)).to eq mail.encoded
expect(File.read(delivery_two)).to eq mail.encoded
end
it "should only create files based on the addr_spec of the destination" do
Mail.defaults do
delivery_method :file, :location => tmpdir
end
Mail.deliver do
from 'roger@moore.com'
to '"Long, stupid email address" <mikel@test.lindsaar.net>'
subject 'invalid RFC2822'
end
delivery = File.join(Mail.delivery_method.settings[:location], 'mikel@test.lindsaar.net')
expect(File.exist?(delivery)).to be_truthy
end
it "should use the base name of the file name to prevent file system traversal" do
Mail.defaults do
delivery_method :file, :location => tmpdir
end
Mail.deliver do
from 'roger@moore.com'
to '../../../../../../../../../../../tmp/pwn'
subject 'evil hacker'
end
delivery = File.join(Mail.delivery_method.settings[:location], 'pwn')
expect(File.exist?(delivery)).to be_truthy
end
it "should raise an error if no sender is defined" do
Mail.defaults do
delivery_method :file, :location => tmpdir
end
expect do
Mail.deliver do
to "to@somemail.com"
subject "Email with no sender"
body "body"
end
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.')
end
it "should raise an error if no recipient if defined" do
Mail.defaults do
delivery_method :file, :location => tmpdir
end
expect do
Mail.deliver do
from "from@somemail.com"
subject "Email with no recipient"
body "body"
end
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.')
end
end
end
|