This guide presents the details needed to use the capabilities of ExactTarget for AppExchange via a SOAP (Simple Object Access Protocol) web service in your business application.
Page ID: 13401
To begin to use these capabilities, your ExactTarget account must be fully configured for ExactTarget for AppExchange. .NET 2.0 (C#) is used as the language for code samples.
The ExactTarget for AppExchange API enables email to be sent to Salesforce.com reports, campaigns, contacts, or leads from ExactTarget via a SOAP web service. Opportunities to leverage ExactTarget for AppExchange's robust email sending and tracking capabilities together with Salesforce data in your business processes allow your business to access and record previously unreachable customer touch points.
The ExactTarget for AppExchange API web service supports many business scenarios. The architecture of the web service allows many requests for ExactTarget for AppExchange send in a single call. Additionally, a send can consist of many Salesforce entities providing support for sophisticated business processes and marketing workflows.
Some scenarios that would benefit from this feature follow:
In order to access the ExactTarget for AppExchange web service, you must first contact your ExactTarget account manager to configure your account and create a service user. A service user is a combination of user permissions and user settings. A user in your account is given permissions to access the web service and has the API User setting checked. Users who have the API User setting checked are not subject to the account's security settings.
Your development environment should access the ExactTarget for Appexchange WSDL file at https://etappx.exacttarget.com/etframeworksf.wsdl.
ExactTarget maintains two web service addresses for use with the ExactTarget for AppExchange SOAP web service. Use the correct address for your ExactTarget instance, and contact your ExactTarget representative if you have any questions regarding which WSDL file you should use.
The ExactTarget for Appexchange WSDL service is located at https://etappx.exacttarget.com/Service.asmx. If you use the S4 instance, use the address https://etappx.s4.exacttarget.com/Service.asmx instead.
These files define the objects and calls exposed to SOAP clients to interact with ExactTarget.
Authenticating to the ExactTarget Integration Framework requires passing a WS-Security 1.0 security token in the SOAP header.
Development Platform Support For WS-Security 1.0*
| Platform | Library/Module |
| C++ | Axis2/C |
| Java | Axis2, XFire |
| .NET | WSE 3.0 |
| Perl | WSRF::Lite |
| PHP | soap-wsse.php, Axis2, Instantsvc |
| Python | pyGridWare |
| Ruby | wss4r |
*This list is for information only and does not represent supported platforms.
This section provides code samples and guidance for developing against the ExactTarget for AppExchange API.
This section presents a sample C# application to show the five required steps for sending a ExactTarget for AppExchange email. This example demonstrates the invocation and subsequent handling of API calls.
The result of all calls resulting in a outbound email are:
This example uses a Create call to send a pre-existing ExactTarget email to recipients who reside on a Salesforce.com report:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Configuration;
using Microsoft.Web.Services3.Design;
using Microsoft.Web.Services3.Security.Tokens;
using et.integrationframework.sf.etForAppX;
namespace et.integrationframework.sf.unittests
{
public class SalesforceSendTest
{
string status = null; // overall status flag
string requestID = null;
/// <summary>
/// Sends a ExactTarget for AppExchange email
/// </summary>
public void SendSalesforceEmail()
{
// 1. Initialize the web service proxy
PartnerAPIWse etForAppx = new PartnerAPIWse();
// 1a. Set the username/password. This is using the Username token of WS-Security 1.0
UsernameTokenProvider utp = new UsernameTokenProvider(<username>, <password>);
etForAppx.SetClientCredential<UsernameToken>(utp.GetToken());
// 1b. Declare the policy
policy = new Policy(new UsernameOverTransportAssertion());
etForAppx.SetPolicy(policy);
// 2. Specify the email to be sent
Email email = new Email();
email.ID = 3079342; // The ExactTarget ID of the email (PartnerKey can also be used)
email.IDSpecified = true;
// 3. Specify the report to be receive the email
Target sfReport = new Target();
sfReport.ObjectID = "00O60000001PWEy";
sfReport.ObjectType = ObjectTypes.Report;
// 4. Create a SalesforceSend object
SalesforceSend sfs = new SalesforceSend();
sfs.Email = email;
sfs.Targets = new Target[] { sfReport };
sfs.FromName = "From Name";
sfs.FromAddress = "fromaddress@yourdomain.com";
// 5. Create a SalesforceSend object
CreateResult[] results = etForAppx.Create(new CreateOptions(), new APIObject[] { sfs }, out requestID, out status);
// 6. Print out overall results
Console.WriteLine(string.Format("Overall result: {0}. RequestID: {1}. Result Message: {2}", status, requestID, results[0].StatusMessage));
}
}
} The sample code below demonstrates how to connect your PHP development environment to the WSDL file.
<?php
require('soap-wsse.php');
class ExactTargetSoapClient extends SoapClient {
public $username = NULL;
public $password = NULL;
function __doRequest($request, $location, $saction, $version) {
$doc = new DOMDocument();
$doc->loadXML($request);
$objWSSE = new WSSESoap($doc);
$objWSSE->addUserToken($this->username, $this->password, FALSE);
return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
}
}
class ExactTarget_APIObject {
public $Client; // ExactTarget_ClientID
public $PartnerKey; // string
public $PartnerProperties; // ExactTarget_APIProperty
public $CreatedDate; // dateTime
public $ModifiedDate; // dateTime
public $ID; // int
public $ObjectID; // string
public $CustomerKey; // string
public $Owner; // ExactTarget_Owner
public $CorrelationID; // string
}
class ExactTarget_ClientID {
public $ClientID; // int
public $ID; // int
public $PartnerClientKey; // string
public $UserID; // int
public $PartnerUserKey; // string
public $CreatedBy; // int
public $ModifiedBy; // int
public $EnterpriseID; // long
}
class ExactTarget_APIProperty {
public $Name; // string
public $Value; // string
}
class ExactTarget_Owner {
public $Client; // ExactTarget_ClientID
public $FromName; // string
public $FromAddress; // string
}
class ExactTarget_AsyncResponseType {
const None='None';
const email='email';
const FTP='FTP';
const HTTPPost='HTTPPost';
}
class ExactTarget_AsyncResponse {
public $ResponseType; // ExactTarget_AsyncResponseType
public $ResponseAddress; // string
public $RespondWhen; // ExactTarget_RespondWhen
public $IncludeResults; // boolean
public $IncludeObjects; // boolean
public $OnlyIncludeBase; // boolean
}
class ExactTarget_ContainerID {
public $APIObject; // ExactTarget_APIObject
}
class ExactTarget_Request {
}
class ExactTarget_Result {
public $StatusCode; // string
public $StatusMessage; // string
public $OrdinalID; // int
public $ErrorCode; // int
public $RequestID; // string
public $ConversationID; // string
public $OverallStatusCode; // string
public $RequestType; // ExactTarget_RequestType
public $ResultType; // string
public $ResultDetailXML; // string
}
class ExactTarget_Priority {
const Low='Low';
const Medium='Medium';
const High='High';
}
class ExactTarget_Options {
public $Client; // ExactTarget_ClientID
public $SendResponseTo; // ExactTarget_AsyncResponse
public $SaveOptions; // ExactTarget_SaveOptions
public $Priority; // byte
public $ConversationID; // string
public $SequenceCode; // int
public $CallsInConversation; // int
public $ScheduledTime; // dateTime
public $RequestType; // ExactTarget_RequestType
public $QueuePriority; // ExactTarget_Priority
}
class ExactTarget_SaveOptions {
public $SaveOption; // ExactTarget_SaveOption
}
class ExactTarget_TaskResult {
public $StatusCode; // string
public $StatusMessage; // string
public $OrdinalID; // int
public $ErrorCode; // int
public $ID; // string
public $InteractionObjectID; // string
}
class ExactTarget_RequestType {
const Synchronous='Synchronous';
const Asynchronous='Asynchronous';
}
class ExactTarget_RespondWhen {
const Never='Never';
const OnError='OnError';
const Always='Always';
const OnConversationError='OnConversationError';
const OnConversationComplete='OnConversationComplete';
const OnCallComplete='OnCallComplete';
}
class ExactTarget_SaveOption {
public $PropertyName; // string
public $SaveAction; // ExactTarget_SaveAction
}
class ExactTarget_SaveAction {
const AddOnly='AddOnly';
const _Default='Default';
const Nothing='Nothing';
const UpdateAdd='UpdateAdd';
const UpdateOnly='UpdateOnly';
const Delete='Delete';
}
class ExactTarget_CreateRequest {
public $Options; // ExactTarget_CreateOptions
public $Objects; // ExactTarget_APIObject
}
class ExactTarget_CreateResult {
public $NewID; // int
public $NewObjectID; // string
public $PartnerKey; // string
public $Object; // ExactTarget_APIObject
public $CreateResults; // ExactTarget_CreateResult
public $ParentPropertyName; // string
}
class ExactTarget_CreateResponse {
public $Results; // ExactTarget_CreateResult
public $RequestID; // string
public $OverallStatus; // string
}
class ExactTarget_CreateOptions {
public $Container; // ExactTarget_ContainerID
}
class ExactTarget_UpdateOptions {
public $Container; // ExactTarget_ContainerID
public $Action; // string
}
class ExactTarget_UpdateRequest {
public $Options; // ExactTarget_UpdateOptions
public $Objects; // ExactTarget_APIObject
}
class ExactTarget_UpdateResult {
public $Object; // ExactTarget_APIObject
public $UpdateResults; // ExactTarget_UpdateResult
public $ParentPropertyName; // string
}
class ExactTarget_UpdateResponse {
public $Results; // ExactTarget_UpdateResult
public $RequestID; // string
public $OverallStatus; // string
}
class ExactTarget_Locale {
public $LocaleCode; // string
}
class ExactTarget_Email {
public $Name; // string
public $Folder; // string
public $CategoryID; // int
public $HTMLBody; // string
public $TextBody; // string
public $ContentAreas; // ExactTarget_ContentArea
public $Subject; // string
public $IsActive; // boolean
public $IsHTMLPaste; // boolean
public $ClonedFromID; // int
public $Status; // string
public $EmailType; // string
public $CharacterSet; // string
public $HasDynamicSubjectLine; // boolean
public $ContentCheckStatus; // string
}
class ExactTarget_ContentArea {
public $Key; // string
public $Content; // string
public $IsBlank; // boolean
public $CategoryID; // int
public $Name; // string
public $Layout; // ExactTarget_LayoutType
public $IsDynamicContent; // boolean
public $IsSurvey; // boolean
}
class ExactTarget_LayoutType {
const HTMLWrapped='HTMLWrapped';
const RawText='RawText';
const SMS='SMS';
}
class ExactTarget_Subscriber {
public $EmailAddress; // string
public $Attributes; // ExactTarget_Attribute
public $SubscriberKey; // string
public $UnsubscribedDate; // dateTime
public $Status; // ExactTarget_SubscriberStatus
public $PartnerType; // string
public $EmailTypePreference; // ExactTarget_EmailType
public $Lists; // ExactTarget_SubscriberList
public $GlobalUnsubscribeCategory; // ExactTarget_GlobalUnsubscribeCategory
public $SubscriberTypeDefinition; // ExactTarget_SubscriberTypeDefinition
public $Addresses; // ExactTarget_Addresses
public $PrimarySMSAddress; // ExactTarget_SMSAddress
public $PrimarySMSPublicationStatus; // ExactTarget_SubscriberAddressStatus
public $PrimaryEmailAddress; // ExactTarget_EmailAddress
public $Locale; // ExactTarget_Locale
}
class ExactTarget_Addresses {
public $Address; // ExactTarget_SubscriberAddress
}
class ExactTarget_Attribute {
public $Name; // string
public $Value; // string
public $Compression; // ExactTarget_CompressionConfiguration
}
class ExactTarget_CompressionConfiguration {
public $Type; // ExactTarget_CompressionType
public $Encoding; // ExactTarget_CompressionEncoding
}
class ExactTarget_CompressionType {
const gzip='gzip';
}
class ExactTarget_CompressionEncoding {
const base64='base64';
}
class ExactTarget_SubscriberStatus {
const Active='Active';
const Bounced='Bounced';
const Held='Held';
const Unsubscribed='Unsubscribed';
const Deleted='Deleted';
}
class ExactTarget_SubscriberTypeDefinition {
public $SubscriberType; // string
}
class ExactTarget_EmailType {
const Text='Text';
const HTML='HTML';
}
class ExactTarget_SubscriberList {
public $Status; // ExactTarget_SubscriberStatus
public $List; // ExactTarget_List
public $Action; // string
public $Subscriber; // ExactTarget_Subscriber
}
class ExactTarget_List {
public $ListName; // string
public $Category; // int
public $Type; // ExactTarget_ListTypeEnum
public $Description; // string
public $Subscribers; // ExactTarget_Subscriber
public $ListClassification; // ExactTarget_ListClassificationEnum
}
class ExactTarget_ListTypeEnum {
const _Public='Public';
const _Private='Private';
const SalesForce='SalesForce';
const GlobalUnsubscribe='GlobalUnsubscribe';
const Master='Master';
}
class ExactTarget_ListClassificationEnum {
const ExactTargetList='ExactTargetList';
const PublicationList='PublicationList';
const SuppressionList='SuppressionList';
}
class ExactTarget_Group {
public $Name; // string
public $Category; // int
public $Description; // string
public $Subscribers; // ExactTarget_Subscriber
}
class ExactTarget_GlobalUnsubscribeCategory {
public $Name; // string
public $IgnorableByPartners; // boolean
public $Ignore; // boolean
}
class ExactTarget_ObjectTypes {
const Lead='Lead';
const Contact='Contact';
const Campaign='Campaign';
const Report='Report';
}
class ExactTarget_Target {
public $ObjectType; // ExactTarget_ObjectTypes
public $Filters; // ExactTarget_Filters
}
class ExactTarget_Filters {
public $Filter; // ExactTarget_APIProperty
}
class ExactTarget_SalesforceSend {
public $Email; // ExactTarget_Email
public $SendDate; // dateTime
public $FromAddress; // string
public $FromName; // string
public $Subject; // string
public $IsMultipart; // boolean
public $IndividualResults; // boolean
public $Targets; // ExactTarget_Target
public $Exclusions; // ExactTarget_Target
}
class ExactTarget_SubscriberAddress {
public $AddressType; // string
public $Address; // string
public $Statuses; // ExactTarget_Statuses
}
class ExactTarget_Statuses {
public $Status; // ExactTarget_AddressStatus
}
class ExactTarget_SMSAddress {
public $Carrier; // string
}
class ExactTarget_EmailAddress {
public $Type; // ExactTarget_EmailType
}
class ExactTarget_AddressStatus {
public $Status; // ExactTarget_SubscriberAddressStatus
}
class ExactTarget_SubscriberAddressStatus {
const OptedIn='OptedIn';
const OptedOut='OptedOut';
const InActive='InActive';
}
?> <?php
require('exacttarget_appexchange_soap_client.php');
$wsdl = 'https://etappx.exacttarget.com/etframeworksf.wsdl';
try{
/* Create the Soap Client */
$client = new ExactTargetSoapClient($wsdl, array('trace'=>1));
/* Set username and password here */
$client->username = 'xxx';
$client->password = 'xxx';
//Setup the Email Send Definition
$SFSend = new ExactTarget_SalesforceSend();
$email = new ExactTarget_Email();
$email->ID = '3099626';
$SFSend->Email = $email;
$SFSend->FromAddress = 'help@exacttarget.com';
$SFSend->FromName = 'MAC';
$contact = new ExactTarget_Target();
$contact->ObjectID = '003A000000A7kKBIAZ';
$contact->ObjectType = 'Contact';
$SFSend->Targets = array(new SoapVar($contact, SOAP_ENC_OBJECT, 'Target', "http://exacttarget.com/wsdl/partnerAPI"));
$object = new SoapVar($SFSend, SOAP_ENC_OBJECT, 'SalesforceSend', "http://exacttarget.com/wsdl/partnerAPI");
$request = new ExactTarget_CreateRequest();
$request->Options = NULL;
$request->Objects = array($object);
$results = $client->Create($request);
var_dump($results);
} catch (Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?> Click the links below to view the methods, objects, and properties associated with the ExactTarget for Appexchange API.