rockdove 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +5 -1
- data/lib/rockdove/collect_mail.rb +4 -3
- data/lib/rockdove/exchange_mail.rb +5 -1
- data/lib/rockdove/version.rb +1 -1
- data/spec/rockdove/collect_mail_spec.rb +3 -1
- data/spec/rockdove/emails/auto_reply_mail.yml +1 -0
- data/spec/rockdove/emails/forwarded_mail.yml +1 -0
- data/spec/rockdove/emails/gmail_fwd_mail.yml +1 -0
- data/spec/rockdove/emails/mail_type_text.yml +1 -0
- data/spec/rockdove/emails/mail_with_attachment.yml +1 -0
- data/spec/rockdove/emails/new_mail.yml +1 -0
- data/spec/rockdove/emails/replied_mail.yml +1 -0
- data/spec/rockdove/emails/undeliverable_mail.yml +1 -0
- data/spec/rockdove/fetch_incoming_mail_spec.rb +3 -0
- data/spec/rockdove/rockdove_shared_spec.rb +1 -1
- metadata +21 -21
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -24,4 +24,8 @@ | |
| 24 24 | 
             
            * [Feature] Email Attachments & Save to File support 
         | 
| 25 25 | 
             
            * [Fix] Paste of links under email body generates unnecessary duplication of link tags
         | 
| 26 26 | 
             
            * [Fix] Sent Via signature parsing under email body screws up Reply & forwarded mails parsing 
         | 
| 27 | 
            -
            * [Fix] Utf-8 encoding issues on email body & attachments
         | 
| 27 | 
            +
            * [Fix] Utf-8 encoding issues on email body & attachments
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            ## v0.3.1
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            * [Fix] Handles peculiar cases of Auto Replies ex: Out of Office responses
         | 
| @@ -4,6 +4,7 @@ module Rockdove | |
| 4 4 | 
             
                AUTO_REPLY = /Automatic reply/i
         | 
| 5 5 | 
             
                SPAM = /SPAM/i
         | 
| 6 6 | 
             
                FAILURE = /Delivery(.+)Failure/i
         | 
| 7 | 
            +
                AUTO_REPLIES_HEADER = "X-Auto-Response-Suppress"
         | 
| 7 8 |  | 
| 8 9 | 
             
                class << self
         | 
| 9 10 | 
             
                  attr_accessor :mail_stack, :inbox_connection
         | 
| @@ -69,7 +70,7 @@ module Rockdove | |
| 69 70 | 
             
                    Rockdove.logger.info "Rockdove deleting this mail: #{item.subject}."
         | 
| 70 71 | 
             
                    true
         | 
| 71 72 | 
             
                  else
         | 
| 72 | 
            -
                    false
         | 
| 73 | 
            +
                    item.headers.include?(AUTO_REPLIES_HEADER) ? true : false
         | 
| 73 74 | 
             
                  end
         | 
| 74 75 | 
             
                end
         | 
| 75 76 |  | 
| @@ -111,13 +112,13 @@ module Rockdove | |
| 111 112 | 
             
                  return nil
         | 
| 112 113 | 
             
                end
         | 
| 113 114 |  | 
| 114 | 
            -
                def process
         | 
| 115 | 
            -
                  @to_folder = Rockdove::Config.archive_folder
         | 
| 115 | 
            +
                def process      
         | 
| 116 116 | 
             
                  @mail_stack.each {|item| archive(item) }
         | 
| 117 117 | 
             
                  @mail_stack = nil
         | 
| 118 118 | 
             
                end
         | 
| 119 119 |  | 
| 120 120 | 
             
                def archive(item)
         | 
| 121 | 
            +
                  @to_folder = Rockdove::Config.archive_folder
         | 
| 121 122 | 
             
                  if @to_folder.blank?
         | 
| 122 123 | 
             
                    item.delete!
         | 
| 123 124 | 
             
                    Rockdove.logger.info "Rockdove delivered & deleted the mail."
         | 
| @@ -8,7 +8,7 @@ module Rockdove | |
| 8 8 |  | 
| 9 9 | 
             
                # The below specifics can be accessed via Rockdove::ExchangeMail @class_instance.
         | 
| 10 10 | 
             
                def_delegators :@mail_item, :to_recipients, :date_time_created, :date_time_sent, :from, :body, :body_type
         | 
| 11 | 
            -
                def_delegators :@mail_item, :subject, :body, :has_attachments?, :attachments, :text_only=, :text_only? | 
