Sha256: 9529f6cb2a9704fd3fed35ffc3d81105b5159068fd6d5ffaac2d8ef8b1b527d9
Contents?: true
Size: 1.88 KB
Versions: 4
Compression:
Stored size: 1.88 KB
Contents
class IncomingMail < ActionMailer::Base class <<self def process! if $mail.config Fetcher.create($mail.config[:imap]).fetch end end end def receive(mail) return unless body = get_body(mail) emails = parse_emails(mail.subject, body.body) numbers = parse_numbers(mail.subject, body.body) start = parse_start(mail.subject, body.body) stop = parse_stop(mail.subject, body.body) if mail.from[0] && email = UserEmail.find_by_email(mail.from[0]) user = email.user else return end if user emails.each do |email| user.add_email!(email, true) end numbers.each do |number| user.spend!(number) end email.activate! if start email.deactivate! if stop end [ emails, numbers, start, stop ] end private def get_body(mail) if mail.parts.empty? mail else mail.parts.select { |part| part['content-type'].content_type == 'text/plain' }.first end end def parse_emails(*args) args.collect { |text| text = text_upto(text, /\s/) text.scan(/\S+@\S+\.\S+/) }.flatten end def parse_numbers(*args) args.collect { |text| text = text_upto(text, /[^-+\d\.\s]/) numbers = text.scan(/([-+]*)(\d+\.*\d*)/) numbers.collect do |number| operator, number = number (operator == '+' ? -1 : 1) * number.to_f end }.flatten end def parse_start(*args) args.collect { |text| text.strip[0..4].downcase == 'start' }.include?(true) end def parse_stop(*args) args.collect { |text| text.strip[0..3].downcase == 'stop' }.include?(true) end def text_upto(text, regex) first_instance = text.index(regex) return '' if first_instance == 0 if first_instance text[0..first_instance-1] else text end end end
Version data entries
4 entries across 4 versions & 2 rubygems
Version | Path |
---|---|
winton-sum-0.1.0 | lib/sum/model/incoming_mail.rb |
winton-sum-0.1.1 | lib/sum/model/incoming_mail.rb |
sum-0.1.2 | lib/sum/model/incoming_mail.rb |
sum-0.1.1 | lib/sum/model/incoming_mail.rb |