Send Attachments
Attach files to any email by including the attachments array in your send payload. Files must be base64-encoded, and you can include multiple attachments in a single call.
https://mail.sendcorex.com/v3.0/send Attachments use the same endpoint as Send Email. Add the attachments array next to the other body parameters.
Attachment parameters
Each item in the attachments array is an object with the fields below.
filenamestringrequiredThe filename shown to the recipient in their email client.
e.g.
"invoice.pdf"contentstringrequiredThe file content encoded as a base64 string.
e.g.
"JVBERi0xLjQKJeLjz9MK..."encodingstringrequiredThe encoding of content. Must be "base64".
e.g.
"base64"
Quick start
import axios from 'axios';
import fs from 'fs';
const fileContent = fs.readFileSync('./invoice.pdf').toString('base64');
try {
const response = await axios.post(
'https://mail.sendcorex.com/v3.0/send',
{
to: 'user@example.com',
from: 'noreply@yourdomain.com',
senderName: 'My App',
subject: 'Your Invoice #1042',
body: '<p>Please find your invoice attached.</p>',
attachments: [
{
filename: 'invoice.pdf',
content: fileContent,
encoding: 'base64',
},
],
},
{ headers: { Authorization: process.env.SENDCOREX_API_KEY } }
);
const { id, ids, recipients } = response.data;
console.log('Queued:', id, '| recipients:', recipients);
} catch (err) {
if (err.response?.status === 400 && err.response.data.code === 'DANGEROUS_ATTACHMENT') {
// Attachment blocked for security reasons. There is no quarantine record.
console.log('Blocked:', err.response.data.riskLevel);
} else {
throw err;
}
}Response
{
"success": true,
"message": "Email queued successfully",
"code": "EMAIL_QUEUED_SUCCESS",
"id": "3f2a1b4c-8e9d-4f7a-b2c3-1a2b3c4d5e6f",
"ids": [
{ "id": "3f2a1b4c-8e9d-4f7a-b2c3-1a2b3c4d5e6f", "recipient": "user@example.com" }
],
"recipients": 1,
"scheduledAt": null
}My attachment was blocked
To protect our platform and the sending reputation of every customer, attachments are checked before an email is queued. When a file is considered unsafe, the request returns 400 with the code DANGEROUS_ATTACHMENT and the email is not sent.
Attachment blocked
{
"error": "One or more attachments were blocked for security reasons.",
"code": "DANGEROUS_ATTACHMENT",
"riskLevel": "high"
}errorA human-readable message explaining that an attachment was blocked.
codeAlways DANGEROUS_ATTACHMENT for this response.
riskLevelThe risk level assigned to the blocked attachment. Include it when contacting support.
There is no quarantine record for this error. Unlike flagged emails, a blocked attachment cannot be released with /quarantine/release. This is a deliberate safeguard against spammers and abusive senders, so the email is never held for later delivery.
What should I do?
Automated checks can occasionally flag a legitimate file. If you need to send this attachment, contact our support team. Our team is aware of this behavior, and when a block turns out to be a false positive we review it and apply the necessary updates.
To help us resolve it faster, include:
- The filename and file type of the attachment
- The riskLevel returned by the API
- What the file is used for in your product
Errors
All error codes → Errors return a JSON object with error and code.
- 401
MISSING_AUTH_HEADERNo Authorization header present.
- 401
INVALID_API_KEYThe API key is invalid or revoked.
- 401
ACCOUNT_BLOCKEDAccount has been blocked.
- 401
NO_CREDITS_LEFTNo email credits remaining.
- 401
DOMAIN_NOT_VALIDATEDSender domain not verified.
- 401
LISTED_SPAM_HAUSSender domain is listed on Spamhaus.
- 401
ISP_DOMAIN_BLOCKEDSending from well-known domains (gmail.com, outlook.com, etc) is not allowed.
- 401
FROM_HEADER_DOMAIN_MISMATCHFrom header domain not authorized for this sender.
- 401
USER_NOT_FOUNDUser not found.
- 401
MISSING_USER_PRIVILEGESMissing user privileges.
- 401
EMAIL_CREDITS_NOT_FOUNDError fetching email credits.
- 429
CREDENTIAL_TEMPORARILY_BLOCKEDAPI key temporarily blocked due to repeated policy violations.
- 429
IP_TEMPORARILY_BLOCKEDRequesting IP temporarily blocked due to repeated policy violations.
- 400
MISSING_FROMThe from field is missing or empty.
- 400
INVALID_FROM_FORMATThe from field must be a valid email address.
- 400
MISSING_SENDERNAMEThe senderName field is missing or empty.
- 400
INVALID_SENDERNAME_FORMATThe senderName field contains invalid characters.
- 400
MISSING_SUBJECTThe subject field is missing or empty.
- 400
MISSING_BODYThe body field is missing or empty.
- 400
MISSING_TOADDRESSThe to field is missing or empty.
- 400
MISSING_TOThe to field is missing or empty.
- 400
INVALID_TOADDRESSOne or more recipient addresses are malformed.
- 400
TOADDRESS_LIMIT_EXCEEDEDMore than 50 recipients in the to array.
- 400
INVALID_SCHEDULED_ATscheduled_at is not a valid date or is in the past.
- 400
INVALID_SENDER_FORMATThe sender email format is invalid.
- 400
HEADER_NOT_ALLOWEDCustom header key is not on the allowed list (List-Unsubscribe, List-Id, X-*, etc).
- 400
INVALID_HEADER_VALUEHeader value contains invalid characters (CR/LF not allowed).
- 400
DANGEROUS_ATTACHMENTOne or more attachments were blocked for security reasons.
- 403
ACCOUNT_RESTRICTEDAccount is temporarily restricted.
- 403
DAILY_LIMITDaily email sending limit reached.
- 403
SPAM_DETECTEDEmail content flagged as spam. Response includes quarantine_id and release instructions.
- 403
SENDER_NAME_MISMATCHMultiple sender names detected for same address.
- 403
FOLLOWUP_PATTERN_DETECTEDEmail content flagged as repeated suspicious follow-up pattern.
- 403
SCAM_PATTERN_DETECTEDEmail content flagged as scam pattern.
- 403
ACCOUNT_SUSPENDED_SPOOFINGAccount suspended due to repeated From header spoofing attempts.
- 500
INTERNAL_SERVER_ERRORUnexpected server error. Try again.
- 500
PARSE_ERRORFailed to process email content (MIME parse failure).
- 500
PERSIST_FAILEDFailed to queue email (database persistence failure).