| 11 | 
            +
                def_delegators :@mail_item, :subject, :body, :has_attachments?, :attachments, :text_only=, :text_only?, :auto_response?
         | 
| 12 12 |  | 
| 13 13 | 
             
                attr_accessor :connection
         | 
| 14 14 |  | 
| @@ -88,5 +88,9 @@ module Rockdove | |
| 88 88 | 
             
                def retrieve_text_type
         | 
| 89 89 | 
             
                  {:base_shape=>"AllProperties", :body_type=>"Text"}
         | 
| 90 90 | 
             
                end 
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                def auto_response?
         | 
| 93 | 
            +
                  Rockdove::CollectMail.new.bounce_type_mail?(@mail_item)
         | 
| 94 | 
            +
                end
         | 
| 91 95 | 
             
              end
         | 
| 92 96 | 
             
            end
         | 
    
        data/lib/rockdove/version.rb
    CHANGED
    
    
| @@ -70,7 +70,8 @@ describe "CollectParseArchive" do | |
| 70 70 | 
             
                handle_inbox(Array(mail))
         | 
| 71 71 | 
             
                convert_from_hash(mail)
         | 
| 72 72 | 
             
                @mail_retriever.group_of_mails.should be_an_instance_of(Rockdove::RockdoveCollection)
         | 
| 73 | 
            -
                @ | 
| 73 | 
            +
                @mail_retriever.bounce_type_mail?(mail).should == true
         | 
| 74 | 
            +
                @log_stream.string.should include("Rockdove deleting this mail: Automatic reply: Out of Office Message")    
         | 
| 74 75 | 
             
              end
         | 
| 75 76 |  | 
| 76 77 | 
             
              it "should ignore mails when specified under ews_ignore_mails list" do
         | 
| @@ -87,6 +88,7 @@ describe "CollectParseArchive" do | |
| 87 88 | 
             
                handle_inbox(Array(mail))
         | 
| 88 89 | 
             
                convert_from_hash(mail)
         | 
| 89 90 | 
             
                @mail_retriever.group_of_mails.should be_an_instance_of(Rockdove::RockdoveCollection)
         | 
| 91 | 
            +
                @mail_retriever.bounce_type_mail?(mail).should == true
         | 
| 90 92 | 
             
                @log_stream.string.should include("Rockdove deleting this mail: Undeliverable: New Post")
         | 
| 91 93 | 
             
              end
         | 
| 92 94 |  | 
| @@ -6,6 +6,7 @@ parent_folder_id: | |
| 6 6 | 
             
              id: AAMkADZjZWE3MWJkLWJmZDctNGViOC1iMmFjLTgxOWE5MDk5NDg5OAAuAAAAAAD/yBU79ZvXQ6rBazqQ3s20AQBjikxovOdMSKu/0PoKjGIOAAADx+aDAAA=
         | 
| 7 7 | 
             
              change_key: AQAAAA==
         | 
| 8 8 | 
             
            subject: "Automatic reply: Out of Office Message"
         | 
| 9 | 
            +
            headers: "X-Auto-Response-Suppress"
         | 
| 9 10 | 
             
            sensitivity:
         | 
| 10 11 | 
             
              text: Normal
         | 
| 11 12 | 
             
            body_type: HTML
         | 
| @@ -45,6 +45,7 @@ body: ! "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/ht | |
| 45 45 | 
             
                LastName</font><br>\r\n<font face=\"comic sans ms,sans-serif\">"Th</font><font
         | 
| 46 46 | 
             
                face=\"comic sans ms,sans-serif\">e Journey Goes on..."<br>\r\nCatch me
         | 
| 47 47 | 
             
                <a href=\"https://socio.ewsdomain.com/u/505\" target=\"_blank\">@network</a><br>\r\n</font><br>\r\n</body>\r\n</html>\r\n"
         | 
| 48 | 
            +
            headers: ""
         | 
| 48 49 | 
             
            size:
         | 
| 49 50 | 
             
              text: '3863'
         | 
| 50 51 | 
             
            date_time_sent:
         | 
| @@ -10,6 +10,7 @@ sensitivity: | |
| 10 10 | 
             
              text: Normal
         | 
| 11 11 | 
             
            body_type: Text
         | 
