Skip to content

Commit b06b8fc

Browse files
committed
allow fetching email by envelope or body
1 parent 5490807 commit b06b8fc

37 files changed

+124
-15
lines changed

Gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
# A sample Gemfile
24
source 'https://rubygems.org'
35

Rakefile

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'bundler/gem_tasks'
24
require 'rspec/core/rake_task'
35
RSpec::Core::RakeTask.new(:default)

lib/mailhandler.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative 'mailhandler/sender'
24
require_relative 'mailhandler/receiver'
35

lib/mailhandler/errors.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module MailHandler
24
# base error
35
class Error < StandardError

lib/mailhandler/receiver.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative 'receiving/folder'
24
require_relative 'receiving/imap'
35
require_relative 'receiving/observer'

lib/mailhandler/receiving/base.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative '../errors'
24

35
module MailHandler

lib/mailhandler/receiving/filelist/base.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'fileutils'
24

35
# Base filtering class, which is used for reading list of all files based on passed pattern.

lib/mailhandler/receiving/filelist/filter/base.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative '../base'
24
require_relative '../../../errors'
35

lib/mailhandler/receiving/filelist/filter/email.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'mail'
24
require_relative 'base'
35

lib/mailhandler/receiving/folder.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'mail'
24
require_relative 'base.rb'
35
require_relative '../errors'

lib/mailhandler/receiving/imap.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'mail'
24
require_relative 'base.rb'
35
require_relative '../errors'
@@ -92,6 +94,7 @@ def reconnect
9294
archive
9395
by_recipient
9496
fast_check
97+
fetch_type
9598
].freeze
9699

97100
RETRY_ON_ERROR_COUNT = 3
@@ -118,7 +121,7 @@ def imap_search(retry_count, options)
118121
count: search_options[:count],
119122
order: :desc,
120123
keys: imap_filter_keys(options),
121-
delete_after_find: options[:archive])
124+
delete_after_find: options[:archive], fetch_type: options[:fetch_type])
122125
result.is_a?(Array) ? result : [result]
123126

124127
# Silently ignore IMAP search errors, [RETRY_ON_ERROR_COUNT] times

lib/mailhandler/receiving/mail.rb

+43-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
# frozen_string_literal: true
2+
13
module Mail
24
# IMAP class patch to better manage connection and search of emails
35
class IMAP
46
attr_accessor :imap_connection
57

6-
# fetch emails with different flag, to make it work with icloud
7-
FETCH_EMAIL_FLAG = "BODY[]" #"RFC822"
8-
98
def find_emails(options = {}, &block) # rubocop:disable all
109
options = validate_options(options)
1110
options[:read_only] ? imap_connection.examine(options[:mailbox]) : imap_connection.select(options[:mailbox])
@@ -19,8 +18,7 @@ def find_emails(options = {}, &block) # rubocop:disable all
1918
if block_given?
2019
uids.each do |uid|
2120
uid = options[:uid].to_i unless options[:uid].nil?
22-
fetchdata = imap_connection.uid_fetch(uid, ['RFC822'])[0]
23-
new_message = Mail.new(fetchdata.attr['RFC822'])
21+
new_message = retrieve_email_content(uid, options[:fetch_type])
2422
new_message.mark_for_delete = true if options[:delete_after_find]
2523

2624
if block.arity == 3
@@ -39,8 +37,7 @@ def find_emails(options = {}, &block) # rubocop:disable all
3937

4038
uids.each do |uid|
4139
uid = options[:uid].to_i unless options[:uid].nil?
42-
fetchdata = imap_connection.uid_fetch(uid, [FETCH_EMAIL_FLAG])[0]
43-
emails << Mail.new(fetchdata.attr[FETCH_EMAIL_FLAG])
40+
emails << retrieve_email_content(uid, options[:fetch_type])
4441
imap_connection.uid_store(uid, '+FLAGS', [Net::IMAP::DELETED]) if options[:delete_after_find]
4542
break unless options[:uid].nil?
4643
end
@@ -66,5 +63,44 @@ def connect(_config = Mail::Configuration.instance) # rubocop:disable all
6663
def disconnect
6764
imap_connection.disconnect if defined?(imap_connection) && imap_connection && !imap_connection.disconnected?
6865
end
66+
67+
private
68+
69+
# fetch emails with different flag
70+
# to make it work with icloud
71+
FETCH_FLAG = {
72+
body: 'BODY[]',
73+
rfc: 'RFC822',
74+
envelope: 'ENVELOPE'
75+
}.freeze
76+
77+
def retrieve_email_content(uid, flag_type = :body)
78+
case flag_type
79+
when :body
80+
retrieve_email_content_by_body(uid)
81+
when :envelope
82+
retrieve_email_content_by_envelope(uid)
83+
84+
else
85+
retrieve_email_content_by_body(uid)
86+
end
87+
end
88+
89+
def retrieve_email_content_by_body(uid)
90+
fetchdata = retrieve_fetch_type_data(FETCH_FLAG[:body], uid)
91+
Mail.new(fetchdata)
92+
end
93+
94+
def retrieve_email_content_by_envelope(uid)
95+
fetchdata = retrieve_fetch_type_data(FETCH_FLAG[:envelope], uid)
96+
mail = Mail.new
97+
mail.subject = fetchdata.subject
98+
mail
99+
end
100+
101+
def retrieve_fetch_type_data(fetch_type, uid)
102+
fetchdata = imap_connection.uid_fetch(uid, fetch_type)[0]
103+
fetchdata.attr[fetch_type]
104+
end
69105
end
70106
end

