New Message
Live Frame Preview
|
Your sent log folder is empty. |
General Settings
Resend API Key
Your API Key is encrypted and stored in Cloudflare's server KV database.
Google Sheets Real-time Logging
Enter your Web App URL to mirror your logs in Google Sheets in the background.
View Apps Script Setup Code
- Open **Google Sheets** -> **Extensions** -> **Apps Script**.
- Paste the code, click **Deploy** -> **New deployment** -> **Web app**.
- Set: *Execute as: Me*, *Who has access: Anyone*.
// Handles Reading logs (GET)
function doGet(e) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rows = sheet.getDataRange().getValues();
if (rows.length <= 1) {
return ContentService.createTextOutput(JSON.stringify([]))
.setMimeType(ContentService.MimeType.JSON);
}
var logList = [];
for (var i = 1; i < rows.length; i++) {
var row = rows[i];
logList.push({
date: row[0],
to: row[1],
subject: row[2],
status: row[3],
id: row[4],
error: row[5] || "",
body: row[6] || ""
});
}
logList.reverse();
return ContentService.createTextOutput(JSON.stringify(logList))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ success: false, error: error.message }))
.setMimeType(ContentService.MimeType.JSON);
}
}
// Handles Writing logs (POST)
function doPost(e) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = JSON.parse(e.postData.contents);
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Timestamp", "Recipient (To)", "Subject", "Status", "Resend ID", "Error Detail", "Email Body"]);
}
sheet.appendRow([
new Date().toLocaleString(),
data.to,
data.subject,
data.status,
data.id,
data.error || "",
data.body || ""
]);
return ContentService.createTextOutput(JSON.stringify({ success: true }))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ success: false, error: error.message }))
.setMimeType(ContentService.MimeType.JSON);
}
}