app/code/local/Russell/Emaillog/etc/adminhtml.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<menu>
<russell_admin_menu translate="title" module="russell_emaillog">
<title>Russell Configurations</title>
<sort_order>50</sort_order>
<children>
<russell_emaillog_entry translate="title" module="russell_emaillog">
<title>Email Log Config</title>
<children>
<emaillog translate="title" module="russell_emaillog">
<title>Review Logs Entries</title>
<action>adminhtml/emaillog_entry</action>
<sort_order>10</sort_order>
</emaillog>
</children>
<sort_order>250</sort_order>
</russell_emaillog_entry>
<russell_qa_options>
<title>QA Options</title>
<children>
<emailsend translate="title" module="russell_emaillog">
<title>Test Emails</title>
<action>adminhtml/emaillog_testemail</action>
<sort_order>10</sort_order>
</emailsend>
</children>
<sort_order>1000</sort_order>
</russell_qa_options>
</children>
</russell_admin_menu>
</menu>
<!-- Add ACL Settings under System > Permissions > Roles -->
<acl>
<resources>
<admin>
<children>
<russell_admin_menu>
<children>
<russell_emaillog_entry translate="title" module="russell_emaillog">
<title>Manage Email Log Entries Section</title>
<sort_order>250</sort_order>
</russell_emaillog_entry>
<russell_qa_options>
<title>QA Options</title>
<sort_order>260</sort_order>
</russell_qa_options>
</children>
</russell_admin_menu>
</children>
</admin>
</resources>
</acl>
</config>
app/code/local/Russell/Emaillog/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Russell_Emaillog>
<version>0.0.1</version>
</Russell_Emaillog>
</modules>
<global>
<blocks>
<russell_emaillog>
<class>Russell_Emaillog_Block</class>
</russell_emaillog>
</blocks>
<models>
<core>
<rewrite>
<email_template>Russell_Emaillog_Model_Email_Template</email_template>
</rewrite>
</core>
<russell_emaillog>
<class>Russell_Emaillog_Model</class>
<resourceModel>russell_emaillog_resource</resourceModel>
</russell_emaillog>
<russell_emaillog_resource>
<class>Russell_Emaillog_Model_Resource</class>
<entities>
<entry><table>russell_emaillog</table></entry>
</entities>
</russell_emaillog_resource>
</models>
<helpers>
<russell_emaillog>
<class>Russell_Emaillog_Helper</class>
</russell_emaillog>
</helpers>
<resources>
<russell_emaillog_setup>
<setup>
<module>Russell_Emaillog</module>
</setup>
</russell_emaillog_setup>
</resources>
</global>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<russell_emaillog before="Mage_Adminhtml">Russell_Emaillog_Adminhtml</russell_emaillog>
</modules>
</args>
</adminhtml>
</routers>
</admin>
<!-- Admin Menu area -->
<adminhtml>
<layout>
<updates>
<russell_emaillog>
<file>russell/emaillog.xml</file>
</russell_emaillog>
</updates>
</layout>
</adminhtml>
</config>
app/code/local/Russell/Emaillog/etc/system.xml
Russell
99999
Email Override and Log
200
1
0
0
russellconfig
Email Override and Log General Configuration
text
0
1
1
1
Log Emails
select
adminhtml/system_config_source_yesno
Do you want to log all emails that are being sent?
<sort_order>90</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</log_emails>
<suppress_emails translate="label comment">
<label>Suppress All Emails</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<comment>Do you want to suppress all emails from being sent?</comment>
<sort_order>90</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</suppress_emails>
<override_all_emails translate="label comment">
<label>Over-Ride Emails</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<comment>Do You want to override the default functionality and send the emails to a designated email address, instead of its intended recipient? This is helpful if your testing your site and you do not want to accidentally spam your customers</comment>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</override_all_emails>
<override_email_address translate="label">
<label>Over-Ride recipient Email address</label>
<frontend_type>text</frontend_type>
<validate>validate-email</validate>
<comment>If left empty, the default General Contact email will be used</comment>
<sort_order>120</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</override_email_address>
<override_name translate="label">
<label>Over-Ride recipient Name</label>
<frontend_type>text</frontend_type>
<comment>If left empty, a generic string similar to 'Russell Email Suppressed' will be used</comment>
<sort_order>120</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</override_name>
</fields>
</general>
</groups>
</russell_emaillog>
</sections>
</config>
app/code/local/Russell/Emaillog/Helper/Data.php
/**
* Class Russell_Emaillog_Helper_Data
*/
class Russell_Emaillog_Helper_Data extends Mage_Core_Helper_Abstract
{
}
app/code/local/Russell/Emaillog/Model/Email/Template.php
/**
* Class Russell_Emaillog_Model_Email_Template
*/
class Russell_Emaillog_Model_Email_Template extends Mage_Core_Model_Email_Template
{
protected $_name = 'Russell Email Suppressed';
/**
* Send mail to recipient
*
* @param array|string $email E-mail(s)
* @param array|string|null $name receiver name(s)
* @param array $variables template variables
* @return boolean
**/
public function send($email, $name = null, array $variables = array())
{
if(Mage::getStoreConfig('russell_config/general/override_all_emails'))
{
$email = trim(Mage::getStoreConfig('russell_config/general/override_email_address'));
if(strlen($email) == 0)
{
$email = Mage::getStoreConfig('trans_email/ident_general/email');
}
}
if(Mage::getStoreConfig('russell_config/general/override_all_emails') && Mage::getStoreConfig('russell_config/general/override_name'))
{
$name = Mage::getStoreConfig('russell_config/general/override_name');
if(strlen($name) == 0)
{
$name = $this->_name;
}
}
if (!$this->isValidForSend()) {
Mage::logException(new Exception('This letter cannot be sent.')); // translation is intentionally omitted
return false;
}
$emails = array_values((array)$email);
$names = is_array($name) ? $name : (array)$name;
$names = array_values($names);
foreach ($emails as $key => $email) {
if (!isset($names[$key])) {
$names[$key] = substr($email, 0, strpos($email, '@'));
}
}
$variables['email'] = reset($emails);
$variables['name'] = reset($names);
ini_set('SMTP', Mage::getStoreConfig('system/smtp/host'));
ini_set('smtp_port', Mage::getStoreConfig('system/smtp/port'));
$mail = $this->getMail();
$setReturnPath = Mage::getStoreConfig(self::XML_PATH_SENDING_SET_RETURN_PATH);
switch ($setReturnPath) {
case 1:
$returnPathEmail = $this->getSenderEmail();
break;
case 2:
$returnPathEmail = Mage::getStoreConfig(self::XML_PATH_SENDING_RETURN_PATH_EMAIL);
break;
default:
$returnPathEmail = null;
break;
}
if ($returnPathEmail !== null) {
$mailTransport = new Zend_Mail_Transport_Sendmail("-f".$returnPathEmail);
Zend_Mail::setDefaultTransport($mailTransport);
}
foreach ($emails as $key => $email) {
$mail->addTo($email, '=?utf-8?B?' . base64_encode($names[$key]) . '?=');
}
$this->setUseAbsoluteLinks(true);
$text = $this->getProcessedTemplate($variables, true);
if($this->isPlain()) {
$mail->setBodyText($text);
} else {
$mail->setBodyHTML($text);
}
$mail->setSubject('=?utf-8?B?' . base64_encode($this->getProcessedTemplateSubject($variables)) . '?=');
$mail->setFrom($this->getSenderEmail(), $this->getSenderName());
try {
if (!Mage::getStoreConfig('russell_config/general/suppress_emails'))
{
$mail->send();
}
$this->_mail = null;
}
catch (Exception $e) {
$this->_mail = null;
Mage::logException($e);
return false;
}
if (Mage::getStoreConfig('russell_config/general/log_emails') || is_null(Mage::getStoreConfig('russell_config/general/log_emails')))
{
$template_email_subject = $this->getData('template_subject');
$template_email_body = $this->getData('template_text');
$email_subject = $this->getProcessedTemplateSubject($variables);
// Capture the email
// We are going to log each recipient
foreach ($emails as $key => $_recipient_email) {
// Log each recipient email
$_recipient_name = $names[$key];
$entry = Mage::getModel('russell_emaillog/entry');
$values = array(
'sender_email' => $this->getData('sender_email'),
'sender_name' => $this->getData('sender_name'),
'recipient_email' => $_recipient_email,
'recipient_name' => $_recipient_name,
'template_email_subject' => $template_email_subject,
'template_email_body' => $template_email_body,
'email_subject' => $email_subject,
'email_body' => $text,
'template_id' => $this->getData('template_id'),
'store_id' => $variables['store']->getData('store_id'),
'created_at' =>date("Y-m-d H:i:s"),
);
$entry->setData($values);
try{
$entry->save();
}catch (Exception $e){
Mage::logException($e);
}
}
}
return true;
}
/**
* Send transactional email to recipient
*
* @param int $templateId
* @param string|array $sender sender information, can be declared as part of config path
* @param string $email recipient email
* @param string $name recipient name
* @param array $vars varianles which can be used in template
* @param int|null $storeId
* @return Mage_Core_Model_Email_Template
*/
public function sendTransactional($templateId, $sender, $email, $name, $vars=array(), $storeId=null)
{
/*
* I am pretty sure we don't need this here, its probably enough in send()
*
* if(Mage::getStoreConfig('russell_config/general/override_all_emails'))
{
$email = trim(Mage::getStoreConfig('russell_config/general/override_email_address'));
if(strlen($email) == 0)
{
$email = Mage::getStoreConfig('trans_email/ident_general/email');
}
}
else
{
$email = Mage::getStoreConfig('trans_email/ident_general/email');
}
if(Mage::getStoreConfig('russell_config/general/override_name'))
{
$name = Mage::getStoreConfig('russell_config/general/override_name');
if(strlen($name) == 0)
{
$name = $this->_name;
}
}
else
{
$name = $this->_name;
}
*/
$this->setSentSuccess(false);
if (($storeId === null) && $this->getDesignConfig()->getStore()) {
$storeId = $this->getDesignConfig()->getStore();
}
if (is_numeric($templateId)) {
$this->load($templateId);
} else {
$localeCode = Mage::getStoreConfig('general/locale/code', $storeId);
$this->loadDefault($templateId, $localeCode);
}
if (!$this->getId()) {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid transactional email code: ' . $templateId));
}
if (!is_array($sender)) {
$this->setSenderName(Mage::getStoreConfig('trans_email/ident_' . $sender . '/name', $storeId));
$this->setSenderEmail(Mage::getStoreConfig('trans_email/ident_' . $sender . '/email', $storeId));
} else {
$this->setSenderName($sender['name']);
$this->setSenderEmail($sender['email']);
}
if (!isset($vars['store'])) {
$vars['store'] = Mage::app()->getStore($storeId);
}
$this->setSentSuccess($this->send($email, $name, $vars));
return $this;
}
/**
* @return array
*/
public function getEmailTemplates()
{
/**
'sq_access_code_generation_complete/template' => 'SQ Access Code Generation Complete',
*
*
*
*
*
*
*
* Templates we do NOT use so are not included here are listed below:
* 'sales_email/order/guest_template' => 'Guest Order',
*
*
* Do not worry about the order, we are sorting it before we send it off
*/
$templates = array(
'customer/password/remind_email_template' => 'Password New',
'customer/password/forgot_email_template' => 'Password Forgot',
'customer/create_account/email_template' => 'Account New',
'sales_email/shipment/template' => 'Shipment New',
'sales_email/shipment_comment/template' => 'Shipment Update',
'sales_email/creditmemo_comment/template' => 'Creditmemo Update',
'sales_email/creditmemo/template' => 'Credit Memo New',
'russell_invoice_new/template' => 'Russell Invoice New',
'create_order_exception/template' => 'Create Order Exception',
'sales_email/order/template' => 'Order',
);
// try to sort things naturally ASC
natsort($templates);
// return our sorted list
return $templates;
}
}
app/code/local/Russell/Emaillog/Model/Resource/Entry/Collection.php
/**
* Class Russell_Emaillog_Model_Resource_Entry_Collection
*/
class Russell_Emaillog_Model_Resource_Entry_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
{
/**
*
*/
protected function _construct()
{
$this->_init('russell_emaillog/entry');
}
}
app/code/local/Russell/Emaillog/Model/Resource/Entry.php
/**
* Class Russell_Emaillog_Model_Resource_Entry
*/
class Russell_Emaillog_Model_Resource_Entry extends Mage_Core_Model_Resource_Db_Abstract
{
/**
*
*/
protected function _construct()
{
$this->_init('russell_emaillog/entry', 'entity_id');
}
}
app/code/local/Russell/Emaillog/Model/Entry.php
/**
* Class Russell_Emaillog_Model_Entry
*/
class Russell_Emaillog_Model_Entry extends Mage_Core_Model_Abstract
{
protected $_eventPrefix = 'russell_entry';
protected $_eventObject = 'entry';
/**
*
*/
protected function _construct()
{
$this->_init('russell_emaillog/entry');
}
}
app/code/local/Russell/Emaillog/sql/russell_emaillog_setup/install-0.0.1.php
/* @var $installer Mage_Core_Model_Resource_Setup */
$installer = $this;
$installer->startSetup();
$tableName = $installer->getTable('russell_emaillog/entry');
$table = $installer->getConnection()->newTable($tableName)
->addColumn('entity_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
'identity' => true,
'nullable' => false,
'primary' => true,
), 'Entity Id')
->addColumn('sender_email', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Sender Email')
->addColumn('sender_name', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Sender Name')
->addColumn('recipient_email', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Recipient Email')
->addColumn('recipient_name', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Recipient Name')
->addColumn('template_email_subject', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Email Template Subject')
->addColumn('template_email_body', Varien_Db_Ddl_Table::TYPE_TEXT, '1k', array(
'nullable' => false,
), 'Email Template Body')
->addColumn('email_subject', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Actual Email Subject')
->addColumn('email_body', Varien_Db_Ddl_Table::TYPE_TEXT, '1k', array(
'nullable' => false,
), 'Actual Email Body')
->addColumn('store_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
'unsigned' => true,
'nullable' => false,
'default' => '0',
), 'Store Id')
->addColumn('template_id', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
'nullable' => true,
'default' => '',
), 'Template Id')
->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
'nullable' => false,
'default' => Varien_Db_Ddl_Table::TIMESTAMP_INIT,
'comment' => 'Created At',
), 'Created At')
->addIndex($this->getIdxName($tableName, array('sender_email', 'store_id')),
array('sender_email', 'store_id'))
->addForeignKey($this->getFkName($tableName, 'store_id', 'core/store', 'store_id'),
'store_id', $this->getTable('core/store'), 'store_id',
Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
->setComment('Email Log Table');
$installer->getConnection()->createTable($table);
$installer->endSetup();
End of part 5