46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import axios from 'axios';
|
|
import crypto from 'crypto';
|
|
|
|
// Environment variables for Mailchimp
|
|
const API_KEY = process.env.MAILCHIMP_API_KEY;
|
|
const SERVER_PREFIX = process.env.MAILCHIMP_SERVER_PREFIX;
|
|
const LIST_ID = process.env.MAILCHIMP_LIST_ID;
|
|
|
|
/**
|
|
* Subscribe a new email to the Mailchimp list
|
|
*/
|
|
export async function subscribeToMailchimp(email: string) {
|
|
if (!API_KEY || !SERVER_PREFIX || !LIST_ID) {
|
|
throw new Error('Mailchimp configuration missing. Please check your environment variables.');
|
|
}
|
|
|
|
try {
|
|
// Create MD5 hash of lowercase email for Mailchimp
|
|
const emailHash = crypto.createHash('md5').update(email.toLowerCase()).digest('hex');
|
|
|
|
// Set up the request
|
|
const url = `https://${SERVER_PREFIX}.api.mailchimp.com/3.0/lists/${LIST_ID}/members`;
|
|
const data = {
|
|
email_address: email,
|
|
status: 'subscribed'
|
|
};
|
|
|
|
const response = await axios.post(url, data, {
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': `Basic ${Buffer.from(`apikey:${API_KEY}`).toString('base64')}`
|
|
}
|
|
});
|
|
|
|
return response.data;
|
|
} catch (error: any) {
|
|
// Handle existing subscribers gracefully
|
|
if (error.response && error.response.status === 400 &&
|
|
error.response.data && error.response.data.title === 'Member Exists') {
|
|
return { status: 'already_subscribed', message: 'This email is already subscribed to our newsletter.' };
|
|
}
|
|
|
|
// For other errors, re-throw with more context
|
|
throw new Error(`Failed to subscribe to newsletter: ${error.message}`);
|
|
}
|
|
} |