Aggiunge IMAP bounce e flag email non valide nel CRM.
CI / scan_ruby (push) Failing after 13m27s
CI / scan_js (push) Successful in 11m45s
CI / lint (push) Failing after 12m4s

Permette di leggere i bounce dalla stessa MailIdentity SMTP, aggiornare le email in anagrafica e saltare gli indirizzi invalidi nei mailing.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-08 19:46:04 +02:00
co-authored by Cursor
parent 353ace4d99
commit 36b3ffe507
26 changed files with 922 additions and 12 deletions
+78 -2
View File
@@ -9,8 +9,9 @@ module EminuxCrmMcp
1. list_projects per i project_code (matchlivetv, riskmeter, cardoo, …).
2. today per capire cosa fare oggi.
3. search / get_organization per il contesto.
4. create_activity, complete_task, create_task, update_opportunity_stage per agire.
4. create_activity, complete_task, create_task, update_opportunity_stage, update_organization_email, check_mail_bounces per agire.
Non inviare mailing, non cancellare record, non gestire utenti.
Per i bounce usa check_mail_bounces (legge IMAP dalle stesse credenziali SMTP della MailIdentity).
TEXT
module_function
@@ -50,7 +51,9 @@ module EminuxCrmMcp
CreateTask,
CompleteTask,
CreateActivity,
UpdateOpportunityStage
UpdateOpportunityStage,
UpdateOrganizationEmail,
CheckMailBounces
]
)
end
@@ -254,4 +257,77 @@ module EminuxCrmMcp
end
end
end
class UpdateOrganizationEmail < MCP::Tool
description "Aggiorna l'email di un'organizzazione (e del contatto principale): marca bounce/non valida, sostituisci con un indirizzo trovato, annota in timeline."
input_schema(
properties: {
project_code: { type: "string" },
organization_id: { type: "integer" },
email: { type: "string", description: "Nuova email (se trovata). Lascia vuoto per solo marcare non valida." },
email_invalid: { type: "boolean", description: "true = non usare in mailing; false se hai messo un'email nuova" },
bounced_email: { type: "string", description: "Indirizzo che ha generato il bounce" },
bounce_reason: { type: "string" },
contact_id: { type: "integer", description: "Contatto specifico; default = primario" },
website: { type: "string" },
activity_subject: { type: "string" },
activity_description: { type: "string" }
},
required: %w[project_code organization_id]
)
class << self
def call(project_code:, organization_id:, email: nil, email_invalid: nil, bounced_email: nil,
bounce_reason: nil, contact_id: nil, website: nil, activity_subject: nil,
activity_description: nil, server_context: nil)
attrs = {
organization_id: organization_id,
email: email,
email_invalid: email_invalid,
bounced_email: bounced_email,
bounce_reason: bounce_reason,
contact_id: contact_id,
website: website,
activity_subject: activity_subject,
activity_description: activity_description
}.compact
# Permetti email: null esplicito solo se chiave presente via email=""
attrs[:email] = email if !email.nil?
EminuxCrmMcp.json_response(
EminuxCrmMcp.session_from(server_context).update_organization_email(project_code, attrs)
)
end
end
end
class CheckMailBounces < MCP::Tool
description "Legge i bounce/DSN dalla casella IMAP dell'account email CRM (stesse credenziali SMTP della MailIdentity). Arricchisce con match alle organizzazioni del progetto."
input_schema(
properties: {
project_code: { type: "string", description: "Progetto per matchare le società (es. matchlivetv)" },
from_email: { type: "string", description: "Mittente account, es. info@matchlivetv.it (default)" },
mail_identity_id: { type: "integer" },
since_days: { type: "integer", description: "Giorni indietro da controllare (default 14)" },
mailbox: { type: "string", description: "Cartella IMAP, default INBOX" },
limit: { type: "integer", description: "Max messaggi bounce da analizzare" }
},
required: %w[project_code]
)
class << self
def call(project_code:, from_email: nil, mail_identity_id: nil, since_days: nil,
mailbox: nil, limit: nil, server_context: nil)
attrs = {
from_email: from_email,
mail_identity_id: mail_identity_id,
since_days: since_days,
mailbox: mailbox,
limit: limit
}.compact
EminuxCrmMcp.json_response(
EminuxCrmMcp.session_from(server_context).check_mail_bounces(project_code, attrs)
)
end
end
end
end