Programmatically Subscribing a Customer to the Newsletter List

Recently we had to import a list of newsletter subscribers into Magento. We had already loaded all the customers, but now we needed to subscribe all of the customers that had subscribed on the customer’s old site on the new. The following code (simplified for display here) did the trick!

[sourcecode]
Mage.php”);

Mage::app();

$email = “joe@blow.com”;

// THE “EASY” WAY (but sends a confirmation email to the customer
$subscriber = Mage::getModel(‘newsletter/subscriber’)->subscribe($email);

// THE “HARD” WAY (Doesn’t send confirmation email to customer)
// load up the customer we want to subscribe
$customer = Mage::getModel(‘customer/customer’)
->setWebsiteId(1)
->loadByEmail($email);

// if we found the customer
if ($customer->getId()){
// load up the subscriber if possible
$subscriber = Mage::getModel(‘newsletter/subscriber’)->loadByEmail($email);

if (!$subscriber->getId()
|| $subscriber->getStatus() == Mage_Newsletter_Model_Subscriber::STATUS_UNSUBSCRIBED
|| $subscriber->getStatus() == Mage_Newsletter_Model_Subscriber::STATUS_NOT_ACTIVE) {

$subscriber->setStatus(Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED);
$subscriber->setSubscriberEmail($email);
$subscriber->setSubscriberConfirmCode($subscriber->RandomSequence());
}

$subscriber->setStoreId(Mage::app()->getStore()->getId());
$subscriber->setCustomerId($customer->getId());

try {
$subscriber->save();
}
catch (Exception $e) {
throw new Exception($e->getMessage());
}
}

[/sourcecode]