experiments/generate_email.rb
author Mahlon E. Smith <mahlon@martini.nu>
Thu, 03 Oct 2019 11:44:44 -0700
changeset 28 99fdbf4a5f37
parent 15 a38e6916504c
permissions -rwxr-xr-x
Be explicit with sticky removal, so two simultaneous processes don't create a race where sticky is left enabled.

#!/usr/bin/env ruby
#
# This script delivers a pile-o-test email to a local list.
#
# ** The list should first be configured to deliver to an additional
# Maildir. **
#
# After an initial delivery run, you can generate test replies.
#

require 'mail'
require 'faker'
require 'pathname'

abort "Usage: #{$0} send <listaddress> <message count>\n" +
	"       #{$0} reply </path/to/maildir> <message count>" if ARGV.size < 3
mode, list, count = ARGV

SENDERS = count.to_i.times.each_with_object( [] ) do |i, acc|
	acc << "%s %s <%s>" % [
		Faker::Name.first_name,
		Faker::Name.last_name,
		Faker::Internet.safe_email
	]
end

SUBJECTS = count.to_i.times.each_with_object( [] ) do |i, acc|
	intro = if rand(3).zero?
		"%s %s" % [
			[ 'Trying to', 'How do I', 'Help -' ].sample,
			Faker::Hacker.verb
		]
	else
		Faker::Hacker.ingverb.capitalize
	end
	acc << "%s %s %s %s%s" % [
		intro,
		( rand(2).zero? ? Faker::Hacker.noun : Faker::Hacker.abbreviation ),
		[ 'for a', 'on', 'on the', 'with some' ].sample,
		Faker::Hacker.noun,
		[ '?', '.', '?????'].sample
	]
end

Mail.defaults { delivery_method :sendmail }

case mode
	when 'send'
		until SENDERS.empty?
			mail = Mail.new do
				to      list
				from    SENDERS.pop
				subject SUBJECTS.pop
				body    Faker::Hacker.say_something_smart
			end
			mail.deliver
		end

	when 'reply'
		maildir = Pathname.new( list ) + 'new'
		abort "%s doesn't exist." unless maildir.exist?

		count.to_i.times do
			orig = Mail.read( maildir.children.sample.to_s )
			mail = Mail.new do
				to          orig.to
				from        SENDERS.sample
				subject     "Re: %s" % [ orig.subject ]
				body        Faker::Hacker.say_something_smart
				in_reply_to "<%s>" % [ orig.message_id ]
				references  "<%s>" % [ orig.message_id ]
			end
			mail.deliver
		end
end