This post provides SOAP and Java examples of activating list sends in Marketing Cloud (see my earlier post for the alternative of triggered sends). In this situation, we provide the email contents along with the MC-stored subscriber list(s) to send the email to.
For SOAP, one creates a Send object which wraps (among other values) an Email, EmailSendDefinition and one more more subscriber List objects. Some of the more important values stored at each level:
Object | Information to provide within object |
---|---|
Send | Wrapper for below three objects, also stores the email from-address and from-name. |
HTML and text versions of the email, subject line, and character set. See some examples. | |
List | MC List IDs to send the email to. List IDs are available from MC Email Studio, menu item Subscribers | Lists, selecting the list and viewing its Properties tab. |
EmailSendDefinition | Whether or not to use multipart emails, to send de-duplicate (not to send multiple copies to the same email address if the address is on multiple lists that the email is being sent to). The default values, need to provide them, and whether MC actually does anything with certain properties aren't always clear, you will probably need to experiment a bit. |
Here's a SOAP example using the MC Postman workspace:
<?xml version="1.0" encoding="UTF-8"?> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <s:Header> <a:Action s:mustUnderstand="1">Create</a:Action> <a:To s:mustUnderstand="1">https://{{et_subdomain}}.soap.marketingcloudapis.com/Service.asmx</a:To> <fueloauth xmlns="http://exacttarget.com">{{dne_etAccessToken}}</fueloauth> </s:Header> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CreateRequest xmlns="http://exacttarget.com/wsdl/partnerAPI"> <Objects xsi:type="Send"> <Client> <ID>{{et_mid}}</ID> </Client> <Email> <Name>Sample Email Send</Name> <IsHTMLPaste>true</IsHTMLPaste> <Subject>Sample Test Message</Subject> <CharacterSet>UTF-8</CharacterSet> <HTMLBody>Testing message: %%[ if listid != 1234567 then ]%% Welcome reader! %%[else]%% Greetings reader! %%[endif]%%</HTMLBody> <TextBody>Welcome Reader! (text only)</TextBody> </Email> <List> <ID>1234567</ID> </List> <List> <ID>2345678</ID> </List> <EmailSendDefinition> </EmailSendDefinition> <FromAddress>bobsemail@yopmail.com</FromAddress> <FromName>Bob Sender</FromName> </Objects> </CreateRequest> </s:Body> </s:Envelope>
The "Name" field with value "Sample Email Send" does not appear in the email but is used to help identify a specific email send. It is what is displayed in the Sends section of the Email Studio home page and the also the Tracking section of the list details. It does not have to be unique (sends are identified by a unique Job ID) but making it so helps make sends easier to tell apart from each other.
Sometimes you may wish to adjust the email a bit depending on the list being sent to. In the HTMLBody element of the above example, I've added AMPScript tags showing how this can be done.
A sample SOAP response for a request as above is as follows. Note the response contains the Job ID and the request ID that SFMC generated for your request:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <wsa:Action>CreateResponse</wsa:Action> <wsa:MessageID>urn:uuid:5ae72a13-31ac-4cc2-866e-50d8407fa5fe</wsa:MessageID> <wsa:RelatesTo>urn:uuid:93d44d6d-c424-4213-927e-3f1aac085b8b</wsa:RelatesTo> <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To> <wsse:Security> <wsu:Timestamp wsu:Id="Timestamp-6987861d-c008-402f-ad7c-d30dae59b1d3"> <wsu:Created>2023-11-04T02:02:11Z</wsu:Created> <wsu:Expires>2023-11-04T02:07:11Z</wsu:Expires> </wsu:Timestamp> </wsse:Security> </env:Header> <soap:Body> <CreateResponse xmlns="http://exacttarget.com/wsdl/partnerAPI"> <Results> <StatusCode>OK</StatusCode> <OrdinalID>0</OrdinalID> <NewID>9928401</NewID> </Results> <RequestID>e893e94c-4b2d-4a9d-ad12-71eb8d62e073</RequestID> <OverallStatus>OK</OverallStatus> </CreateResponse> </soap:Body> </soap:Envelope>
For Java, an example using the Fuel SDK is below.
public void sendEmail() { CreateRequest createRequest = new CreateRequest(); CreateOptions createOptions = new CreateOptions(); createOptions.setRequestType(RequestType.SYNCHRONOUS); createOptions.setQueuePriority(Priority.HIGH); createRequest.setOptions(createOptions); Send send = new Send(); com.exacttarget.fuelsdk.internal.Email email = new com.exacttarget.fuelsdk.internal.Email(); email.setName("Sample Email Send via Java"); email.setEmailType(EmailType.HTML.value()); email.setIsActive(Boolean.TRUE); email.setIsApproved(Boolean.TRUE); email.setIsHTMLPaste(Boolean.TRUE); email.setSubject("Sample test message subject"); email.setCharacterSet("UTF-8"); email.setHtmlBody("<p>Email Body</p>"); email.setTextBody("Text version of email body"); send.setEmail(email); // add as many lists as needed List listToSendTo = new List(); listToSendTo.setId(1234567); send.getList().add(listToSendTo); // More on EmailSendDefinition: // https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/creating_an_email_send_definition_using_the_web_service_api.html EmailSendDefinition emailSendDefinition = new EmailSendDefinition(); emailSendDefinition.setIsMultipart(isMultipart); emailSendDefinition.setDeduplicateByEmail(true); send.setEmailSendDefinition(emailSendDefinition); send.setFromAddress("bobsemail@yopmail.com"); send.setFromName("Bob Sender"); createRequest.getObjects().add(send); // configure ETClient similar to here: https://salesforce.stackexchange.com/a/312178 // ETClient etClient = .... CreateResponse response = etClient.getSoapConnection().getSoap().create(createRequest); if (response != null && "OK".equalsIgnoreCase(response.getOverallStatus())) { // success! Check email inbox... LOGGER.info("Success sending email w/Request ID {}", response.getRequestID()); } else { Optional.ofNullable(response) .ifPresent(cr -> Optional.ofNullable(cr.getResults()) .filter(errorList -> !errorList.isEmpty()) .map(errorList -> errorList.get(0)) .ifPresent(createResult -> { LOGGER.error("{}: {}", createResult.getErrorCode(), createResult.getStatusMessage()); } ) ); } }
Further Reading
Posted by Glen Mazza in Marketing Cloud at 02:00AM Nov 10, 2022 | Comments[0]