| 12 12 | 
             
            body: ! "I get proper rendering as well.\r\n\r\nOn Dec 16, 2011, at 12:47 PM, Corey Donohoe<reply@reply.github.com>wrote:\r\n\r\n> Was this caching related or fixed already?  I get proper rendering here.\r\n>\r\n> \r\n>\r\n> ---\r\n> Reply to this email directly or view it on GitHub:\r\n> https://github.com/github/github/issues/2278#issuecomment-3182418"
         | 
| 13 | 
            +
            headers: ""
         | 
| 13 14 | 
             
            size:
         | 
| 14 15 | 
             
              text: '1658'
         | 
| 15 16 | 
             
            date_time_sent:
         | 
| @@ -11,6 +11,7 @@ sensitivity: | |
| 11 11 | 
             
            body_type: Text
         | 
| 12 12 | 
             
            body: ! "This is a new post\r\nThanks & Regards,\r\n  [http://etc.usf.edu/clipart/2400/2430/k_1_lg.gif]
         | 
| 13 13 | 
             
                iran lastname\r\n\"The Journey Goes on...\"\r\nCatch me @network<https://socio.ewsdomain.com/u/505>\r\n\r\n"
         | 
| 14 | 
            +
            headers: ""
         | 
| 14 15 | 
             
            size:
         | 
| 15 16 | 
             
              text: '1658'
         | 
| 16 17 | 
             
            date_time_sent:
         | 
| @@ -18,6 +18,7 @@ body: ! "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/ht | |
| 18 18 | 
             
                LastName</font><br>\r\n<font face=\"comic sans ms,sans-serif\">"Th</font><font
         | 
| 19 19 | 
             
                face=\"comic sans ms,sans-serif\">e Journey Goes on..."<br>\r\nCatch me
         | 
| 20 20 | 
             
                <a href=\"https://socio.ewsdomain.com/u/505\" target=\"_blank\">@network</a><br>\r\n</font><br>\r\n</body>\r\n</html>\r\n"
         | 
| 21 | 
            +
            headers: ""
         | 
| 21 22 | 
             
            size:
         | 
| 22 23 | 
             
              text: '1324'
         | 
| 23 24 | 
             
            date_time_sent:
         | 
| @@ -18,6 +18,7 @@ body: ! "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/ht | |
| 18 18 | 
             
                LastName</font><br>\r\n<font face=\"comic sans ms,sans-serif\">"Th</font><font
         | 
| 19 19 | 
             
                face=\"comic sans ms,sans-serif\">e Journey Goes on..."<br>\r\nCatch me
         | 
| 20 20 | 
             
                <a href=\"https://socio.ewsdomain.com/u/505\" target=\"_blank\">@network</a><br>\r\n</font><br>\r\n</body>\r\n</html>\r\n"
         | 
| 21 | 
            +
            headers: ""
         | 
| 21 22 | 
             
            size:
         | 
| 22 23 | 
             
              text: '1324'
         | 
| 23 24 | 
             
            date_time_sent:
         | 
| @@ -13,6 +13,7 @@ body: ! "This is a replied post from outlook\r\n________________________________ | |
| 13 13 | 
             
                lastname, User (ewsdomain)\r\nSent: Monday, June 25, 2012 6:26 PM\r\nTo: network\r\nSubject:
         | 
