@jjlmoya/utils-tools 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +63 -0
- package/src/category/i18n/en.ts +172 -0
- package/src/category/i18n/es.ts +172 -0
- package/src/category/i18n/fr.ts +172 -0
- package/src/category/index.ts +23 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +90 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/title_quality.test.ts +56 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/date-diff-calculator/bibliography.astro +14 -0
- package/src/tool/date-diff-calculator/component.astro +370 -0
- package/src/tool/date-diff-calculator/i18n/en.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/es.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/fr.ts +132 -0
- package/src/tool/date-diff-calculator/index.ts +22 -0
- package/src/tool/date-diff-calculator/seo.astro +14 -0
- package/src/tool/date-diff-calculator/ui.ts +17 -0
- package/src/tool/drive-direct-link/bibliography.astro +14 -0
- package/src/tool/drive-direct-link/component.astro +280 -0
- package/src/tool/drive-direct-link/i18n/en.ts +118 -0
- package/src/tool/drive-direct-link/i18n/es.ts +118 -0
- package/src/tool/drive-direct-link/i18n/fr.ts +118 -0
- package/src/tool/drive-direct-link/index.ts +22 -0
- package/src/tool/drive-direct-link/seo.astro +14 -0
- package/src/tool/drive-direct-link/ui.ts +10 -0
- package/src/tool/email-list-cleaner/bibliography.astro +14 -0
- package/src/tool/email-list-cleaner/component.astro +375 -0
- package/src/tool/email-list-cleaner/i18n/en.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/es.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/fr.ts +140 -0
- package/src/tool/email-list-cleaner/index.ts +22 -0
- package/src/tool/email-list-cleaner/seo.astro +14 -0
- package/src/tool/email-list-cleaner/ui.ts +15 -0
- package/src/tool/env-badge-spain/bibliography.astro +14 -0
- package/src/tool/env-badge-spain/component.astro +303 -0
- package/src/tool/env-badge-spain/components/BadgeForm.astro +243 -0
- package/src/tool/env-badge-spain/components/BadgeResult.astro +151 -0
- package/src/tool/env-badge-spain/i18n/en.ts +153 -0
- package/src/tool/env-badge-spain/i18n/es.ts +153 -0
- package/src/tool/env-badge-spain/i18n/fr.ts +153 -0
- package/src/tool/env-badge-spain/index.ts +22 -0
- package/src/tool/env-badge-spain/seo.astro +14 -0
- package/src/tool/env-badge-spain/ui.ts +53 -0
- package/src/tool/morse-beacon/bibliography.astro +14 -0
- package/src/tool/morse-beacon/component.astro +534 -0
- package/src/tool/morse-beacon/i18n/en.ts +157 -0
- package/src/tool/morse-beacon/i18n/es.ts +157 -0
- package/src/tool/morse-beacon/i18n/fr.ts +157 -0
- package/src/tool/morse-beacon/index.ts +22 -0
- package/src/tool/morse-beacon/logic/MorseEngine.ts +124 -0
- package/src/tool/morse-beacon/seo.astro +14 -0
- package/src/tool/morse-beacon/ui.ts +18 -0
- package/src/tool/password-generator/bibliography.astro +14 -0
- package/src/tool/password-generator/component.astro +259 -0
- package/src/tool/password-generator/components/Config.astro +227 -0
- package/src/tool/password-generator/components/Display.astro +147 -0
- package/src/tool/password-generator/components/Strength.astro +70 -0
- package/src/tool/password-generator/i18n/en.ts +166 -0
- package/src/tool/password-generator/i18n/es.ts +166 -0
- package/src/tool/password-generator/i18n/fr.ts +166 -0
- package/src/tool/password-generator/index.ts +22 -0
- package/src/tool/password-generator/seo.astro +14 -0
- package/src/tool/password-generator/ui.ts +16 -0
- package/src/tool/routes/bibliography.astro +14 -0
- package/src/tool/routes/component.astro +543 -0
- package/src/tool/routes/i18n/en.ts +157 -0
- package/src/tool/routes/i18n/es.ts +157 -0
- package/src/tool/routes/i18n/fr.ts +157 -0
- package/src/tool/routes/index.ts +22 -0
- package/src/tool/routes/logic/GeocodingService.ts +60 -0
- package/src/tool/routes/logic/RouteManager.ts +192 -0
- package/src/tool/routes/logic/RouteService.ts +66 -0
- package/src/tool/routes/seo.astro +14 -0
- package/src/tool/routes/ui.ts +16 -0
- package/src/tool/rule-of-three/bibliography.astro +14 -0
- package/src/tool/rule-of-three/component.astro +369 -0
- package/src/tool/rule-of-three/i18n/en.ts +171 -0
- package/src/tool/rule-of-three/i18n/es.ts +171 -0
- package/src/tool/rule-of-three/i18n/fr.ts +171 -0
- package/src/tool/rule-of-three/index.ts +22 -0
- package/src/tool/rule-of-three/seo.astro +14 -0
- package/src/tool/rule-of-three/ui.ts +13 -0
- package/src/tool/seo-content-optimizer/bibliography.astro +14 -0
- package/src/tool/seo-content-optimizer/component.astro +552 -0
- package/src/tool/seo-content-optimizer/i18n/en.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/es.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/fr.ts +136 -0
- package/src/tool/seo-content-optimizer/index.ts +22 -0
- package/src/tool/seo-content-optimizer/seo.astro +14 -0
- package/src/tool/seo-content-optimizer/ui.ts +29 -0
- package/src/tool/speed-reader/bibliography.astro +14 -0
- package/src/tool/speed-reader/component.astro +586 -0
- package/src/tool/speed-reader/i18n/en.ts +152 -0
- package/src/tool/speed-reader/i18n/es.ts +152 -0
- package/src/tool/speed-reader/i18n/fr.ts +152 -0
- package/src/tool/speed-reader/index.ts +22 -0
- package/src/tool/speed-reader/logic/RSVPEngine.ts +106 -0
- package/src/tool/speed-reader/seo.astro +14 -0
- package/src/tool/speed-reader/ui.ts +14 -0
- package/src/tool/text-pixel-calculator/bibliography.astro +14 -0
- package/src/tool/text-pixel-calculator/component.astro +315 -0
- package/src/tool/text-pixel-calculator/components/Editor.astro +240 -0
- package/src/tool/text-pixel-calculator/components/Preview.astro +155 -0
- package/src/tool/text-pixel-calculator/components/Stats.astro +87 -0
- package/src/tool/text-pixel-calculator/i18n/en.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/es.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/fr.ts +133 -0
- package/src/tool/text-pixel-calculator/index.ts +22 -0
- package/src/tool/text-pixel-calculator/seo.astro +14 -0
- package/src/tool/text-pixel-calculator/ui.ts +15 -0
- package/src/tool/whatsapp-link/bibliography.astro +14 -0
- package/src/tool/whatsapp-link/component.astro +455 -0
- package/src/tool/whatsapp-link/i18n/en.ts +128 -0
- package/src/tool/whatsapp-link/i18n/es.ts +128 -0
- package/src/tool/whatsapp-link/i18n/fr.ts +128 -0
- package/src/tool/whatsapp-link/index.ts +22 -0
- package/src/tool/whatsapp-link/seo.astro +14 -0
- package/src/tool/whatsapp-link/ui.ts +15 -0
- package/src/tools.ts +15 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { EmailListCleanerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'What does this email list cleaner do exactly?',
|
|
8
|
+
answer: 'The tool analyses your email list, removes duplicates, strips unnecessary whitespace, validates basic format and normalises all addresses to lowercase to ensure a clean database.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Is there a limit on the number of emails?',
|
|
12
|
+
answer: 'There is no strict record limit. You can process thousands of emails instantly in a single pass. The only constraint is your browser\'s memory if the list is extremely large.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Is it safe to paste my emails here?',
|
|
16
|
+
answer: 'Absolutely. All processing is done locally in your own browser via JavaScript. Your data is never sent to our servers or stored in any external database.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'How does this improve my campaign deliverability?',
|
|
20
|
+
answer: 'By removing non-existent or malformed addresses you reduce your bounce rate, which improves your domain reputation with providers like Gmail, Outlook and Yahoo.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Paste your emails', text: 'Copy your email list and paste it into the text box. They can be separated by lines, commas or spaces.' },
|
|
26
|
+
{ name: 'Clean the list', text: "Click the 'Clean List' button to start the validation and duplicate removal process." },
|
|
27
|
+
{ name: 'Review the results', text: 'Check the statistics showing original vs. final emails and review the cleaned list in the lower panel.' },
|
|
28
|
+
{ name: 'Copy or download', text: 'Copy the result directly to the clipboard or download it as a ready-to-use .txt file.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowTo> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: 'How to clean an email list',
|
|
45
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'SoftwareApplication',
|
|
51
|
+
name: 'Email List Cleaner',
|
|
52
|
+
applicationCategory: 'UtilitiesApplication',
|
|
53
|
+
operatingSystem: 'Web',
|
|
54
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
55
|
+
description: 'Remove duplicates, fix whitespace and validate formats in your email list. Free tool with no record limit.',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const ui: EmailListCleanerUI = {
|
|
59
|
+
inputLabel: 'Email list',
|
|
60
|
+
inputPlaceholder: 'Paste your email list here (separated by lines, commas or spaces)...',
|
|
61
|
+
cleanBtn: 'Clean List',
|
|
62
|
+
clearBtn: 'Clear All',
|
|
63
|
+
statsOriginal: 'Original',
|
|
64
|
+
statsRemoved: 'Removed',
|
|
65
|
+
statsFinal: 'Clean',
|
|
66
|
+
resultLabel: 'Clean Result',
|
|
67
|
+
copyBtn: 'Copy List',
|
|
68
|
+
copyDone: 'Copied!',
|
|
69
|
+
downloadBtn: 'Download .txt',
|
|
70
|
+
registered: 'registered',
|
|
71
|
+
downloadFilename: 'clean-emails',
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const content: ToolLocaleContent<EmailListCleanerUI> = {
|
|
75
|
+
slug: 'email-list-cleaner',
|
|
76
|
+
title: 'Email List Cleaner',
|
|
77
|
+
description: 'Clean email lists for free. Remove duplicates, fix whitespace and validate formats in seconds. Save costs and improve your deliverability.',
|
|
78
|
+
ui,
|
|
79
|
+
faqTitle: 'Frequently Asked Questions',
|
|
80
|
+
faq: faqData,
|
|
81
|
+
howTo: howToData,
|
|
82
|
+
bibliographyTitle: 'References',
|
|
83
|
+
bibliography: [
|
|
84
|
+
{ name: 'RFC 5322: Internet Message Format', url: 'https://datatracker.ietf.org/doc/html/rfc5322' },
|
|
85
|
+
{ name: 'Google: Email sender guidelines', url: 'https://support.google.com/a/answer/81126' },
|
|
86
|
+
{ name: 'Wikipedia: Email spam', url: 'https://en.wikipedia.org/wiki/Email_spam' },
|
|
87
|
+
],
|
|
88
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
89
|
+
seo: [
|
|
90
|
+
{ type: 'title', level: 2, text: 'Why is using an email list cleaner essential?' },
|
|
91
|
+
{
|
|
92
|
+
type: 'paragraph',
|
|
93
|
+
html: 'In the world of digital marketing, the quality of your database matters far more than its size. Having a list of 50,000 emails is worthless if half of them are non-existent addresses, contain typos or are duplicated. This is where an <strong>email list cleaner</strong> becomes indispensable.',
|
|
94
|
+
},
|
|
95
|
+
{ type: 'title', level: 3, text: 'The risks of a dirty email list' },
|
|
96
|
+
{
|
|
97
|
+
type: 'paragraph',
|
|
98
|
+
html: 'Keeping an uncleaned database can have serious consequences. Sending emails to addresses that do not exist generates a "hard bounce". If this percentage exceeds 2-3%, spam filters will start scrutinising your domain and you could end up on an international blacklist.',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'tip',
|
|
102
|
+
title: 'Expert tip',
|
|
103
|
+
html: 'Never buy email lists. It is the fastest way to ruin your domain reputation. Build your own list organically and clean it every 3 to 6 months.',
|
|
104
|
+
},
|
|
105
|
+
{ type: 'title', level: 3, text: 'How our tool optimises your database' },
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Our free utility performs a thorough and fast cleanup of your databases with no record limits. It runs several critical validation tasks instantly:',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'list',
|
|
112
|
+
items: [
|
|
113
|
+
'<strong>Duplicate removal:</strong> The same user will not receive the same email twice.',
|
|
114
|
+
'<strong>Whitespace correction:</strong> We strip accidental spaces at the start or end that would invalidate sending.',
|
|
115
|
+
'<strong>Format validation:</strong> We filter out entries that do not have a valid email structure.',
|
|
116
|
+
'<strong>Normalisation:</strong> Everything is converted to lowercase to avoid redundant records.',
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{ type: 'title', level: 3, text: 'When is the right time to clean your list?' },
|
|
120
|
+
{
|
|
121
|
+
type: 'list',
|
|
122
|
+
items: [
|
|
123
|
+
'Before importing contacts into a new CRM or sending platform (Mailchimp, SendGrid, etc.).',
|
|
124
|
+
'If you notice your open rate has dropped below its usual average.',
|
|
125
|
+
'After an event or trade show where you collected data manually.',
|
|
126
|
+
'As preventive maintenance every quarter to maintain domain health.',
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
{ type: 'title', level: 3, text: 'Impact on return on investment' },
|
|
130
|
+
{
|
|
131
|
+
type: 'paragraph',
|
|
132
|
+
html: 'Email marketing remains one of the highest-ROI channels, but only if messages reach the inbox. By using an <strong>email cleaner</strong>, you are optimising your sales funnel from the source and stopping paying platforms for contacts who will never see your messages.',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'tip',
|
|
136
|
+
title: 'Implement double opt in',
|
|
137
|
+
html: 'The best way to avoid fake emails is to require users to confirm their subscription by clicking a link sent to their inbox. This guarantees the email exists and that the user has access to it.',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { EmailListCleanerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: '¿Qué hace exactamente este limpiador de emails?',
|
|
8
|
+
answer: 'La herramienta analiza tu lista de correos, elimina duplicados, quita espacios en blanco innecesarios, valida el formato básico y normaliza todas las direcciones a minúsculas para asegurar una base de datos impecable.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: '¿Hay algún límite de correos electrónicos?',
|
|
12
|
+
answer: 'No hay un límite estricto de registros. Puedes procesar miles de correos de una sola vez de forma instantánea. La única limitación es la memoria de tu propio navegador si la lista es extremadamente masiva.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '¿Es seguro pegar mis correos aquí?',
|
|
16
|
+
answer: 'Totalmente. Todo el procesamiento se realiza de forma local en tu propio navegador mediante JavaScript. Tus datos nunca se envían a nuestros servidores ni se guardan en ninguna base de datos externa.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '¿Cómo mejora esto la entregabilidad de mis campañas?',
|
|
20
|
+
answer: 'Al eliminar direcciones inexistentes o mal formateadas, reduces la tasa de rebote (bounce rate), lo que mejora la reputación de tu dominio ante proveedores como Gmail, Outlook o Yahoo.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Pega tus correos', text: 'Copia tu lista de emails y pégala en el cuadro de texto. Pueden estar separados por líneas, comas o espacios.' },
|
|
26
|
+
{ name: 'Limpia la lista', text: "Haz clic en el botón 'Limpiar Lista' para iniciar el proceso de validación y eliminación de duplicados." },
|
|
27
|
+
{ name: 'Revisa los resultados', text: 'Observa las estadísticas de correos originales vs. finales y revisa la lista depurada en el panel inferior.' },
|
|
28
|
+
{ name: 'Copia o descarga', text: 'Copia el resultado directamente al portapapeles o descárgalo como un archivo .txt listo para usar.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowTo> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: 'Cómo limpiar una lista de correos electrónicos',
|
|
45
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'SoftwareApplication',
|
|
51
|
+
name: 'Limpiador de Listas de Emails',
|
|
52
|
+
applicationCategory: 'UtilitiesApplication',
|
|
53
|
+
operatingSystem: 'Web',
|
|
54
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
55
|
+
description: 'Elimina duplicados, corrige espacios y valida formatos en tu lista de correos electrónicos. Herramienta gratuita sin límite de registros.',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const ui: EmailListCleanerUI = {
|
|
59
|
+
inputLabel: 'Lista de correos electrónicos',
|
|
60
|
+
inputPlaceholder: 'Pega aquí tu lista de emails (separados por líneas, comas o espacios)...',
|
|
61
|
+
cleanBtn: 'Limpiar Lista',
|
|
62
|
+
clearBtn: 'Borrar Todo',
|
|
63
|
+
statsOriginal: 'Originales',
|
|
64
|
+
statsRemoved: 'Eliminados',
|
|
65
|
+
statsFinal: 'Limpios',
|
|
66
|
+
resultLabel: 'Resultado Limpio',
|
|
67
|
+
copyBtn: 'Copiar Lista',
|
|
68
|
+
copyDone: '¡Copiado!',
|
|
69
|
+
downloadBtn: 'Descargar .txt',
|
|
70
|
+
registered: 'registrados',
|
|
71
|
+
downloadFilename: 'emails-limpios',
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const content: ToolLocaleContent<EmailListCleanerUI> = {
|
|
75
|
+
slug: 'limpiador-listas-emails',
|
|
76
|
+
title: 'Limpiador de Listas de Emails',
|
|
77
|
+
description: 'Limpia listas de correos electrónicos gratis. Elimina duplicados, corrige espacios y valida formatos en segundos. Ahorra costes y mejora tu entregabilidad.',
|
|
78
|
+
ui,
|
|
79
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
80
|
+
faq: faqData,
|
|
81
|
+
howTo: howToData,
|
|
82
|
+
bibliographyTitle: 'Referencias',
|
|
83
|
+
bibliography: [
|
|
84
|
+
{ name: 'RFC 5322: Internet Message Format', url: 'https://datatracker.ietf.org/doc/html/rfc5322' },
|
|
85
|
+
{ name: 'Google: Guía de entregabilidad de correo electrónico', url: 'https://support.google.com/a/answer/81126' },
|
|
86
|
+
{ name: 'Wikipedia: Correo electrónico no solicitado', url: 'https://es.wikipedia.org/wiki/Spam' },
|
|
87
|
+
],
|
|
88
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
89
|
+
seo: [
|
|
90
|
+
{ type: 'title', level: 2, text: '¿Por qué es fundamental utilizar un limpiador de listas de emails?' },
|
|
91
|
+
{
|
|
92
|
+
type: 'paragraph',
|
|
93
|
+
html: 'En el mundo del marketing digital, la calidad de tu base de datos es mucho más importante que la cantidad. Tener una lista de 50.000 correos no sirve de nada si la mitad son direcciones inexistentes, contienen errores tipográficos o están duplicadas. Aquí es donde entra en juego un <strong>limpiador de listas de emails</strong>.',
|
|
94
|
+
},
|
|
95
|
+
{ type: 'title', level: 3, text: 'Los peligros de una lista de correos sucia' },
|
|
96
|
+
{
|
|
97
|
+
type: 'paragraph',
|
|
98
|
+
html: 'Mantener una base de datos sin depurar puede acarrear consecuencias graves. Cuando envías correos a direcciones que no existen, generas un "hard bounce". Si este porcentaje supera el 2-3%, los filtros antispam empezarán a vigilarte de cerca y podrías acabar en una lista negra internacional.',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'tip',
|
|
102
|
+
title: 'Consejo de experto',
|
|
103
|
+
html: 'Nunca compres listas de correos. Es la forma más rápida de arruinar la reputación de tu dominio. Construye tu propia lista de forma orgánica y límpiala cada 3 o 6 meses.',
|
|
104
|
+
},
|
|
105
|
+
{ type: 'title', level: 3, text: 'Cómo nuestra herramienta optimiza tu base de datos' },
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Nuestra utilidad gratuita realiza una limpieza profunda y rápida de tus bases de datos sin límites de registros. Ejecuta varias tareas críticas de validación de forma instantánea:',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'list',
|
|
112
|
+
items: [
|
|
113
|
+
'<strong>Eliminación de duplicados:</strong> Un mismo usuario no recibirá dos veces el mismo correo.',
|
|
114
|
+
'<strong>Corrección de espacios:</strong> Eliminamos espacios accidentales al inicio o final que invalidarían el envío.',
|
|
115
|
+
'<strong>Validación de formato:</strong> Filtramos entradas que no tengan estructura de email válida.',
|
|
116
|
+
'<strong>Normalización:</strong> Convertimos todo a minúsculas para evitar registros redundantes.',
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{ type: 'title', level: 3, text: 'Cuándo es el momento ideal para limpiar tu lista' },
|
|
120
|
+
{
|
|
121
|
+
type: 'list',
|
|
122
|
+
items: [
|
|
123
|
+
'Antes de importar contactos a un nuevo CRM o plataforma de envío (Mailchimp, SendGrid, etc.).',
|
|
124
|
+
'Si notas que tu tasa de apertura ha caído por debajo del promedio habitual.',
|
|
125
|
+
'Después de un evento o feria donde hayas recogido datos manualmente.',
|
|
126
|
+
'Como mantenimiento preventivo cada trimestre para mantener la salud del dominio.',
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
{ type: 'title', level: 3, text: 'Impacto en el retorno de inversión' },
|
|
130
|
+
{
|
|
131
|
+
type: 'paragraph',
|
|
132
|
+
html: 'El marketing por correo electrónico sigue siendo uno de los canales con mayor ROI, pero solo si los mensajes llegan a la bandeja de entrada. Al usar un <strong>limpiador de correos</strong>, estás optimizando tu embudo de ventas desde el origen y dejando de pagar a plataformas por contactos que nunca verán tus mensajes.',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'tip',
|
|
136
|
+
title: 'Implementa el doble opt in',
|
|
137
|
+
html: 'La mejor manera de evitar correos falsos es requerir que el usuario confirme su suscripción haciendo clic en un enlace enviado a su bandeja de entrada. Esto garantiza que el correo existe y que el usuario tiene acceso a él.',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { EmailListCleanerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Que fait exactement ce nettoyeur de liste d\'emails ?',
|
|
8
|
+
answer: 'L\'outil analyse votre liste d\'e-mails, supprime les doublons, enlève les espaces inutiles, valide le format de base et normalise toutes les adresses en minuscules pour garantir une base de données impeccable.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Y a-t-il une limite sur le nombre d\'e-mails ?',
|
|
12
|
+
answer: 'Il n\'y a pas de limite stricte. Vous pouvez traiter des milliers d\'e-mails instantanément en une seule fois. La seule contrainte est la mémoire de votre propre navigateur si la liste est extrêmement grande.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Est-il sécurisé de coller mes e-mails ici ?',
|
|
16
|
+
answer: 'Absolument. Tout le traitement est effectué localement dans votre navigateur via JavaScript. Vos données ne sont jamais envoyées à nos serveurs ni stockées dans une base de données externe.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Comment cela améliore-t-il la délivrabilité de mes campagnes ?',
|
|
20
|
+
answer: 'En supprimant les adresses inexistantes ou mal formées, vous réduisez votre taux de rebond (bounce rate), ce qui améliore la réputation de votre domaine auprès de fournisseurs comme Gmail, Outlook ou Yahoo.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Collez vos e-mails', text: 'Copiez votre liste d\'e-mails et collez-la dans la zone de texte. Ils peuvent être séparés par des lignes, des virgules ou des espaces.' },
|
|
26
|
+
{ name: 'Nettoyez la liste', text: "Cliquez sur le bouton 'Nettoyer la liste' pour lancer le processus de validation et de suppression des doublons." },
|
|
27
|
+
{ name: 'Consultez les résultats', text: 'Vérifiez les statistiques montrant les e-mails originaux vs. finaux et consultez la liste nettoyée dans le panneau inférieur.' },
|
|
28
|
+
{ name: 'Copiez ou téléchargez', text: 'Copiez le résultat directement dans le presse-papiers ou téléchargez-le sous forme de fichier .txt prêt à l\'emploi.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowTo> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: 'Comment nettoyer une liste d\'e-mails',
|
|
45
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'SoftwareApplication',
|
|
51
|
+
name: 'Nettoyeur de Listes d\'E-mails',
|
|
52
|
+
applicationCategory: 'UtilitiesApplication',
|
|
53
|
+
operatingSystem: 'Web',
|
|
54
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
55
|
+
description: 'Supprimez les doublons, corrigez les espaces et validez les formats de votre liste d\'e-mails. Outil gratuit sans limite de registres.',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const ui: EmailListCleanerUI = {
|
|
59
|
+
inputLabel: 'Liste d\'adresses e-mail',
|
|
60
|
+
inputPlaceholder: 'Collez ici votre liste d\'e-mails (séparés par des lignes, des virgules ou des espaces)...',
|
|
61
|
+
cleanBtn: 'Nettoyer la liste',
|
|
62
|
+
clearBtn: 'Tout effacer',
|
|
63
|
+
statsOriginal: 'Originaux',
|
|
64
|
+
statsRemoved: 'Supprimés',
|
|
65
|
+
statsFinal: 'Propres',
|
|
66
|
+
resultLabel: 'Résultat propre',
|
|
67
|
+
copyBtn: 'Copier la liste',
|
|
68
|
+
copyDone: 'Copié !',
|
|
69
|
+
downloadBtn: 'Télécharger .txt',
|
|
70
|
+
registered: 'enregistrés',
|
|
71
|
+
downloadFilename: 'emails-propres',
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const content: ToolLocaleContent<EmailListCleanerUI> = {
|
|
75
|
+
slug: 'nettoyeur-listes-emails',
|
|
76
|
+
title: 'Nettoyeur de Listes d\'E-mails',
|
|
77
|
+
description: 'Nettoyez vos listes d\'e-mails gratuitement. Supprimez les doublons, corrigez les espaces et validez les formats en quelques secondes. Économisez et améliorez votre délivrabilité.',
|
|
78
|
+
ui,
|
|
79
|
+
faqTitle: 'Questions Fréquentes',
|
|
80
|
+
faq: faqData,
|
|
81
|
+
howTo: howToData,
|
|
82
|
+
bibliographyTitle: 'Références',
|
|
83
|
+
bibliography: [
|
|
84
|
+
{ name: 'RFC 5322 : Format des messages Internet', url: 'https://datatracker.ietf.org/doc/html/rfc5322' },
|
|
85
|
+
{ name: 'Google : Directives pour les expéditeurs d\'e-mails', url: 'https://support.google.com/a/answer/81126' },
|
|
86
|
+
{ name: 'Wikipedia : Spam (courrier électronique)', url: 'https://fr.wikipedia.org/wiki/Spam' },
|
|
87
|
+
],
|
|
88
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
89
|
+
seo: [
|
|
90
|
+
{ type: 'title', level: 2, text: 'Pourquoi utiliser un nettoyeur de listes d\'e-mails est-il essentiel ?' },
|
|
91
|
+
{
|
|
92
|
+
type: 'paragraph',
|
|
93
|
+
html: 'Dans le monde du marketing digital, la qualité de votre base de données compte bien plus que sa taille. Avoir une liste de 50 000 e-mails ne sert à rien si la moitié sont des adresses inexistantes, contiennent des fautes de frappe ou sont en double. C\'est là qu\'un <strong>nettoyeur de listes d\'e-mails</strong> devient indispensable.',
|
|
94
|
+
},
|
|
95
|
+
{ type: 'title', level: 3, text: 'Les risques d\'une liste d\'e-mails non nettoyée' },
|
|
96
|
+
{
|
|
97
|
+
type: 'paragraph',
|
|
98
|
+
html: 'Conserver une base de données non nettoyée peut avoir de graves conséquences. Envoyer des e-mails à des adresses inexistantes génère un "hard bounce". Si ce pourcentage dépasse 2-3 %, les filtres anti-spam commenceront à surveiller votre domaine et vous pourriez finir sur une liste noire internationale.',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'tip',
|
|
102
|
+
title: 'Conseil d\'expert',
|
|
103
|
+
html: 'N\'achetez jamais de listes d\'e-mails. C\'est le moyen le plus rapide de ruiner la réputation de votre domaine. Construisez votre propre liste de manière organique et nettoyez-la tous les 3 à 6 mois.',
|
|
104
|
+
},
|
|
105
|
+
{ type: 'title', level: 3, text: 'Comment notre outil optimise votre base de données' },
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Notre utilitaire gratuit effectue un nettoyage approfondi et rapide de vos bases de données sans limite de registres. Il exécute plusieurs tâches de validation critiques instantanément :',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'list',
|
|
112
|
+
items: [
|
|
113
|
+
'<strong>Suppression des doublons :</strong> Le même utilisateur ne recevra pas deux fois le même e-mail.',
|
|
114
|
+
'<strong>Correction des espaces :</strong> Nous supprimons les espaces accidentels en début ou fin d\'adresse qui invalideraient l\'envoi.',
|
|
115
|
+
'<strong>Validation du format :</strong> Nous filtrons les entrées qui n\'ont pas une structure d\'e-mail valide.',
|
|
116
|
+
'<strong>Normalisation :</strong> Tout est converti en minuscules pour éviter les enregistrements redondants.',
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{ type: 'title', level: 3, text: 'Quand est-il temps de nettoyer votre liste ?' },
|
|
120
|
+
{
|
|
121
|
+
type: 'list',
|
|
122
|
+
items: [
|
|
123
|
+
'Avant d\'importer des contacts dans un nouveau CRM ou une plateforme d\'envoi (Mailchimp, SendGrid, etc.).',
|
|
124
|
+
'Si vous constatez que votre taux d\'ouverture est tombé en dessous de votre moyenne habituelle.',
|
|
125
|
+
'Après un événement ou un salon où vous avez collecté des données manuellement.',
|
|
126
|
+
'En maintenance préventive chaque trimestre pour maintenir la santé de votre domaine.',
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
{ type: 'title', level: 3, text: 'Impact sur le retour sur investissement' },
|
|
130
|
+
{
|
|
131
|
+
type: 'paragraph',
|
|
132
|
+
html: 'L\'e-mail marketing reste l\'un des canaux avec le meilleur ROI, mais seulement si les messages arrivent en boîte de réception. En utilisant un <strong>nettoyeur d\'e-mails</strong>, vous optimisez votre entonnoir de vente dès la source et arrêtez de payer des plateformes pour des contacts qui ne verront jamais vos messages.',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'tip',
|
|
136
|
+
title: 'Utilisez le double opt in',
|
|
137
|
+
html: 'La meilleure façon d\'éviter les faux e-mails est d\'exiger que l\'utilisateur confirme son abonnement en cliquant sur un lien envoyé dans sa boîte de réception. Cela garantit que l\'e-mail existe et que l\'utilisateur y a accès.',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
|
+
import type { EmailListCleanerUI } from './ui';
|
|
3
|
+
import EmailListCleanerComponent from './component.astro';
|
|
4
|
+
import EmailListCleanerSEO from './seo.astro';
|
|
5
|
+
import EmailListCleanerBibliography from './bibliography.astro';
|
|
6
|
+
|
|
7
|
+
export const emailListCleaner: ToolsToolEntry<EmailListCleanerUI> = {
|
|
8
|
+
id: 'email-list-cleaner',
|
|
9
|
+
icons: { bg: 'mdi:email-check-outline', fg: 'mdi:email-remove' },
|
|
10
|
+
i18n: {
|
|
11
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
12
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
13
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const EMAIL_LIST_CLEANER_TOOL: ToolDefinition = {
|
|
18
|
+
entry: emailListCleaner,
|
|
19
|
+
Component: EmailListCleanerComponent,
|
|
20
|
+
SEOComponent: EmailListCleanerSEO,
|
|
21
|
+
BibliographyComponent: EmailListCleanerBibliography,
|
|
22
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { emailListCleaner } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await emailListCleaner.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface EmailListCleanerUI extends Record<string, string> {
|
|
2
|
+
inputLabel: string;
|
|
3
|
+
inputPlaceholder: string;
|
|
4
|
+
cleanBtn: string;
|
|
5
|
+
clearBtn: string;
|
|
6
|
+
statsOriginal: string;
|
|
7
|
+
statsRemoved: string;
|
|
8
|
+
statsFinal: string;
|
|
9
|
+
resultLabel: string;
|
|
10
|
+
copyBtn: string;
|
|
11
|
+
copyDone: string;
|
|
12
|
+
downloadBtn: string;
|
|
13
|
+
registered: string;
|
|
14
|
+
downloadFilename: string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { envBadgeSpain } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await envBadgeSpain.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|