initial commit
This commit is contained in:
commit
619cb97fa3
23 changed files with 9242 additions and 0 deletions
103
examples/basic-usage.ts
Normal file
103
examples/basic-usage.ts
Normal file
|
@ -0,0 +1,103 @@
|
|||
#!/usr/bin/env ts-node
|
||||
|
||||
/**
|
||||
* Basic usage example for SMTP over WebSocket client
|
||||
*/
|
||||
|
||||
import { SMTPOverWSClient, MessagePriority } from '../src/index';
|
||||
|
||||
async function basicUsageExample() {
|
||||
console.log('Starting SMTP WebSocket Client Basic Example\n');
|
||||
|
||||
// Create client with basic configuration
|
||||
const client = new SMTPOverWSClient({
|
||||
url: 'ws://localhost:3000/smtp', // Replace with your server URL
|
||||
apiKey: 'your-api-key-here', // Replace with your API key
|
||||
debug: true,
|
||||
reconnectInterval: 5000,
|
||||
maxReconnectAttempts: 3
|
||||
});
|
||||
|
||||
// Set up event listeners
|
||||
client.on('connected', () => {
|
||||
console.log('Connected to WebSocket server');
|
||||
});
|
||||
|
||||
client.on('authenticated', () => {
|
||||
console.log('Authentication successful');
|
||||
});
|
||||
|
||||
client.on('disconnected', (reason) => {
|
||||
console.log(`Disconnected: ${reason || 'Unknown reason'}`);
|
||||
});
|
||||
|
||||
client.on('error', (error) => {
|
||||
console.error('Client error:', error.message);
|
||||
});
|
||||
|
||||
client.on('messageQueued', (messageId, queueSize) => {
|
||||
console.log(`Message ${messageId} queued (Queue size: ${queueSize})`);
|
||||
});
|
||||
|
||||
client.on('messageProcessed', (messageId, responseTime) => {
|
||||
console.log(`Message ${messageId} processed in ${responseTime}ms`);
|
||||
});
|
||||
|
||||
try {
|
||||
console.log('Sending SMTP commands...\n');
|
||||
|
||||
// Send basic SMTP sequence
|
||||
const ehloResponse = await client.sendSMTPCommand('EHLO example.com\r\n');
|
||||
console.log('EHLO Response:', ehloResponse.trim());
|
||||
|
||||
const mailFromResponse = await client.sendSMTPCommand('MAIL FROM: <sender@example.com>\r\n');
|
||||
console.log('MAIL FROM Response:', mailFromResponse.trim());
|
||||
|
||||
const rcptToResponse = await client.sendSMTPCommand('RCPT TO: <recipient@example.com>\r\n');
|
||||
console.log('RCPT TO Response:', rcptToResponse.trim());
|
||||
|
||||
const dataResponse = await client.sendSMTPCommand('DATA\r\n');
|
||||
console.log('DATA Response:', dataResponse.trim());
|
||||
|
||||
// Send email content
|
||||
const emailContent = `From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email.\r\n.\r\n`;
|
||||
const contentResponse = await client.sendSMTPCommand(emailContent);
|
||||
console.log('Content Response:', contentResponse.trim());
|
||||
|
||||
const quitResponse = await client.sendSMTPCommand('QUIT\r\n');
|
||||
console.log('QUIT Response:', quitResponse.trim());
|
||||
|
||||
console.log('\nAll SMTP commands sent successfully!');
|
||||
|
||||
// Display statistics
|
||||
const stats = client.getStats();
|
||||
console.log('\nClient Statistics:');
|
||||
console.log(` Messages Queued: ${stats.messagesQueued}`);
|
||||
console.log(` Messages Processed: ${stats.messagesProcessed}`);
|
||||
console.log(` Messages Failed: ${stats.messagesFailed}`);
|
||||
console.log(` Average Response Time: ${stats.averageResponseTime.toFixed(2)}ms`);
|
||||
console.log(` Connection Uptime: ${stats.connectionUptime}ms`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error during SMTP communication:', error);
|
||||
} finally {
|
||||
console.log('\nShutting down client...');
|
||||
await client.shutdown();
|
||||
console.log('Client shutdown complete');
|
||||
}
|
||||
}
|
||||
|
||||
// Run the example
|
||||
if (require.main === module) {
|
||||
basicUsageExample()
|
||||
.then(() => {
|
||||
console.log('\nBasic usage example completed successfully');
|
||||
process.exit(0);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('\nExample failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
export { basicUsageExample };
|
210
examples/bulk-email.ts
Normal file
210
examples/bulk-email.ts
Normal file
|
@ -0,0 +1,210 @@
|
|||
#!/usr/bin/env ts-node
|
||||
|
||||
/**
|
||||
* Bulk email sending example using Nodemailer transport
|
||||
*/
|
||||
|
||||
import nodemailer from 'nodemailer';
|
||||
import { createTransport } from '../src/index';
|
||||
|
||||
async function bulkEmailExample() {
|
||||
console.log('Bulk Email Example using SMTP WebSocket Transport\n');
|
||||
|
||||
// Create the WebSocket transport
|
||||
const transport = createTransport({
|
||||
host: 'localhost',
|
||||
port: 3000,
|
||||
auth: {
|
||||
user: 'your-api-key-here'
|
||||
},
|
||||
maxQueueSize: 1000, // Handle large queues
|
||||
debug: false // Disable debug for bulk operations
|
||||
});
|
||||
|
||||
const transporter = nodemailer.createTransporter(transport);
|
||||
|
||||
// Sample recipient list
|
||||
const recipients = [
|
||||
{ email: 'user1@example.com', name: 'User One' },
|
||||
{ email: 'user2@example.com', name: 'User Two' },
|
||||
{ email: 'user3@example.com', name: 'User Three' },
|
||||
{ email: 'user4@example.com', name: 'User Four' },
|
||||
{ email: 'user5@example.com', name: 'User Five' }
|
||||
];
|
||||
|
||||
console.log(`Sending emails to ${recipients.length} recipients...\n`);
|
||||
|
||||
const results = [];
|
||||
const startTime = Date.now();
|
||||
|
||||
// Send emails concurrently (transport handles queuing automatically)
|
||||
const emailPromises = recipients.map(async (recipient, index) => {
|
||||
try {
|
||||
const info = await transporter.sendMail({
|
||||
from: 'newsletter@example.com',
|
||||
to: recipient.email,
|
||||
subject: `Newsletter #${index + 1} - ${new Date().toLocaleDateString()}`,
|
||||
text: `Hello ${recipient.name}!\n\nThis is your personalized newsletter.\n\nBest regards,\nThe Newsletter Team`,
|
||||
html: `
|
||||
<h2>Hello ${recipient.name}!</h2>
|
||||
<p>This is your personalized newsletter for ${new Date().toLocaleDateString()}.</p>
|
||||
<p>This email was delivered via our SMTP WebSocket transport system.</p>
|
||||
<hr>
|
||||
<p><small>Newsletter #${index + 1} | Sent at ${new Date().toLocaleTimeString()}</small></p>
|
||||
`
|
||||
});
|
||||
|
||||
console.log(`Email ${index + 1}/${recipients.length} sent to ${recipient.email}`);
|
||||
return {
|
||||
success: true,
|
||||
recipient: recipient.email,
|
||||
messageId: info.messageId,
|
||||
response: info.response
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error(`Failed to send email ${index + 1} to ${recipient.email}:`, (error as Error).message);
|
||||
return {
|
||||
success: false,
|
||||
recipient: recipient.email,
|
||||
error: (error as Error).message
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// Wait for all emails to complete
|
||||
const emailResults = await Promise.allSettled(emailPromises);
|
||||
const duration = Date.now() - startTime;
|
||||
|
||||
// Process results
|
||||
let successful = 0;
|
||||
let failed = 0;
|
||||
|
||||
emailResults.forEach((result) => {
|
||||
if (result.status === 'fulfilled') {
|
||||
results.push(result.value);
|
||||
if (result.value.success) {
|
||||
successful++;
|
||||
} else {
|
||||
failed++;
|
||||
}
|
||||
} else {
|
||||
failed++;
|
||||
results.push({
|
||||
success: false,
|
||||
error: result.reason.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Display summary
|
||||
console.log('\n--- Bulk Email Results ---');
|
||||
console.log(`Total emails: ${recipients.length}`);
|
||||
console.log(`Successful: ${successful}`);
|
||||
console.log(`Failed: ${failed}`);
|
||||
console.log(`Duration: ${(duration / 1000).toFixed(2)} seconds`);
|
||||
console.log(`Average time per email: ${(duration / recipients.length).toFixed(0)}ms`);
|
||||
|
||||
// Display failed emails if any
|
||||
if (failed > 0) {
|
||||
console.log('\nFailed emails:');
|
||||
results.forEach((result, index) => {
|
||||
if (!result.success) {
|
||||
console.log(` ${index + 1}. ${result.recipient || 'Unknown'}: ${result.error}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Close transport
|
||||
await transport.close();
|
||||
console.log('\nTransport closed');
|
||||
}
|
||||
|
||||
// Advanced bulk email with throttling
|
||||
async function throttledBulkEmail() {
|
||||
console.log('\nThrottled Bulk Email Example\n');
|
||||
|
||||
const transport = createTransport({
|
||||
host: 'localhost',
|
||||
port: 3000,
|
||||
auth: {
|
||||
user: 'your-api-key-here'
|
||||
}
|
||||
});
|
||||
|
||||
const transporter = nodemailer.createTransporter(transport);
|
||||
|
||||
// Generate larger recipient list
|
||||
const recipients = Array.from({ length: 20 }, (_, i) => ({
|
||||
email: `user${i + 1}@example.com`,
|
||||
name: `User ${i + 1}`
|
||||
}));
|
||||
|
||||
console.log(`Sending throttled emails to ${recipients.length} recipients...`);
|
||||
console.log('Processing 5 emails at a time with 1 second delay between batches\n');
|
||||
|
||||
const batchSize = 5;
|
||||
const batches = [];
|
||||
|
||||
for (let i = 0; i < recipients.length; i += batchSize) {
|
||||
batches.push(recipients.slice(i, i + batchSize));
|
||||
}
|
||||
|
||||
let totalSuccessful = 0;
|
||||
let totalFailed = 0;
|
||||
|
||||
for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {
|
||||
const batch = batches[batchIndex];
|
||||
console.log(`Processing batch ${batchIndex + 1}/${batches.length} (${batch.length} emails)...`);
|
||||
|
||||
const batchPromises = batch.map(async (recipient) => {
|
||||
try {
|
||||
await transporter.sendMail({
|
||||
from: 'batch@example.com',
|
||||
to: recipient.email,
|
||||
subject: `Batch Email - ${recipient.name}`,
|
||||
text: `Hello ${recipient.name}, this is a batch email.`
|
||||
});
|
||||
return { success: true, email: recipient.email };
|
||||
} catch (error) {
|
||||
return { success: false, email: recipient.email, error: (error as Error).message };
|
||||
}
|
||||
});
|
||||
|
||||
const batchResults = await Promise.all(batchPromises);
|
||||
|
||||
const batchSuccessful = batchResults.filter(r => r.success).length;
|
||||
const batchFailed = batchResults.filter(r => !r.success).length;
|
||||
|
||||
totalSuccessful += batchSuccessful;
|
||||
totalFailed += batchFailed;
|
||||
|
||||
console.log(`Batch ${batchIndex + 1} complete: ${batchSuccessful} successful, ${batchFailed} failed`);
|
||||
|
||||
// Wait between batches (except for the last one)
|
||||
if (batchIndex < batches.length - 1) {
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\nThrottled bulk email complete: ${totalSuccessful} successful, ${totalFailed} failed`);
|
||||
|
||||
await transport.close();
|
||||
}
|
||||
|
||||
// Run the examples
|
||||
if (require.main === module) {
|
||||
(async () => {
|
||||
try {
|
||||
await bulkEmailExample();
|
||||
await throttledBulkEmail();
|
||||
console.log('\nBulk email examples completed successfully');
|
||||
} catch (error) {
|
||||
console.error('\nExamples failed:', error);
|
||||
} finally {
|
||||
process.exit(0);
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
export { bulkEmailExample, throttledBulkEmail };
|
88
examples/nodemailer-transport.ts
Normal file
88
examples/nodemailer-transport.ts
Normal file
|
@ -0,0 +1,88 @@
|
|||
#!/usr/bin/env ts-node
|
||||
|
||||
/**
|
||||
* Nodemailer transport example for SMTP over WebSocket
|
||||
*/
|
||||
|
||||
import nodemailer from 'nodemailer';
|
||||
import { createTransport } from '../src/index';
|
||||
|
||||
async function nodemailerTransportExample() {
|
||||
console.log('Nodemailer SMTP WebSocket Transport Example\n');
|
||||
|
||||
// Create the WebSocket transport
|
||||
const transport = createTransport({
|
||||
host: '192.168.0.62',
|
||||
port: 80,
|
||||
secure: false, // Set to true for wss://
|
||||
auth: {
|
||||
user: 'cebc9a7f-4e0c-4fda-9dd0-85f48c02800c' // Your SMTP relay API key
|
||||
},
|
||||
debug: true
|
||||
});
|
||||
|
||||
// Create Nodemailer transporter
|
||||
const transporter = nodemailer.createTransport(transport);
|
||||
|
||||
// Verify the transport configuration
|
||||
try {
|
||||
console.log('Verifying transport configuration...');
|
||||
await transporter.verify();
|
||||
console.log('Transport verification successful\n');
|
||||
} catch (error) {
|
||||
console.error('Transport verification failed:', error);
|
||||
return;
|
||||
}
|
||||
|
||||
// Send a test email
|
||||
try {
|
||||
console.log('Sending test email...');
|
||||
|
||||
const info = await transporter.sendMail({
|
||||
from: 'sender@example.com',
|
||||
to: 'recipient@example.com',
|
||||
subject: 'Test Email via SMTP WebSocket',
|
||||
text: 'This email was sent using the SMTP WebSocket transport!',
|
||||
html: `
|
||||
<h1>Test Email</h1>
|
||||
<p>This email was sent using the <strong>SMTP WebSocket transport</strong>!</p>
|
||||
<p>Features:</p>
|
||||
<ul>
|
||||
<li>Automatic connection management</li>
|
||||
<li>Queue-based message handling</li>
|
||||
<li>Nodemailer compatibility</li>
|
||||
<li>WebSocket-based SMTP relay</li>
|
||||
</ul>
|
||||
`
|
||||
});
|
||||
|
||||
console.log('Email sent successfully!');
|
||||
console.log('Message ID:', info.messageId);
|
||||
console.log('Accepted recipients:', info.accepted);
|
||||
console.log('Rejected recipients:', info.rejected);
|
||||
console.log('Response:', info.response);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Failed to send email:', error);
|
||||
} finally {
|
||||
// Close the transport
|
||||
console.log('\nClosing transport...');
|
||||
await transport.close();
|
||||
console.log('Transport closed');
|
||||
}
|
||||
}
|
||||
|
||||
// Run the example
|
||||
if (require.main === module) {
|
||||
nodemailerTransportExample()
|
||||
.then(() => {
|
||||
console.log('\nNodemailer transport example completed successfully');
|
||||
process.exit(0);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('\nExample failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
export { nodemailerTransportExample };
|
226
examples/queue-management.ts
Normal file
226
examples/queue-management.ts
Normal file
|
@ -0,0 +1,226 @@
|
|||
#!/usr/bin/env ts-node
|
||||
|
||||
/**
|
||||
* Queue management and priority example for SMTP over WebSocket client
|
||||
*/
|
||||
|
||||
import { SMTPOverWSClient, MessagePriority } from '../src/index';
|
||||
|
||||
async function queueManagementExample() {
|
||||
console.log('Starting SMTP WebSocket Client Queue Management Example\n');
|
||||
|
||||
// Create client - queue management is automatic
|
||||
const client = new SMTPOverWSClient({
|
||||
url: 'ws://localhost:3000/smtp',
|
||||
apiKey: 'your-api-key-here',
|
||||
debug: true,
|
||||
maxQueueSize: 100,
|
||||
reconnectInterval: 2000,
|
||||
maxReconnectAttempts: 5
|
||||
});
|
||||
|
||||
// Set up comprehensive event monitoring
|
||||
client.on('connecting', () => {
|
||||
console.log('Connecting to server...');
|
||||
});
|
||||
|
||||
client.on('connected', () => {
|
||||
console.log('Connected to WebSocket server');
|
||||
});
|
||||
|
||||
client.on('authenticated', () => {
|
||||
console.log('Authentication successful');
|
||||
});
|
||||
|
||||
client.on('queueProcessingStarted', (queueSize) => {
|
||||
console.log(`Queue processing started with ${queueSize} messages`);
|
||||
});
|
||||
|
||||
client.on('queueProcessingCompleted', (processed, failed) => {
|
||||
console.log(`Queue processing completed: ${processed} processed, ${failed} failed`);
|
||||
});
|
||||
|
||||
client.on('messageQueued', (messageId, queueSize) => {
|
||||
console.log(`Message ${messageId} queued (Queue: ${queueSize})`);
|
||||
});
|
||||
|
||||
client.on('messageProcessed', (messageId, responseTime) => {
|
||||
console.log(`Message ${messageId} processed in ${responseTime}ms`);
|
||||
});
|
||||
|
||||
client.on('messageFailed', (messageId, error) => {
|
||||
console.log(`Message ${messageId} failed: ${error.message}`);
|
||||
});
|
||||
|
||||
client.on('stateChanged', (oldState, newState) => {
|
||||
console.log(`State changed: ${oldState} → ${newState}`);
|
||||
});
|
||||
|
||||
try {
|
||||
console.log('Demonstrating priority-based queue management...\n');
|
||||
|
||||
// Queue multiple messages with different priorities
|
||||
const messagePromises: Promise<string>[] = [];
|
||||
|
||||
// Low priority messages (will be processed last)
|
||||
console.log('Queuing low priority messages...');
|
||||
for (let i = 1; i <= 3; i++) {
|
||||
const promise = client.sendSMTPCommand(`LOW PRIORITY ${i}\r\n`, {
|
||||
priority: MessagePriority.LOW,
|
||||
timeout: 30000
|
||||
});
|
||||
messagePromises.push(promise);
|
||||
}
|
||||
|
||||
// Normal priority messages
|
||||
console.log('Queuing normal priority messages...');
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
const promise = client.sendSMTPCommand(`NORMAL PRIORITY ${i}\r\n`, {
|
||||
priority: MessagePriority.NORMAL,
|
||||
timeout: 30000
|
||||
});
|
||||
messagePromises.push(promise);
|
||||
}
|
||||
|
||||
// High priority messages (will be processed first)
|
||||
console.log('Queuing high priority messages...');
|
||||
for (let i = 1; i <= 2; i++) {
|
||||
const promise = client.sendSMTPCommand(`HIGH PRIORITY ${i}\r\n`, {
|
||||
priority: MessagePriority.HIGH,
|
||||
timeout: 30000
|
||||
});
|
||||
messagePromises.push(promise);
|
||||
}
|
||||
|
||||
// Critical priority message (highest priority)
|
||||
console.log('Queuing critical priority message...');
|
||||
const criticalPromise = client.sendSMTPCommand('CRITICAL PRIORITY MESSAGE\r\n', {
|
||||
priority: MessagePriority.CRITICAL,
|
||||
timeout: 30000
|
||||
});
|
||||
messagePromises.push(criticalPromise);
|
||||
|
||||
console.log(`\nTotal messages queued: ${messagePromises.length}`);
|
||||
console.log(`Current queue size: ${client.getQueueSize()}`);
|
||||
|
||||
// Add some messages after a delay to show dynamic queuing
|
||||
setTimeout(() => {
|
||||
console.log('\nAdding more messages to active queue...');
|
||||
|
||||
const additionalPromises = [
|
||||
client.sendSMTPCommand('LATE HIGH PRIORITY\r\n', {
|
||||
priority: MessagePriority.HIGH
|
||||
}),
|
||||
client.sendSMTPCommand('LATE NORMAL PRIORITY\r\n', {
|
||||
priority: MessagePriority.NORMAL
|
||||
})
|
||||
];
|
||||
|
||||
messagePromises.push(...additionalPromises);
|
||||
}, 2000);
|
||||
|
||||
// Wait for all messages to be processed
|
||||
console.log('\nWaiting for all messages to be processed...\n');
|
||||
const responses = await Promise.allSettled(messagePromises);
|
||||
|
||||
// Analyze results
|
||||
console.log('\nProcessing Results:');
|
||||
let successful = 0;
|
||||
let failed = 0;
|
||||
|
||||
responses.forEach((result, index) => {
|
||||
if (result.status === 'fulfilled') {
|
||||
successful++;
|
||||
console.log(`Message ${index + 1}: ${result.value.trim()}`);
|
||||
} else {
|
||||
failed++;
|
||||
console.log(`Message ${index + 1}: ${result.reason.message}`);
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`\nSummary: ${successful} successful, ${failed} failed`);
|
||||
|
||||
// Display final statistics
|
||||
const stats = client.getStats();
|
||||
console.log('\nFinal Client Statistics:');
|
||||
console.log(` Messages Queued: ${stats.messagesQueued}`);
|
||||
console.log(` Messages Processed: ${stats.messagesProcessed}`);
|
||||
console.log(` Messages Failed: ${stats.messagesFailed}`);
|
||||
console.log(` Average Response Time: ${stats.averageResponseTime.toFixed(2)}ms`);
|
||||
console.log(` Total Connections: ${stats.totalConnections}`);
|
||||
console.log(` Reconnection Attempts: ${stats.reconnectionAttempts}`);
|
||||
console.log(` Connection Uptime: ${(stats.connectionUptime / 1000).toFixed(2)}s`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error during queue management demo:', error);
|
||||
} finally {
|
||||
console.log('\nShutting down client...');
|
||||
await client.shutdown(10000); // 10 second timeout
|
||||
console.log('Client shutdown complete');
|
||||
}
|
||||
}
|
||||
|
||||
// Simulate network issues for demonstration
|
||||
async function resilenceExample() {
|
||||
console.log('\nStarting resilience demonstration...\n');
|
||||
|
||||
const client = new SMTPOverWSClient({
|
||||
url: 'ws://localhost:3000/smtp',
|
||||
apiKey: 'your-api-key-here',
|
||||
debug: true,
|
||||
reconnectInterval: 1000,
|
||||
maxReconnectAttempts: 3,
|
||||
messageTimeout: 5000
|
||||
});
|
||||
|
||||
client.on('reconnecting', (attempt, maxAttempts) => {
|
||||
console.log(`Reconnection attempt ${attempt}/${maxAttempts}`);
|
||||
});
|
||||
|
||||
client.on('reconnected', () => {
|
||||
console.log('Successfully reconnected');
|
||||
});
|
||||
|
||||
client.on('error', (error) => {
|
||||
console.log(`Error handled: ${error.message}`);
|
||||
});
|
||||
|
||||
try {
|
||||
// Queue messages that will trigger reconnection scenarios
|
||||
const promises = [];
|
||||
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
promises.push(
|
||||
client.sendSMTPCommand(`RESILIENCE TEST ${i}\r\n`, {
|
||||
retries: 2,
|
||||
timeout: 10000
|
||||
}).catch(error => {
|
||||
console.log(`Message ${i} failed: ${error.message}`);
|
||||
return `FAILED: ${error.message}`;
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
await Promise.all(promises);
|
||||
|
||||
} finally {
|
||||
await client.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
// Run the examples
|
||||
if (require.main === module) {
|
||||
(async () => {
|
||||
try {
|
||||
await queueManagementExample();
|
||||
await resilenceExample();
|
||||
console.log('\nQueue management examples completed successfully');
|
||||
} catch (error) {
|
||||
console.error('\nExamples failed:', error);
|
||||
} finally {
|
||||
process.exit(0);
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
export { queueManagementExample, resilenceExample };
|
61
examples/simple-usage.ts
Normal file
61
examples/simple-usage.ts
Normal file
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/env ts-node
|
||||
|
||||
/**
|
||||
* Simple usage example for SMTP over WebSocket client
|
||||
*/
|
||||
|
||||
import { SMTPOverWSClient } from '../src/index';
|
||||
|
||||
async function simpleUsageExample() {
|
||||
console.log('Simple SMTP WebSocket Client Example\n');
|
||||
|
||||
// Create client - that's it, everything else is automatic
|
||||
const client = new SMTPOverWSClient({
|
||||
url: 'ws://localhost:3000/smtp',
|
||||
apiKey: 'your-api-key-here',
|
||||
debug: true
|
||||
});
|
||||
|
||||
try {
|
||||
// Just send commands - client handles connection, queuing, everything automatically
|
||||
console.log('Sending SMTP commands...');
|
||||
|
||||
const response1 = await client.sendSMTPCommand('EHLO example.com\r\n');
|
||||
console.log('EHLO:', response1.trim());
|
||||
|
||||
const response2 = await client.sendSMTPCommand('MAIL FROM: <test@example.com>\r\n');
|
||||
console.log('MAIL FROM:', response2.trim());
|
||||
|
||||
const response3 = await client.sendSMTPCommand('RCPT TO: <recipient@example.com>\r\n');
|
||||
console.log('RCPT TO:', response3.trim());
|
||||
|
||||
const response4 = await client.sendSMTPCommand('DATA\r\n');
|
||||
console.log('DATA:', response4.trim());
|
||||
|
||||
const response5 = await client.sendSMTPCommand('Subject: Test\r\n\r\nHello World!\r\n.\r\n');
|
||||
console.log('Message:', response5.trim());
|
||||
|
||||
const response6 = await client.sendSMTPCommand('QUIT\r\n');
|
||||
console.log('QUIT:', response6.trim());
|
||||
|
||||
console.log('\nAll done! Client automatically handled connection and cleanup.');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error:', error);
|
||||
} finally {
|
||||
// Optional - client will clean up automatically when process exits
|
||||
await client.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
// Run the example
|
||||
if (require.main === module) {
|
||||
simpleUsageExample()
|
||||
.then(() => process.exit(0))
|
||||
.catch((error) => {
|
||||
console.error('Example failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
export { simpleUsageExample };
|
Loading…
Add table
Add a link
Reference in a new issue