<?xml version="1.0" encoding="utf-8"?>
<!--
Purpose: This include file configures Email delivery service API.
-->
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <exm>
            <eds>
                <!--  HTTP CLIENT FACTORY
                    Creates a http client to request web resources.
                -->
                <httpClientFactory type="Sitecore.EDS.Providers.SparkPost.Net.Http.HttpClientFactory, Sitecore.EDS.Providers.SparkPost" singleInstance="true" />

                <!-- PROXY SETTINGS
                    Proxy settings for SMTP and POP3 clients 
                -->
                <proxySettings type="Sitecore.EDS.Core.Net.ProxySettings, Sitecore.EDS.Core" singleInstance="true">
                    <enabled>false</enabled>
                </proxySettings>

                <!-- SMTP SETTINGS OBJECT
                    Creates SMTP settings class.
                 -->
                <smtpSettings type="Sitecore.EDS.Providers.SparkPost.Smtp.SmtpSettings, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <server>sitecore.smtp.e.sparkpost.com</server>
                    <port>587</port>
                    <userName>sitecore</userName>
                    <startTls>true</startTls>
                    <proxySettings ref="exm/eds/proxySettings" />
                </smtpSettings>
                
                <!-- RETRY OPERATION HELPER 
                     A helper class that allows a specified operation to be retried a configurable number of times. A linear delay is added between 
                     each retry: delay*retryAttempt
                -->
                <retry type="Sitecore.ExM.Framework.Helpers.Retry, Sitecore.ExM.Framework" singleInstance="true">
                    <param desc="delay">1000</param>
                    <param desc="retryCount">3</param>
                </retry>
                
                <!-- EDS SERVICE
                    Obtains the SparkPost SMTP and API credentials.
                -->
                <edsService type="Sitecore.EDS.Providers.SparkPost.Services.EdsService, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param ref="exm/eds/httpClientFactory" />
                    <param desc="apiUrl">https://sparkpost.cloud.sitecore.net</param>
                    <param ref="exm/eds/retry" />
                    <param ref="exmLogger" />
                    <retryableHttpErrorCodes hint="list:AddRetryableHttpStatusCode">
                        <retryableHttpErrorCode>401</retryableHttpErrorCode>
                        <retryableHttpErrorCode>403</retryableHttpErrorCode>
                        <retryableHttpErrorCode>500</retryableHttpErrorCode>
                        <retryableHttpErrorCode>502</retryableHttpErrorCode>
                        <retryableHttpErrorCode>503</retryableHttpErrorCode>
                    </retryableHttpErrorCodes>
                </edsService>

                <!-- SparkPost CONFIGURATION
                    Creates a configuration store.
                -->
                <configurationStore type="Sitecore.EDS.Providers.SparkPost.Configuration.ConfigurationStore, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param ref="exm/eds/smtpSettings" />
                    <param ref="exm/eds/edsService" />
                    <apiUrl>https://sitecore.api.e.sparkpost.com/</apiUrl>
                    <subscriptionApiUrl>https://apps.sitecore.net</subscriptionApiUrl>
                </configurationStore>

                <!-- CONNECTION POOL SETTINGS 
                    Defines the connection pool settings.
                -->
                <connectionPoolSettings type="Sitecore.EDS.Core.Net.Smtp.ConnectionPoolSettings, Sitecore.EDS.Core" singleInstance="true">
                    <maxPoolSize>10</maxPoolSize>
                    <delayBetweenConnectionRetries>00:00:10.000</delayBetweenConnectionRetries>
                    <maxConnectionWaitTime>00:00:30.000</maxConnectionWaitTime>
                    <maxConnectionIdleTime>00:10:00.000</maxConnectionIdleTime>
                    <maxConnectionRetries>3</maxConnectionRetries>
                </connectionPoolSettings>

                <!-- CONNECTION POOL MANAGER
                    Creates a manager for connection pooling.
                -->
                <connectionPoolManager type="Sitecore.EDS.Providers.SparkPost.Dispatch.ConnectionPoolManager, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param ref="exm/eds/configurationStore" />
                    <param ref="exm/eds/connectionPoolSettings" />
                </connectionPoolManager>

                <!-- SUBSCRIPTION CLIENT
                    Creates a client for subscriontion information requests
                -->                
                <subscriptionClient type="Sitecore.EDS.Providers.SparkPost.Subscription.SubscriptionClient, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param ref="exm/eds/httpClientFactory" />
                    <param ref="exm/eds/configurationStore" />
                    <param ref="exmLogger" />
                    <param ref="exm/eds/retry" />
                    <param desc="credentialsType">nexus</param>
                    <param desc="sparkpostApplicationId">b5fc350d-cd68-406e-b7a4-2dcf5adfcc4d</param>
                    <retryableHttpErrorCodes hint="list:AddRetryableHttpStatusCode">
                        <retryableHttpErrorCode>429</retryableHttpErrorCode>
                        <retryableHttpErrorCode>500</retryableHttpErrorCode>
                        <retryableHttpErrorCode>503</retryableHttpErrorCode>
                    </retryableHttpErrorCodes>
                </subscriptionClient>

                <!-- SPARKPOST API CLIENT 
                    Creates a client for SparkPost Api requests.
                -->
                <apiClient type="Sitecore.EDS.Providers.SparkPost.Client.SparkPostApiClient, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param ref="exm/eds/httpClientFactory" />
                    <param ref="exm/eds/configurationStore" />
                    <param ref="exmLogger" />
                    <param ref="exm/eds/retry" />
                    <retryableHttpErrorCodes hint="list:AddRetryableHttpStatusCode">
                        <retryableHttpErrorCode>429</retryableHttpErrorCode>
                        <retryableHttpErrorCode>500</retryableHttpErrorCode>
                        <retryableHttpErrorCode>503</retryableHttpErrorCode>
                    </retryableHttpErrorCodes>
                    <bounceEventNames hint="list:AddBounceEventName">
                        <bounceEventName>bounce</bounceEventName>
                        <bounceEventName>policy_rejection</bounceEventName>
                        <bounceEventName>generation_failure</bounceEventName>
                        <bounceEventName>generation_rejection</bounceEventName>
                    </bounceEventNames>
                    <spamComplaintEventNames hint="list:AddSpamComplaintEventName">
                        <spamComplaintEventName>spam_complaint</spamComplaintEventName>
                    </spamComplaintEventNames>
                    <bounceEventClasses hint="list:AddBounceEventClass">
                      <!--<bounceEventClass>1</bounceEventClass>-->
                    </bounceEventClasses>
                    <spamComplaintEventClasses hint="list:AddSpamComplaintEventClass">
                      <!--<spamComplaintEventClass>50</spamComplaintEventClass>-->
                    </spamComplaintEventClasses>
                </apiClient>

                <!-- Connection String Configuration 
                    Provides the connection string for the data storage.
                -->
                <connectionStringConfiguration type="Sitecore.EDS.Providers.SparkPost.Data.ConnectionStringConfiguration, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param desc="connectionStringName">exm.master</param>
                </connectionStringConfiguration>

                <!-- Data context factory 
                    Creates a data context for LINQ to SQL 
                -->
                <dataContextFactory type="Sitecore.EDS.Providers.SparkPost.Data.DataContextFactory, Sitecore.EDS.Providers.SparkPost" singleInstance="true" />

                <!-- SUPPRESSIONS DATA PROVIDER
                    Provides access to the suppression data storage.
                -->
                <suppressionDataProvider type="Sitecore.EDS.Providers.SparkPost.Data.SuppressionDataProvider, Sitecore.EDS.Providers.SparkPost" singleInstance="true">
                    <param ref="exm/eds/connectionStringConfiguration" />
                    <param ref="exm/eds/dataContextFactory" />
                </suppressionDataProvider>

                <!-- EMAIL DISPATCH PROVIDER
                    Provides email dispatching.
                 -->
                <dispatchProvider defaultProvider="default">
                    <providers>
                        <clear />
                        <add name="default" type="Sitecore.EDS.Providers.SparkPost.Dispatch.DispatchProvider, Sitecore.EDS.Providers.SparkPost">
                            <param ref="exm/eds/connectionPoolManager" />
                            <param ref="exm/eds/environmentIdentifier" />
                            <param ref="exm/eds/configurationStore" />
                            <param desc="returnPath">bounce@spe.sitecoremail.com</param>
                        </add>
                    </providers>
                </dispatchProvider>

                <!-- SENDER PROVIDER
                    Provides approved senders list.
                -->
                <senderProvider defaultProvider="default">
                    <providers>
                        <clear />
                        <add name="default" type="Sitecore.EDS.Providers.SparkPost.Senders.SenderProvider, Sitecore.EDS.Providers.SparkPost">
                            <param ref="exm/eds/apiClient" />
                        </add>
                    </providers>
                </senderProvider>

                <!-- BOUNCED MESSAGES PROVIDER
                    Handles the reported bounced messages.
                 -->
                <bounceProvider defaultProvider="default">
                    <providers>
                        <clear />
                        <add name="default" type="Sitecore.EDS.Core.Reporting.DeliveryReportProvider`1[[Sitecore.EDS.Core.Reporting.Bounce, Sitecore.EDS.Core]], Sitecore.EDS.Core" />
                    </providers>
                </bounceProvider>

                <!-- SPAM COMPLAINTS PROVIDER
                    Handles the reported spam complaints.
                -->
                <complaintProvider defaultProvider="default">
                    <providers>
                        <clear />
                        <add name="default" type="Sitecore.EDS.Core.Reporting.DeliveryReportProvider`1[[Sitecore.EDS.Core.Reporting.Complaint, Sitecore.EDS.Core]], Sitecore.EDS.Core" />
                    </providers>
                </complaintProvider>

                <!-- SUPPRESSION PROVIDER
                    Handles the suppressed emails.
                -->
                <suppressionProvider defaultProvider="default">
                    <providers>
                        <clear />
                        <add name="default" type="Sitecore.EDS.Providers.SparkPost.Suppressions.SuppressionProvider, Sitecore.EDS.Providers.SparkPost">
                            <param ref="exm/eds/suppressionDataProvider" />
                        </add>
                    </providers>
                </suppressionProvider>
            </eds>
        </exm>
    </sitecore>
</configuration>