| 14 14 | 
             
                New Post\r\n\r\nHi, This is a new post\r\n\r\n--\r\nThanks & Regards,\r\n  [http://etc.usf.edu/clipart/2400/2430/k_1_lg.gif]
         | 
| 15 15 | 
             
                iran lastname\r\n\"The Journey Goes on...\"\r\nCatch me @network<https://socio.ewsdomain.com/u/505>\r\n\r\n"
         | 
| 16 | 
            +
            headers: ""
         | 
| 16 17 | 
             
            size:
         | 
| 17 18 | 
             
              text: '1658'
         | 
| 18 19 | 
             
            date_time_sent:
         | 
| @@ -18,6 +18,7 @@ body: ! "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/ht | |
| 18 18 | 
             
                LastName</font><br>\r\n<font face=\"comic sans ms,sans-serif\">"Th</font><font
         | 
| 19 19 | 
             
                face=\"comic sans ms,sans-serif\">e Journey Goes on..."<br>\r\nCatch me
         | 
| 20 20 | 
             
                <a href=\"https://socio.ewsdomain.com/u/505\" target=\"_blank\">@network</a><br>\r\n</font><br>\r\n</body>\r\n</html>\r\n"
         | 
| 21 | 
            +
            headers: "X-Auto-Response-Suppress"
         | 
| 21 22 | 
             
            size:
         | 
| 22 23 | 
             
              text: '1324'
         | 
| 23 24 | 
             
            date_time_sent:
         | 
| @@ -36,6 +36,7 @@ describe "FetchIncomingMail" do | |
| 36 36 | 
             
                match_results(result, mail)
         | 
| 37 37 | 
             
                convert_from_hash(mail)
         | 
| 38 38 | 
             
                result.from.should == "User.LastName@ewsdomain.com" 
         | 
| 39 | 
            +
                result.auto_response?.should == false
         | 
| 39 40 | 
             
              end
         | 
| 40 41 |  | 
| 41 42 | 
             
              it "is trying to fetch a new mail" do
         | 
| @@ -48,6 +49,7 @@ describe "FetchIncomingMail" do | |
| 48 49 | 
             
                match_results(result, mail)
         | 
| 49 50 | 
             
                convert_from_hash(mail)
         | 
| 50 51 | 
             
                result.from.should == "User.LastName@ewsdomain.com"  
         | 
| 52 | 
            +
                result.auto_response?.should == false
         | 
| 51 53 | 
             
              end
         | 
| 52 54 |  | 
| 53 55 | 
             
              it "is trying to fetch a new replied mail" do
         | 
| @@ -60,6 +62,7 @@ describe "FetchIncomingMail" do | |
| 60 62 | 
             
                match_results(result, mail)
         | 
| 61 63 | 
             
                convert_from_hash(mail)
         | 
| 62 64 | 
             
                result.from.should == "User.LastName@ewsdomain.com"   
         | 
| 65 | 
            +
                result.auto_response?.should == false
         | 
| 63 66 | 
             
              end
         | 
| 64 67 |  | 
| 65 68 | 
             
              def match_results(result, mail)
         | 
| @@ -3,7 +3,7 @@ require 'spec_helper.rb' | |
| 3 3 | 
             
            module Rockdove
         | 
| 4 4 | 
             
              class EWS
         | 
| 5 5 | 
             
                attr_accessor :to_recipients, :date_time_created, :date_time_sent, :from
         | 
| 6 | 
            -
                attr_accessor :subject, :body, :body_type, :attachments, :has_attachments
         | 
| 6 | 
            +
                attr_accessor :subject, :body, :body_type, :attachments, :has_attachments, :headers
         | 
| 7 7 |  | 
| 8 8 | 
             
                def id
         | 
| 9 9 | 
             
                  rand(10)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rockdove
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.1
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012- | 
| 12 | 
            +
            date: 2012-09-04 00:00:00.000000000Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rspec
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &78673310 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,10 +21,10 @@ dependencies: | |
| 21 21 | 
             
                    version: '0'
         | 
| 22 22 | 
             
              type: :development
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *78673310
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 26 | 
             
              name: guard-rspec
         | 
| 27 | 
            -
              requirement: & | 
| 27 | 
            +
              requirement: &78673040 !ruby/object:Gem::Requirement
         | 
| 28 28 | 
             
                none: false
         | 
| 29 29 | 
             
                requirements:
         | 
| 30 30 | 
             
                - - ! '>='
         | 
| @@ -32,10 +32,10 @@ dependencies: | |
| 32 32 | 
             
                    version: '0'
         | 
| 33 33 | 
             
              type: :development
         | 
| 34 34 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 35 | 
            +
              version_requirements: *78673040
         | 
| 36 36 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 37 | 
             
              name: rake
         | 
| 38 | 
            -
              requirement: & | 
| 38 | 
            +
              requirement: &78672730 !ruby/object:Gem::Requirement
         | 
| 39 39 | 
             
                none: false
         | 
| 40 40 | 
             
                requirements:
         | 
| 41 41 | 
             
                - - ~>
         | 
| @@ -43,10 +43,10 @@ dependencies: | |
| 43 43 | 
             
                    version: 0.9.2.2
         | 
| 44 44 | 
             
              type: :development
         | 
| 45 45 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements: * | 
| 46 | 
            +
              version_requirements: *78672730
         | 
| 47 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 48 | 
             
              name: simplecov
         | 
| 49 | 
            -
              requirement: & | 
| 49 | 
            +
              requirement: &78672480 !ruby/object:Gem::Requirement
         | 
| 50 50 | 
             
                none: false
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ! '>='
         | 
| @@ -54,10 +54,10 @@ dependencies: | |
| 54 54 | 
             
                    version: '0'
         | 
| 55 55 | 
             
              type: :development
         | 
| 56 56 | 
             
              prerelease: false
         | 
| 57 | 
            -
              version_requirements: * | 
| 57 | 
            +
              version_requirements: *78672480
         | 
| 58 58 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 59 59 | 
             
              name: raad
         | 
| 60 | 
            -
              requirement: & | 
| 60 | 
            +
              requirement: &78672220 !ruby/object:Gem::Requirement
         | 
| 61 61 | 
             
                none: false
         | 
| 62 62 | 
             
                requirements:
         | 
| 63 63 | 
             
                - - ! '>='
         | 
| @@ -65,10 +65,10 @@ dependencies: | |
| 65 65 | 
             
                    version: '0'
         | 
| 66 66 | 
             
              type: :runtime
         | 
| 67 67 | 
             
              prerelease: false
         | 
| 68 | 
            -
              version_requirements: * | 
| 68 | 
            +
              version_requirements: *78672220
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: viewpoint
         | 
| 71 | 
            -
              requirement: & | 
| 71 | 
            +
              requirement: &78671910 !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                none: false
         | 
| 73 73 | 
             
                requirements:
         | 
| 74 74 | 
             
                - - =
         | 
| @@ -76,10 +76,10 @@ dependencies: | |
| 76 76 | 
             
                    version: 0.1.26
         | 
| 77 77 | 
             
              type: :runtime
         | 
| 78 78 | 
             
              prerelease: false
         | 
| 79 | 
            -
              version_requirements: * | 
| 79 | 
            +
              version_requirements: *78671910
         | 
| 80 80 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 81 81 | 
             
              name: email_reply_parser
         | 
| 82 | 
            -
              requirement: & | 
| 82 | 
            +
              requirement: &78671640 !ruby/object:Gem::Requirement
         | 
| 83 83 | 
             
                none: false
         | 
| 84 84 | 
             
                requirements:
         | 
| 85 85 | 
             
                - - ! '>='
         | 
| @@ -87,10 +87,10 @@ dependencies: | |
| 87 87 | 
             
                    version: '0'
         | 
| 88 88 | 
             
              type: :runtime
         | 
| 89 89 | 
             
              prerelease: false
         | 
| 90 | 
            -
              version_requirements: * | 
| 90 | 
            +
              version_requirements: *78671640
         | 
| 91 91 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 92 92 | 
             
              name: logger
         | 
| 93 | 
            -
              requirement: & | 
| 93 | 
            +
              requirement: &78671350 !ruby/object:Gem::Requirement
         | 
| 94 94 | 
             
                none: false
         | 
| 95 95 | 
             
                requirements:
         | 
| 96 96 | 
             
                - - ! '>='
         | 
| @@ -98,7 +98,7 @@ dependencies: | |
| 98 98 | 
             
                    version: '0'
         | 
| 99 99 | 
             
              type: :runtime
         | 
| 100 100 | 
             
              prerelease: false
         | 
| 101 | 
            -
              version_requirements: * | 
| 101 | 
            +
              version_requirements: *78671350
         | 
| 102 102 | 
             
            description: Incoming mail processing daemon for Exchange Web Services (EWS). This
         | 
| 103 103 | 
             
              is the Ruby Gem that does fetching, parsing and watching the exchange mail box for
         | 
| 104 104 | 
             
              further processing.
         | 
| @@ -155,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 155 155 | 
             
                  version: '0'
         | 
| 156 156 | 
             
                  segments:
         | 
| 157 157 | 
             
                  - 0
         | 
| 158 | 
            -
                  hash:  | 
| 158 | 
            +
                  hash: -739065965
         | 
| 159 159 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 160 160 | 
             
              none: false
         | 
| 161 161 | 
             
              requirements:
         | 
| @@ -164,10 +164,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 164 164 | 
             
                  version: '0'
         | 
| 165 165 | 
             
                  segments:
         | 
| 166 166 | 
             
                  - 0
         | 
| 167 | 
            -
                  hash:  | 
| 167 | 
            +
                  hash: -739065965
         | 
| 168 168 | 
             
            requirements: []
         | 
| 169 169 | 
             
            rubyforge_project: rockdove
         | 
| 170 | 
            -
            rubygems_version: 1.8. | 
| 170 | 
            +
            rubygems_version: 1.8.10
         | 
| 171 171 | 
             
            signing_key: 
         | 
| 172 172 | 
             
            specification_version: 3
         | 
| 173 173 | 
             
            summary: Incoming mail processing daemon for Exchange Web Services (EWS)
         |