Microsoft 365 Mailboxes — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Microsoft 365 Mailboxes (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Microsoft 365 mailboxes are managed through Exchange Online, accessible via Microsoft Graph. For MSPs, mailbox tasks range from diagnosing delivery failures and searching for lost emails to managing shared mailboxes and offboarding users. Graph provides a unified API across all mailbox types.
| Type | Description | Common MSP Tasks |
|---|---|---|
| User Mailbox | Standard licensed user | Search, out-of-office, size, rules |
| Shared Mailbox | Team inbox, no license required | Access management, forwarding |
| Room/Equipment | Calendar resource booking | Availability, booking policies |
| Distribution Group | Email alias to multiple users | Membership, send-as |
GET /v1.0/users/{userId}/messages?$select=id,subject,from,receivedDateTime,isRead&$top=25&$orderby=receivedDateTime descGET /v1.0/users/{userId}/messages?$search="subject:invoice 2024"&$select=id,subject,from,receivedDateTimeAlso supports KQL search operators:
$search="from:[email protected]" — by sender$search="subject:urgent hasAttachments:true" — combined$search="received>=2024-01-01" — date rangeGET /v1.0/users/{userId}/messages/{messageId}?$select=id,subject,from,body,receivedDateTime,attachmentsGET /v1.0/users/{userId}/mailboxSettingsResponse:
{
"automaticRepliesSetting": {
"status": "disabled",
"internalReplyMessage": "",
"externalReplyMessage": ""
},
"timeZone": "Eastern Standard Time",
"language": { "locale": "en-US" }
}PATCH /v1.0/users/{userId}/mailboxSettings
Content-Type: application/json
{
"automaticRepliesSetting": {
"status": "alwaysEnabled",
"internalReplyMessage": "<html>I'm out of office until Jan 15.</html>",
"externalReplyMessage": "<html>I'm out of office. For urgent matters contact [email protected].</html>"
}
}PATCH /v1.0/users/{userId}/mailboxSettings
Content-Type: application/json
{
"automaticRepliesSetting": { "status": "disabled" }
}GET /v1.0/users/{userId}/mailFolders/inbox?$select=totalItemCount,sizeInBytesFor full mailbox statistics (requires Exchange admin permissions):
GET /v1.0/reports/getMailboxUsageDetail(period='D7')GET /v1.0/users/{userId}/mailFolders/inbox/messageRulesResponse shows rules that may affect mail delivery:
{
"value": [
{
"id": "rule1",
"displayName": "Move newsletters",
"conditions": { "senderContains": ["newsletter"] },
"actions": { "moveToFolder": "Newsletters" },
"isEnabled": true
}
]
}POST /v1.0/users/{userId}/sendMail
Content-Type: application/json
{
"message": {
"subject": "Your IT support request has been resolved",
"body": { "contentType": "HTML", "content": "<p>Your ticket #1234 is now closed.</p>" },
"toRecipients": [{ "emailAddress": { "address": "[email protected]" } }]
},
"saveToSentItems": true
}Shared mailbox access is managed via Microsoft 365 admin or Exchange PowerShell, not directly via Graph mailbox endpoints. Use Graph group membership or delegate access patterns.
Access is represented as mailboxPermissions — check via admin APIs or Exchange PowerShell:
Get-MailboxPermission -Identity "[email protected]" | Where-Object { $_.AccessRights -eq "FullAccess" }Look for NDRs (Non-Delivery Reports) in the user's inbox or sent items:
GET /v1.0/users/{userId}/messages?$filter=senderEmailAddress/address eq '[email protected]'&$select=subject,receivedDateTime,body| NDR Code | Meaning | Resolution |
|---|---|---|
5.1.1 | Recipient doesn't exist | Verify UPN / check aliases |
5.1.8 | Sender blocked (spam) | Review anti-spam policy |
5.2.2 | Mailbox full | Check quota, remove items |
5.7.1 | Unauthorized relay | SMTP auth settings |
5.7.606 | Sender IP blocked | Submit to Microsoft for delisting |
Option A: Convert to shared mailbox (no license needed, data accessible)
Option B: Forward and archive
Option C: Auto-reply and close
| Error | Cause | Resolution |
|---|---|---|
MailboxNotEnabledForRESTAPI | User has no Exchange license | Assign Exchange/M365 license |
ErrorItemNotFound | Message ID expired or moved | Search by subject/date instead |
AuthenticationError | Token expired | Re-authenticate via OAuth flow |
TooManyRequests | Graph throttling (429) | Retry with exponential backoff |
Forbidden (403) | Missing Mail.Read permission | Check app registration |
| Task | Microsoft Graph Permission |
|---|---|
| Read emails | Mail.Read or Mail.ReadWrite |
| Send email | Mail.Send |
| Mailbox settings | MailboxSettings.ReadWrite |
| All users' mail (admin) | Mail.Read (delegated + admin consent) |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.