Skip to content

Commit c74af10

Browse files
authored
Added email logging feature (#597)
1 parent c651268 commit c74af10

File tree

22 files changed

+815
-8
lines changed

22 files changed

+815
-8
lines changed

.phpstorm.meta.php/blocks.meta.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,9 @@
958958
'contentversion/adminhtml_version_grid' => \Maho_ContentVersion_Block_Adminhtml_Version_Grid::class,
959959
'contentversion/adminhtml_version_tab' => \Maho_ContentVersion_Block_Adminhtml_Version_Tab::class,
960960
'core/abstract' => \Mage_Core_Block_Abstract::class,
961+
'core/adminhtml_email_log' => \Mage_Core_Block_Adminhtml_Email_Log::class,
962+
'core/adminhtml_email_log_grid' => \Mage_Core_Block_Adminhtml_Email_Log_Grid::class,
963+
'core/adminhtml_email_log_view' => \Mage_Core_Block_Adminhtml_Email_Log_View::class,
961964
'core/flush' => \Mage_Core_Block_Flush::class,
962965
'core/html_date' => \Mage_Core_Block_Html_Date::class,
963966
'core/html_link' => \Mage_Core_Block_Html_Link::class,
@@ -2354,6 +2357,9 @@
23542357
'contentversion/adminhtml_version_grid' => \Maho_ContentVersion_Block_Adminhtml_Version_Grid::class,
23552358
'contentversion/adminhtml_version_tab' => \Maho_ContentVersion_Block_Adminhtml_Version_Tab::class,
23562359
'core/abstract' => \Mage_Core_Block_Abstract::class,
2360+
'core/adminhtml_email_log' => \Mage_Core_Block_Adminhtml_Email_Log::class,
2361+
'core/adminhtml_email_log_grid' => \Mage_Core_Block_Adminhtml_Email_Log_Grid::class,
2362+
'core/adminhtml_email_log_view' => \Mage_Core_Block_Adminhtml_Email_Log_View::class,
23572363
'core/flush' => \Mage_Core_Block_Flush::class,
23582364
'core/html_date' => \Mage_Core_Block_Html_Date::class,
23592365
'core/html_link' => \Mage_Core_Block_Html_Link::class,

.phpstorm.meta.php/models.meta.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,8 @@
900900
'core/design_source_design' => \Mage_Core_Model_Design_Source_Design::class,
901901
'core/domainpolicy' => \Mage_Core_Model_Domainpolicy::class,
902902
'core/email_info' => \Mage_Core_Model_Email_Info::class,
903+
'core/email_log' => \Mage_Core_Model_Email_Log::class,
904+
'core/email_loggingtransport' => \Mage_Core_Model_Email_LoggingTransport::class,
903905
'core/email_queue' => \Mage_Core_Model_Email_Queue::class,
904906
'core/email_template' => \Mage_Core_Model_Email_Template::class,
905907
'core/email_template_abstract' => \Mage_Core_Model_Email_Template_Abstract::class,
@@ -951,6 +953,8 @@
951953
'core/resource_design' => \Mage_Core_Model_Resource_Design::class,
952954
'core/resource_design_collection' => \Mage_Core_Model_Resource_Design_Collection::class,
953955
'core/resource_design_package_collection' => \Mage_Core_Model_Resource_Design_Package_Collection::class,
956+
'core/resource_email_log' => \Mage_Core_Model_Resource_Email_Log::class,
957+
'core/resource_email_log_collection' => \Mage_Core_Model_Resource_Email_Log_Collection::class,
954958
'core/resource_email_queue' => \Mage_Core_Model_Resource_Email_Queue::class,
955959
'core/resource_email_queue_collection' => \Mage_Core_Model_Resource_Email_Queue_Collection::class,
956960
'core/resource_email_template' => \Mage_Core_Model_Resource_Email_Template::class,
@@ -1026,6 +1030,8 @@
10261030
'core_resource/design' => \Mage_Core_Model_Resource_Design::class,
10271031
'core_resource/design_collection' => \Mage_Core_Model_Resource_Design_Collection::class,
10281032
'core_resource/design_package_collection' => \Mage_Core_Model_Resource_Design_Package_Collection::class,
1033+
'core_resource/email_log' => \Mage_Core_Model_Resource_Email_Log::class,
1034+
'core_resource/email_log_collection' => \Mage_Core_Model_Resource_Email_Log_Collection::class,
10291035
'core_resource/email_queue' => \Mage_Core_Model_Resource_Email_Queue::class,
10301036
'core_resource/email_queue_collection' => \Mage_Core_Model_Resource_Email_Queue_Collection::class,
10311037
'core_resource/email_template' => \Mage_Core_Model_Resource_Email_Template::class,
@@ -3631,6 +3637,8 @@
36313637
'core/design_source_design' => \Mage_Core_Model_Design_Source_Design::class,
36323638
'core/domainpolicy' => \Mage_Core_Model_Domainpolicy::class,
36333639
'core/email_info' => \Mage_Core_Model_Email_Info::class,
3640+
'core/email_log' => \Mage_Core_Model_Email_Log::class,
3641+
'core/email_loggingtransport' => \Mage_Core_Model_Email_LoggingTransport::class,
36343642
'core/email_queue' => \Mage_Core_Model_Email_Queue::class,
36353643
'core/email_template' => \Mage_Core_Model_Email_Template::class,
36363644
'core/email_template_abstract' => \Mage_Core_Model_Email_Template_Abstract::class,
@@ -3682,6 +3690,8 @@
36823690
'core/resource_design' => \Mage_Core_Model_Resource_Design::class,
36833691
'core/resource_design_collection' => \Mage_Core_Model_Resource_Design_Collection::class,
36843692
'core/resource_design_package_collection' => \Mage_Core_Model_Resource_Design_Package_Collection::class,
3693+
'core/resource_email_log' => \Mage_Core_Model_Resource_Email_Log::class,
3694+
'core/resource_email_log_collection' => \Mage_Core_Model_Resource_Email_Log_Collection::class,
36853695
'core/resource_email_queue' => \Mage_Core_Model_Resource_Email_Queue::class,
36863696
'core/resource_email_queue_collection' => \Mage_Core_Model_Resource_Email_Queue_Collection::class,
36873697
'core/resource_email_template' => \Mage_Core_Model_Resource_Email_Template::class,
@@ -3757,6 +3767,8 @@
37573767
'core_resource/design' => \Mage_Core_Model_Resource_Design::class,
37583768
'core_resource/design_collection' => \Mage_Core_Model_Resource_Design_Collection::class,
37593769
'core_resource/design_package_collection' => \Mage_Core_Model_Resource_Design_Package_Collection::class,
3770+
'core_resource/email_log' => \Mage_Core_Model_Resource_Email_Log::class,
3771+
'core_resource/email_log_collection' => \Mage_Core_Model_Resource_Email_Log_Collection::class,
37603772
'core_resource/email_queue' => \Mage_Core_Model_Resource_Email_Queue::class,
37613773
'core_resource/email_queue_collection' => \Mage_Core_Model_Resource_Email_Queue_Collection::class,
37623774
'core_resource/email_template' => \Mage_Core_Model_Resource_Email_Template::class,

.phpstorm.meta.php/registry.meta.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
current_dataflow_session_id,
3333
current_destination,
3434
current_dynamic_rule,
35+
current_email_log,
3536
current_email_sequence,
3637
current_email_template,
3738
current_entity_key,

.phpstorm.meta.php/resource_models.meta.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@
192192
'core_resource/design' => \Mage_Core_Model_Resource_Design::class,
193193
'core_resource/design_collection' => \Mage_Core_Model_Resource_Design_Collection::class,
194194
'core_resource/design_package_collection' => \Mage_Core_Model_Resource_Design_Package_Collection::class,
195+
'core_resource/email_log' => \Mage_Core_Model_Resource_Email_Log::class,
196+
'core_resource/email_log_collection' => \Mage_Core_Model_Resource_Email_Log_Collection::class,
195197
'core_resource/email_queue' => \Mage_Core_Model_Resource_Email_Queue::class,
196198
'core_resource/email_queue_collection' => \Mage_Core_Model_Resource_Email_Queue_Collection::class,
197199
'core_resource/email_template' => \Mage_Core_Model_Resource_Email_Template::class,
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
<?php
2+
3+
/**
4+
* Maho
5+
*
6+
* @package Mage_Adminhtml
7+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
8+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9+
*/
10+
11+
declare(strict_types=1);
12+
13+
class Mage_Adminhtml_System_Email_LogController extends Mage_Adminhtml_Controller_Action
14+
{
15+
public const ADMIN_RESOURCE = 'system/tools/email_log';
16+
17+
#[\Override]
18+
public function preDispatch()
19+
{
20+
$this->_setForcedFormKeyActions('massDelete');
21+
return parent::preDispatch();
22+
}
23+
24+
public function indexAction(): void
25+
{
26+
$this->_title($this->__('System'))
27+
->_title($this->__('Email Log'));
28+
29+
$this->loadLayout()
30+
->_setActiveMenu('system/tools/email_log')
31+
->_addBreadcrumb(
32+
Mage::helper('core')->__('System'),
33+
Mage::helper('core')->__('System'),
34+
)
35+
->_addBreadcrumb(
36+
Mage::helper('core')->__('Email Log'),
37+
Mage::helper('core')->__('Email Log'),
38+
);
39+
40+
$this->renderLayout();
41+
}
42+
43+
public function gridAction(): void
44+
{
45+
$this->loadLayout();
46+
$this->renderLayout();
47+
}
48+
49+
public function viewAction(): void
50+
{
51+
$id = (int) $this->getRequest()->getParam('id');
52+
$log = Mage::getModel('core/email_log')->load($id);
53+
54+
if (!$log->getId()) {
55+
Mage::getSingleton('adminhtml/session')->addError(
56+
Mage::helper('core')->__('This email log entry no longer exists.'),
57+
);
58+
$this->_redirect('*/*/');
59+
return;
60+
}
61+
62+
Mage::register('current_email_log', $log);
63+
64+
$this->_title($this->__('System'))
65+
->_title($this->__('Email Log'))
66+
->_title($this->__('View Entry'));
67+
68+
$this->loadLayout()
69+
->_setActiveMenu('system/tools/email_log')
70+
->_addBreadcrumb(
71+
Mage::helper('core')->__('System'),
72+
Mage::helper('core')->__('System'),
73+
)
74+
->_addBreadcrumb(
75+
Mage::helper('core')->__('Email Log'),
76+
Mage::helper('core')->__('Email Log'),
77+
)
78+
->_addBreadcrumb(
79+
Mage::helper('core')->__('View Entry'),
80+
Mage::helper('core')->__('View Entry'),
81+
);
82+
83+
$this->renderLayout();
84+
}
85+
86+
public function massDeleteAction(): void
87+
{
88+
$logIds = $this->getRequest()->getPost('log_ids');
89+
90+
try {
91+
if (!is_array($logIds)) {
92+
Mage::throwException(Mage::helper('core')->__('Please select email log entries to delete.'));
93+
}
94+
95+
$deletedCount = 0;
96+
foreach ($logIds as $logId) {
97+
$log = Mage::getModel('core/email_log')->load($logId);
98+
if ($log->getId()) {
99+
$log->delete();
100+
$deletedCount++;
101+
}
102+
}
103+
104+
Mage::getSingleton('adminhtml/session')->addSuccess(
105+
Mage::helper('adminhtml')->__('Total of %d record(s) were deleted.', $deletedCount),
106+
);
107+
} catch (Mage_Core_Exception $e) {
108+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
109+
} catch (\Exception $e) {
110+
Mage::getSingleton('adminhtml/session')->addError(
111+
Mage::helper('adminhtml')->__('An error occurred while deleting email log entries.'),
112+
);
113+
Mage::logException($e);
114+
}
115+
116+
$this->_redirect('*/*/');
117+
}
118+
119+
public function exportCsvAction(): void
120+
{
121+
$grid = $this->getLayout()->createBlock('core/adminhtml_email_log_grid');
122+
$this->_prepareDownloadResponse(...$grid->getCsvFile('email_log.csv', -1));
123+
}
124+
125+
public function exportXmlAction(): void
126+
{
127+
$grid = $this->getLayout()->createBlock('core/adminhtml_email_log_grid');
128+
$this->_prepareDownloadResponse(...$grid->getExcelFile('email_log.xml', -1));
129+
}
130+
}

app/code/core/Mage/Adminhtml/etc/adminhtml.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525
<tools translate="title">
2626
<title>Tools</title>
2727
<sort_order>20</sort_order>
28+
<children>
29+
<email_log translate="title" module="core">
30+
<title>Email Log</title>
31+
<action>adminhtml/system_email_log</action>
32+
<sort_order>10</sort_order>
33+
</email_log>
34+
</children>
2835
</tools>
2936
<design translate="title">
3037
<title>Design</title>
@@ -213,6 +220,11 @@
213220
<tools translate="title">
214221
<title>Tools</title>
215222
<sort_order>60</sort_order>
223+
<children>
224+
<email_log translate="title" module="core">
225+
<title>Email Log</title>
226+
</email_log>
227+
</children>
216228
</tools>
217229
<convert translate="title">
218230
<title>Import/Export</title>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
/**
4+
* Maho
5+
*
6+
* @package Mage_Core
7+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
8+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9+
*/
10+
11+
declare(strict_types=1);
12+
13+
class Mage_Core_Block_Adminhtml_Email_Log extends Mage_Adminhtml_Block_Widget_Grid_Container
14+
{
15+
public function __construct()
16+
{
17+
$this->_blockGroup = 'core';
18+
$this->_controller = 'adminhtml_email_log';
19+
$this->_headerText = Mage::helper('core')->__('Email Log');
20+
parent::__construct();
21+
$this->_removeButton('add');
22+
}
23+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?php
2+
3+
/**
4+
* Maho
5+
*
6+
* @package Mage_Core
7+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
8+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9+
*/
10+
11+
declare(strict_types=1);
12+
13+
class Mage_Core_Block_Adminhtml_Email_Log_Grid extends Mage_Adminhtml_Block_Widget_Grid
14+
{
15+
public function __construct()
16+
{
17+
parent::__construct();
18+
$this->setId('emailLogGrid');
19+
$this->setDefaultSort('created_at');
20+
$this->setDefaultDir('DESC');
21+
$this->setSaveParametersInSession(true);
22+
$this->setUseAjax(true);
23+
}
24+
25+
#[\Override]
26+
protected function _prepareCollection(): self
27+
{
28+
$collection = Mage::getResourceModel('core/email_log_collection');
29+
$this->setCollection($collection);
30+
return parent::_prepareCollection();
31+
}
32+
33+
#[\Override]
34+
protected function _prepareColumns(): self
35+
{
36+
$helper = Mage::helper('core');
37+
38+
$this->addColumn('log_id', [
39+
'header' => $helper->__('ID'),
40+
'align' => 'right',
41+
'width' => '50px',
42+
'index' => 'log_id',
43+
'type' => 'number',
44+
]);
45+
46+
$this->addColumn('subject', [
47+
'header' => $helper->__('Subject'),
48+
'index' => 'subject',
49+
]);
50+
51+
$this->addColumn('email_to', [
52+
'header' => $helper->__('To'),
53+
'index' => 'email_to',
54+
]);
55+
56+
$this->addColumn('email_from', [
57+
'header' => $helper->__('From'),
58+
'index' => 'email_from',
59+
]);
60+
61+
$this->addColumn('content_type', [
62+
'header' => $helper->__('Type'),
63+
'width' => '60px',
64+
'index' => 'content_type',
65+
'type' => 'options',
66+
'options' => [
67+
'html' => 'HTML',
68+
'text' => 'Text',
69+
],
70+
]);
71+
72+
$this->addColumn('status', [
73+
'header' => $helper->__('Status'),
74+
'width' => '80px',
75+
'index' => 'status',
76+
'type' => 'options',
77+
'options' => [
78+
'sent' => $helper->__('Sent'),
79+
'failed' => $helper->__('Failed'),
80+
],
81+
]);
82+
83+
$this->addColumn('created_at', [
84+
'header' => $helper->__('Date'),
85+
'width' => '150px',
86+
'index' => 'created_at',
87+
'type' => 'datetime',
88+
]);
89+
90+
$this->addExportType('*/*/exportCsv', $helper->__('CSV'));
91+
$this->addExportType('*/*/exportXml', $helper->__('Excel XML'));
92+
93+
return parent::_prepareColumns();
94+
}
95+
96+
#[\Override]
97+
protected function _prepareMassaction(): self
98+
{
99+
$this->setMassactionIdField('log_id');
100+
$this->getMassactionBlock()->setFormFieldName('log_ids');
101+
102+
$this->getMassactionBlock()->addItem('delete', [
103+
'label' => Mage::helper('core')->__('Delete'),
104+
'url' => $this->getUrl('*/*/massDelete'),
105+
'confirm' => Mage::helper('core')->__('Are you sure you want to delete the selected email log entries?'),
106+
]);
107+
108+
return $this;
109+
}
110+
111+
#[\Override]
112+
public function getRowUrl($row): string
113+
{
114+
return $this->getUrl('*/*/view', ['id' => $row->getId()]);
115+
}
116+
117+
#[\Override]
118+
public function getGridUrl(): string
119+
{
120+
return $this->getUrl('*/*/grid', ['_current' => true]);
121+
}
122+
}

0 commit comments

Comments
 (0)