mailgun-helper/MailGunTool.rb

170 lines
4.1 KiB
Ruby

require 'mailgun-ruby'
class MailgunTool
def initialize( list, api_key, domain_name, of = 'out.csv')
# init vars
@outfile = File.new( of, "a")
@list_address = list
@api_key = api_key
@domain_name = domain_name
@mg_client = Mailgun::Client.new @api_key
@email_adressen = Array.new
@first_run = true
end
# Fetches list of subscribers.
#
# @param email [String]
# @return [Array] list of email Adresses.
def get_adresses( email = nil )
if @first_run == true
result = @mg_client.get("lists/#{@list_address}/members/pages", {:subscribed => 'yes'})
@first_run = false
else
unless email == nil
result = @mg_client.get("lists/#{@list_address}/members/pages", {:subscribed => 'yes', :address => email , :page => 'next'})
else
return "No Email Adress ??"
end
end
my_hash = result.to_h
self.extract_email_addresses(my_hash)
# check if more
unless my_hash['items'].length == 0
email = @email_adressen.last
self.get_adresses(email)
else
"Fertig"
return @email_adressen
end
end
# Fetches list of bounced Addresses.
#
# @return [Array] list of bounced email.
def get_bounces
if @first_run == true
result = @mg_client.get("#{@domain_name}/bounces")
@first_run = false
else
unless email == nil
result = @mg_client.get("#{@domain_name}/bounces", { :address => email , :page => 'next'})
else
return "No Email Adress ??"
end
end
my_hash = result.to_h
self.extract_email_addresses(my_hash)
# check if more
unless my_hash['items'].length == 0
email = @email_adressen.last
self.get_adresses(email)
else
p "------------ Fertig --------------"
return @email_adressen
end
end
# Adds email Addresses read from txt file to mailing list.
# @return [nil]
def add_list_members(f)
File.open f, 'r' do |file|
file.each do |email|
p @mg_client.post("/lists/#{@list_address}/members", :subscribed => true, :address => email.chomp, :upsert => true )
end
end
end
# Deletes email Addresses read from txt file from mailing list.
# @return [nil]
def delete_list_members(f)
File.open f, 'r' do |file|
file.each do |email|
begin
p @mg_client.delete("/lists/#{@list_address}/members/#{email.chomp}")
rescue
puts "--------\n#{email} Not found..NEXT\n"
next
end
end
end
end
# Send scheduled message
# @return [nil]
# @todo email parameters
def send_scheduled_message
@mg_client.post("#{@domain_name}/messages",
:from => "<mail@example.com>",
:to => @list_address,
:subject => "Toller Test",
:text => "Testing some Mailgun awesomeness! %mailing_list_unsubscribe_url% ",
:html => "<h1>html supi test</h1>",
"o:deliverytime" => "Mon, 10 Jun 2019 17:15:00 +0200")
end
# Send message
# @return [nil]
# @todo email parameters
def send_message
p @mg_client.post("#{@domain_name}/messages",
:from => "<mail@example.com>",
:to => @list_address,
:subject => "TEST",
:text => "TEST TEST TEST, %unsubscribe_url% ",
:html => 'TEST TEST TEST, %unsubscribe_url% ' )
end
# Get logs of rejected OR failed recipients
# @return [Array] of email addresses
def get_logs
em = Array.new()
resp = JSON::parse( RestClient.get "https://api:#{@api_key}@api.mailgun.net/v3/#{@domain_name}/events",
:params => {:"event" => 'rejected OR failed' } )
unless resp['items'].length == 0
resp["items"].each { |item|
puts item["recipient"]
em.push( item["recipient"] )
}
return em
else
p " No failed or rejected recipients ...."
end
end
# Delete bounced email addresses
# @return [nil]
def del_bounces_from_list
bounces = self.get_bounces
bounces["items"].each do |item|
if ( item["code"] == '554')
puts item["address"]
a = item["address"].to_s
puts "Deleting ", a
@mg_client.delete("/members/#{a}")
end
end
end
protected
# Extracts email Adresses from server response
# @return [Array]
def extract_email_addresses(my_hash)
a = my_hash['items']
a.each{ |elem | @email_adressen.push(elem.fetch("address"))}
return @email_adressen
end
end