Finding All Undelivered Messages
Overview
A common need with message campaigns involves pulling all of the undelivered messages for further analysis. This guide will show how you can use the SignalWire Python SDK and SignalWire PHP SDK in order to do exactly that.
Full code example: Pull Undelivered Messages
- Python
- PHP
- Node
- Java
- Ruby
from datetime import datetime
from signalwire.rest import Client as signalwire_client
import pandas as pd
client = signalwire_client("ProjectID", "AuthToken",
signalwire_space_url='YOURSPACE.signalwire.com')
messages = client.messages.list(date_sent_after=datetime(2021, 10, 20),
date_sent_before=datetime(2021, 10, 30),
from_="+1xxxxxxxxxx",
)
d = []
for record in messages:
if record.status == "undelivered":
d.append((record.from_, record.to, record.date_sent, record.sid, record.error_code))
df = pd.DataFrame(d, columns=('From', 'To', 'Date', 'MessageSID', 'Error Code'))
print(df)
df.to_csv('UndeliveredMessages.csv', index=False, encoding='utf-8')
<?php
require './vendor/autoload.php';
use SignalWire\Rest\Client;
$client = new Client("ProjectID", "AuthToken", array("signalwireSpaceUrl" => "YOURSPACE.signalwire.com"));
$messages = $client->messages->read([
"dateSentAfter" => new \DateTime('2021-11-15'),
"dateSentBefore" => new \DateTime('2021-11-30'),
'from' => '+1xxxxxxxxxx',
]);
$fields = array('Message SID', 'From', 'To', 'Date Sent', 'Status', 'Direction', 'Price');
echo '"'.implode('","', $fields).'"'."\n";
$fp = fopen(date("Y-m-d").'_messageReport.csv', 'w');
fputcsv($fp, $fields);
foreach ($messages as $message) {
if ($message->status == "undelivered")
$row = array(
$message->sid,
$message->from,
$message->to,
$message->dateSent->format('Y-m-d H:i:s'),
$message->status,
$message->direction,
$message->price,
);
fputcsv($fp, $row);
echo '"'.implode('","', $row).'"'."\n";
}
fclose($fp);
const dfd = require("danfojs");
const fs = require('fs');
const { RestClient } = require("@signalwire/compatibility-api");
// TODO: Update with your credentials
let space_url = "YOURSPACENAME.signalwire.com";
let project_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX";
let access_token = "PTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
const client = RestClient(
project_id,
access_token, {
signalwireSpaceUrl: space_url,
});
// TODO: Update numbers list
const from_numbers = [
"+###########",
"+###########",
"+###########",
"+###########",
];
let data = [];
Promise.all(
from_numbers.map((number) =>
client.messages
.list({
from: number,
dateSentAfter: new Date(Date.UTC(2022, 01, 01)),
dateSentBefore: new Date(Date.UTC(2022, 04, 25))
})
.then((messages) =>
messages.forEach((message) => {
if (message.status == "undelivered") {
data.push([
message.from,
message.to,
message.dateSent,
message.sid,
message.errorCode,
]);
}
})
)
)
).then(() => {
let allData = new dfd.DataFrame(data, {
columns: [
"From",
"To",
"Date",
"Message SID",
"Error Code",
],
config: {
tableDisplayConfig: {
columns: [
{ width: 1 },
{ width: 13 },
{ width: 13 },
{ width: 8 },
{ width: 36 },
{ width: 16 }
],
}
}
});
allData.print();
fs.writeFileSync("UndeliveredMessages.csv", dfd.toCSV(allData));
});
import io.github.olajhidey.SignalWireClient;
import io.github.olajhidey.model.message.Message;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MessageUndelivered {
public static List<String[]> dataLines = new ArrayList<>();
public static SignalWireClient client() {
return new SignalWireClient("YOUR-PROJECT-TOKEN",
"YOUR-API-TOKEN",
"YOUR-SPACE-NAME");
}
public static void main(String[] args) {
List<Message> messages = client().message().getMessages().messages;
dataLines.add(new String[]{"From", "To", "Date", "Status", "MessageSID"});
for (Message message : messages) {
if(message.status == "undelivered"){
dataLines.add(new String[]{message.from, message.to, message.date_created, message.to, message.sid});
}
}
try {
createAndPopulateCSV();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
public static String convertToCsv(String[] data) {
return Stream.of(data)
.map(MessageUndelivered::escapeSpecialCharacters)
.collect(Collectors.joining(","));
}
public static void createAndPopulateCSV() throws IOException {
// Auto-generate the name of the file
String filename = "message_result" + System.currentTimeMillis();
// Get the absolute path to the folder you would like to create in the project directory
File file = new File(Paths.get("csv").toAbsolutePath().toUri());
// if file doesn't exist. create a new folder
if (!file.exists()) {
boolean isFolder = file.mkdir();
if (isFolder) {
System.out.println("New folder created!");
} else {
System.out.println("Couldn\'t create folder");
}
}
// create new csv file with the autogenerated name
File csvOutputFile = new File(Paths.get("csv").toAbsolutePath() + "\\" + filename);
try (PrintWriter printWriter = new PrintWriter(csvOutputFile)) {
dataLines.stream()
.map(MessageUndelivered::convertToCsv)
.forEach(printWriter::println); // Write item into the CSV file
System.out.println("Write operation done successfully!");
}
}
public static String escapeSpecialCharacters(String data) {
String escapeData = data.replace("\\R", " ");
if (data.contains(",") || data.contains("\"")) {
data = data.replace("\"", "\"\"");
escapeData = "\"" + data + "\"";
}
return escapeData;
}
}
require 'dotenv/load'
require 'signalwire/sdk'
require 'csv'
username = ENV['projectID']
password = ENV['token']
host = ''
@client = Signalwire::REST::Client.new username, password, signalwire_space_url: host
messages = @client.messages.list( )
#some extra helper variables
messageList = []
headers = ['sid','to','from','date']
# set status. Options: delivered, undelivered, sent, failed
status = 'undelivered'
if message.status == status
messageList.push([message.sid,message.to,message.from,message.date_sent,])
end
end
CSV.open('undelivered-MSG.csv','w',headers: headers, write_headers:true) do |csv|
messageList.each do |message|
csv << message
end
end