lib/mailhandler/receiving/notification/console.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module MailHandler
24
module Receiving
35
module Notification

lib/mailhandler/receiving/notification/email.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative 'email/content'
24
require_relative 'email/states'
35
require_relative '../../errors'

lib/mailhandler/receiving/notification/email/content.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'mail'
24

35
module MailHandler

lib/mailhandler/receiving/notification/email/states.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative '../email'
24
require_relative '../../../errors'
35

lib/mailhandler/receiving/observer.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module MailHandler
24
module Receiving
35
# observer handler

lib/mailhandler/sender.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative 'sending/smtp'
24
require_relative 'sending/api'
35
require_relative 'sending/api_batch'

lib/mailhandler/sending/api.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'mail'
24
require 'postmark'
35
require_relative 'base.rb'

lib/mailhandler/sending/api_batch.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative 'api.rb'
24
require_relative '../errors'
35

lib/mailhandler/sending/base.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require_relative '../errors'
24

35
module MailHandler

lib/mailhandler/sending/smtp.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'net/imap'
24
require_relative 'base'
35

lib/mailhandler/version.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module MailHandler
2-
VERSION = '1.0.40'.freeze
4+
VERSION = '1.0.41'.freeze
35
end

mailhandler.gemspec

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
lib = File.expand_path('lib', __dir__)
24
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
35
require 'mailhandler/version'

spec/spec_helper.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'rspec'
24
require 'mail'
35
require 'postmark'

spec/unit/mailhandler/receiver_spec.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiver do
@@ -57,7 +59,7 @@
5759
end
5860
end
5961

60-
context '.search' do
62+
describe '.search' do
6163
let(:checker) do
6264
checker = instance_double('Checker')
6365

spec/unit/mailhandler/receiving/base_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiving::Checker do

spec/unit/mailhandler/receiving/folder_spec.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiving::FolderChecker do
@@ -10,7 +12,7 @@
1012
context 'search emails' do
1113
let(:checker) { described_class.new(data_folder, data_folder) }
1214

13-
context '.find email' do
15+
describe '.find email' do
1416
context 'search options' do
1517
it 'by multiple search options' do
1618
time = Time.now

spec/unit/mailhandler/receiving/imap_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiving::IMAPChecker do

spec/unit/mailhandler/receiving/notification/console_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiving::Notification::Console do

spec/unit/mailhandler/receiving/notification/email/content_spec.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiving::Notification::EmailContent do
@@ -7,7 +9,7 @@
79
let(:from) { '[email protected]' }
810
let(:options) { { test: 'test' } }
911

10-
context '.email_received' do
12+
describe '.email_received' do
1113
it 'create email' do
1214
expect(notification_email_content.retrieve(:received, options, 60, from, to)).to be_kind_of Mail::Message
1315
end
@@ -43,7 +45,7 @@
4345
end
4446
end
4547

46-
context '.email_delayed' do
48+
describe '.email_delayed' do
4749
it 'sender' do
4850
expect(notification_email_content.retrieve(:delayed, options, 60, from, to)[:from].to_s).to eq from
4951
end

spec/unit/mailhandler/receiving/notification/email_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Receiving::Notification::Email do

spec/unit/mailhandler/sender_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Sender do

spec/unit/mailhandler/sending/sender_api_batch_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Sending::PostmarkBatchAPISender do

spec/unit/mailhandler/sending/sender_api_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Sending::PostmarkAPISender do

spec/unit/mailhandler/sending/sender_smtp_spec.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Sending::SMTPSender do
46
subject(:smtp_sender) { described_class }
57

6-
context '.send' do
8+
describe '.send' do
79
context 'invalid' do
810
it 'incorrect mail type' do
911
sender = smtp_sender.new
@@ -12,7 +14,7 @@
1214
end
1315
end
1416

15-
context '.new' do
17+
describe '.new' do
1618
context 'smtp timeouts' do
1719
it 'open' do
1820
sender = smtp_sender.new

spec/unit/mailhandler_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
require 'spec_helper'
24

35
describe MailHandler::Handler do

0 commit comments

Comments
 (0)