Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
TYPO3
sg_mail
Commits
27572acf
Commit
27572acf
authored
Feb 06, 2020
by
Georgi Mateev
Browse files
[BUGFIX] 1604 Fixed changes to the API, internal refactoring
- Added static runtime cache
parent
1051b0bd
Changes
3
Hide whitespace changes
Inline
Side-by-side
Classes/Controller/MailController.php
View file @
27572acf
...
...
@@ -379,7 +379,6 @@ class MailController extends ActionController {
foreach
((
array
)
$parameters
[
'templates'
]
as
$key
=>
$template
)
{
$mailTemplateService
->
setLanguage
(
$key
);
$mailTemplateService
->
setToAddresses
(
$parameters
[
'emailAddress'
]);
// $mailTemplateService->setFromAddress($template['fromMail']);
$mailTemplateService
->
setTemplateName
(
$parameters
[
'selectedTemplate'
]);
$mailTemplateService
->
setExtensionKey
(
$parameters
[
'selectedExtension'
]);
$mailTemplateService
->
setPreviewMarkers
();
...
...
Classes/Controller/NewsletterController.php
View file @
27572acf
...
...
@@ -426,8 +426,6 @@ class NewsletterController extends ActionController {
$mailTemplateService
->
setOverwrittenFromMail
(
$parameter
[
'fromMail'
]);
$mailTemplateService
->
setSubject
(
$parameter
[
'subject'
]);
$mailTemplateService
->
setOverwrittenReplyTo
(
$parameter
[
'replyTo'
]);
$siteRootId
=
$mailTemplateService
->
getSiteRootId
();
$templateObject
=
$mailTemplateService
->
getTemplate
(
$siteRootId
);
if
(
!
$this
->
request
->
getArgument
(
'sendRealEmails'
))
{
// Send test emails
...
...
@@ -456,7 +454,7 @@ class NewsletterController extends ActionController {
'www'
=>
' www.example.com'
,
]
]);
$mailIsSend
=
$mailTemplateService
->
sendEmail
(
TRUE
,
$templateObject
);
$mailIsSend
=
$mailTemplateService
->
sendEmail
(
TRUE
);
}
}
else
{
...
...
@@ -487,7 +485,7 @@ class NewsletterController extends ActionController {
$mailTemplateService
->
setMarkers
([
'user'
=>
$recipient
]);
// no real error handling here, one must check the MailQueue
$mailTemplateService
->
sendEmail
(
FALSE
,
$templateObject
);
$mailTemplateService
->
sendEmail
(
FALSE
);
}
catch
(
\
Exception
$e
)
{
// Invalid email address could not be loaded to queue
$errorRecipients
[]
=
$recipient
[
'uid'
]
.
' - '
...
...
Classes/Service/MailTemplateService.php
View file @
27572acf
...
...
@@ -63,6 +63,16 @@ class MailTemplateService {
const
REGISTER_FILE
=
'Register.php'
;
const
CONFIG_PATH
=
'Configuration/MailTemplates'
;
/**
* @var Template
*/
private
static
$template
;
/**
* @var array
*/
private
static
$mailObjectCache
=
[];
/**
* @var string $toAddresses
*/
...
...
@@ -211,6 +221,97 @@ class MailTemplateService {
*/
private
$subjectToSend
;
/**
* @param Template $template
*/
public
static
function
setTemplate
(
Template
$template
):
void
{
self
::
$template
=
$template
;
}
/**
* @return string
*/
public
function
getOverwrittenBcc
():
string
{
return
$this
->
overwrittenBcc
;
}
/**
* @param string $overwrittenBcc
*/
public
function
setOverwrittenBcc
(
string
$overwrittenBcc
):
void
{
$this
->
overwrittenBcc
=
$overwrittenBcc
;
}
/**
* @return string
*/
public
function
getOverwrittenCc
():
string
{
return
$this
->
overwrittenCc
;
}
/**
* @param string $overwrittenCc
*/
public
function
setOverwrittenCc
(
string
$overwrittenCc
):
void
{
$this
->
overwrittenCc
=
$overwrittenCc
;
}
/**
* @return string
*/
public
function
getOverwrittenFromName
():
string
{
return
$this
->
overwrittenFromName
;
}
/**
* @param string $overwrittenFromName
*/
public
function
setOverwrittenFromName
(
string
$overwrittenFromName
):
void
{
$this
->
overwrittenFromName
=
$overwrittenFromName
;
}
/**
* @return string
*/
public
function
getOverwrittenFromMail
():
string
{
return
$this
->
overwrittenFromMail
;
}
/**
* @param string $overwrittenFromMail
*/
public
function
setOverwrittenFromMail
(
string
$overwrittenFromMail
):
void
{
$this
->
overwrittenFromMail
=
$overwrittenFromMail
;
}
/**
* @return string
*/
public
function
getOverwrittenReplyTo
():
string
{
return
$this
->
overwrittenReplyTo
;
}
/**
* @param string $overwrittenReplyTo
*/
public
function
setOverwrittenReplyTo
(
string
$overwrittenReplyTo
):
void
{
$this
->
overwrittenReplyTo
=
$overwrittenReplyTo
;
}
/**
* @return string
*/
public
function
getOverwrittenToAddresses
():
string
{
return
$this
->
overwrittenToAddresses
;
}
/**
* @param string $overwrittenToAddresses
*/
public
function
setOverwrittenToAddresses
(
string
$overwrittenToAddresses
):
void
{
$this
->
overwrittenToAddresses
=
$overwrittenToAddresses
;
}
/**
* MailTemplateService constructor.
*
...
...
@@ -401,6 +502,34 @@ class MailTemplateService {
return
$this
;
}
/**
* @return string|string[]|null
*/
public
function
getMailBodyToSend
()
{
return
$this
->
mailBodyToSend
;
}
/**
* @param string|string[]|null $mailBodyToSend
*/
public
function
setMailBodyToSend
(
$mailBodyToSend
):
void
{
$this
->
mailBodyToSend
=
$mailBodyToSend
;
}
/**
* @return string
*/
public
function
getSubjectToSend
():
string
{
return
$this
->
subjectToSend
;
}
/**
* @param string $subjectToSend
*/
public
function
setSubjectToSend
(
string
$subjectToSend
):
void
{
$this
->
subjectToSend
=
$subjectToSend
;
}
/**
* @param array $markers
* @return MailTemplateService
...
...
@@ -674,28 +803,37 @@ class MailTemplateService {
$pageUid
=
$this
->
pid
;
}
//TODO: move to page repository
if
(
$pageUid
===
0
)
{
$queryBuilder
=
GeneralUtility
::
makeInstance
(
ConnectionPool
::
class
)
->
getQueryBuilderForTable
(
'pages'
);
$rootPageRows
=
$queryBuilder
->
select
(
'*'
)
->
from
(
'pages'
)
->
where
(
$queryBuilder
->
expr
()
->
eq
(
'is_siteroot'
,
1
)
$pageUid
=
$this
->
getAnyRootPageUid
();
}
return
$pageUid
;
}
/**
* Gets the page uid of any root page in the page tree
*
* @return int
*/
private
function
getAnyRootPageUid
()
{
$queryBuilder
=
GeneralUtility
::
makeInstance
(
ConnectionPool
::
class
)
->
getQueryBuilderForTable
(
'pages'
);
$rootPageRows
=
$queryBuilder
->
select
(
'*'
)
->
from
(
'pages'
)
->
where
(
$queryBuilder
->
expr
()
->
eq
(
'is_siteroot'
,
1
)
->
andWhere
(
$queryBuilder
->
expr
()
->
eq
(
'hidden'
,
0
)
)
->
andWhere
(
$queryBuilder
->
expr
()
->
eq
(
'hidden'
,
0
)
->
execute
()
->
fetchAll
();
)
->
execute
()
->
fetchAll
();
if
(
$rootPageRows
&&
\
count
(
$rootPageRows
))
{
$pageUid
=
(
int
)
$rootPageRows
[
0
][
'uid'
];
}
if
(
$rootPageRows
&&
\
count
(
$rootPageRows
))
{
$pageUid
=
(
int
)
$rootPageRows
[
0
][
'uid'
];
}
return
$pageUid
;
}
...
...
@@ -707,7 +845,7 @@ class MailTemplateService {
* @return null|object|Template|FALSE
* @throws \Exception
*/
public
function
getTemplate
(
int
$siteRootId
)
{
public
function
getTemplate
(
$siteRootId
)
{
$isTemplateBlacklisted
=
self
::
isTemplateBlacklisted
(
$this
->
extensionKey
,
$this
->
templateName
,
$siteRootId
);
if
(
$isTemplateBlacklisted
)
{
throw
new
\
Exception
(
'The template is blacklisted'
);
...
...
@@ -765,12 +903,14 @@ class MailTemplateService {
}
/**
* @param $template
* Sets the values to send the mail with from the template or register service
*
* @param Template|null $template
* @param $registerService
* @param $defaultTemplateContent
* @param $siteRootId
*/
protected
function
setMailValuesFromObjects
(
$template
,
$registerService
,
$defaultTemplateContent
,
$siteRootId
):
void
{
protected
function
extractValuesForMail
(
$template
,
$registerService
,
$defaultTemplateContent
,
$siteRootId
):
void
{
/** @var StandaloneView $emailView */
$emailView
=
$this
->
objectManager
->
get
(
StandaloneView
::
class
);
$emailView
->
assignMultiple
(
$this
->
markers
);
...
...
@@ -814,10 +954,7 @@ class MailTemplateService {
if
(
$this
->
fromAddress
===
''
)
{
$fromMail
=
$this
->
parseMarkers
(
$this
->
getTemplateSource
(
(
empty
(
$this
->
overwrittenFromMail
)
?
$template
->
getFromMail
()
:
$this
->
overwrittenFromMail
),
$layoutId
,
$siteRootId
),
empty
(
$this
->
overwrittenFromMail
)
?
$template
->
getFromMail
()
:
$this
->
overwrittenFromMail
,
$emailView
);
$this
->
setFromAddress
(
$fromMail
);
...
...
@@ -825,10 +962,7 @@ class MailTemplateService {
if
(
$this
->
fromName
===
''
)
{
$fromName
=
$this
->
parseMarkers
(
$this
->
getTemplateSource
(
(
empty
(
$this
->
overwrittenFromName
)
?
$template
->
getFromName
()
:
$this
->
overwrittenFromName
),
$layoutId
,
$siteRootId
),
(
empty
(
$this
->
overwrittenFromName
)
?
$template
->
getFromName
()
:
$this
->
overwrittenFromName
),
$emailView
);
$this
->
setFromName
(
$fromName
);
...
...
@@ -836,10 +970,7 @@ class MailTemplateService {
if
(
$this
->
replyToAddress
===
''
)
{
$replyTo
=
$this
->
parseMarkers
(
$this
->
getTemplateSource
(
(
empty
(
$this
->
overwrittenReplyTo
)
?
$template
->
getReplyTo
()
:
$this
->
overwrittenReplyTo
),
$layoutId
,
$siteRootId
),
(
empty
(
$this
->
overwrittenReplyTo
)
?
$template
->
getReplyTo
()
:
$this
->
overwrittenReplyTo
),
$emailView
);
$this
->
setReplyToAddress
(
$replyTo
);
...
...
@@ -847,10 +978,7 @@ class MailTemplateService {
if
(
empty
(
$this
->
ccAddresses
))
{
$cc
=
$this
->
parseMarkers
(
$this
->
getTemplateSource
(
(
empty
(
$this
->
overwrittenCc
)
?
$template
->
getCc
()
:
$this
->
overwrittenCc
),
$layoutId
,
$siteRootId
),
(
empty
(
$this
->
overwrittenCc
)
?
$template
->
getCc
()
:
$this
->
overwrittenCc
),
$emailView
);
$this
->
setCcAddresses
(
$cc
);
...
...
@@ -858,10 +986,7 @@ class MailTemplateService {
if
(
empty
(
$this
->
bccAddresses
))
{
$bcc
=
$this
->
parseMarkers
(
$this
->
getTemplateSource
(
(
empty
(
$this
->
overwrittenBcc
)
?
$template
->
getBcc
()
:
$this
->
overwrittenBcc
),
$layoutId
,
$siteRootId
),
(
empty
(
$this
->
overwrittenBcc
)
?
$template
->
getBcc
()
:
$this
->
overwrittenBcc
),
$emailView
);
$this
->
setBccAddresses
(
$bcc
);
...
...
@@ -869,10 +994,7 @@ class MailTemplateService {
if
(
$this
->
toAddresses
===
''
)
{
$toAddress
=
$this
->
parseMarkers
(
$this
->
getTemplateSource
(
(
empty
(
$this
->
overwrittenToAddresses
)
?
$template
->
getToAddress
()
:
$this
->
overwrittenToAddresses
),
$layoutId
,
$siteRootId
),
(
empty
(
$this
->
overwrittenToAddresses
)
?
$template
->
getToAddress
()
:
$this
->
overwrittenToAddresses
),
$emailView
);
$this
->
setToAddresses
(
$toAddress
);
...
...
@@ -913,18 +1035,19 @@ class MailTemplateService {
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException
*/
public
function
sendEmail
(
$isPreview
=
FALSE
,
Template
$template
=
NULL
):
bool
{
public
function
sendEmail
(
$isPreview
=
FALSE
):
bool
{
if
(
$isPreview
)
{
//TODO: remove this from here
$this
->
setIgnoreMailQueue
(
TRUE
);
}
$success
=
FALSE
;
// Get page ID
// TODO: this doesn't belong here. The API user needs to provide the UID
$siteRootId
=
$this
->
getSiteRootId
();
if
(
$template
===
NULL
)
{
if
(
self
::
$template
===
NULL
)
{
// Get template
try
{
$template
=
$this
->
getTemplate
(
$siteRootId
);
self
::
$template
=
$this
->
getTemplate
(
$siteRootId
);
}
catch
(
\
Exception
$e
)
{
return
FALSE
;
}
...
...
@@ -932,22 +1055,23 @@ class MailTemplateService {
$registerService
=
GeneralUtility
::
makeInstance
(
RegisterService
::
class
);
// get default template content from register array
$defaultTemplateContent
=
$this
->
getDefaultTemplateContent
(
$template
,
$registerService
);
$defaultTemplateContent
=
$this
->
getDefaultTemplateContent
(
self
::
$template
,
$registerService
);
// set the ToAddress if there are no placeholders in it
// TODO: does this belong here?
if
(
$template
!==
NULL
&&
\
filter_var
(
$template
->
getToAddress
(),
FILTER_VALIDATE_EMAIL
))
{
$this
->
setToAddresses
(
\
trim
(
$template
->
getToAddress
()));
if
(
self
::
$template
!==
NULL
&&
\
filter_var
(
self
::
$template
->
getToAddress
(),
FILTER_VALIDATE_EMAIL
))
{
$this
->
setToAddresses
(
\
trim
(
self
::
$template
->
getToAddress
()));
}
$this
->
setMailValuesFromObjects
(
$template
,
$registerService
,
$defaultTemplateContent
,
$siteRootId
);
$this
->
extractValuesForMail
(
self
::
$template
,
$registerService
,
$defaultTemplateContent
,
$siteRootId
);
$mail
=
$this
->
addMailToMailQueue
(
$this
->
extensionKey
,
$this
->
templateName
,
$this
->
getSubjectToSend
(),
$this
->
getMailBodyToSend
(),
$this
->
priority
,
0
,
0
,
$this
->
language
,
$siteRootId
);
self
::
$mailObjectCache
[
$mail
->
getUid
()]
=
$mail
;
// add it to cache to avoid extra DB queries
if
(
$this
->
ignoreMailQueue
)
{
$success
=
$this
->
sendMailFromQueue
(
$mail
->
getUid
()
,
$mail
);
$success
=
$this
->
sendMailFromQueue
(
$mail
->
getUid
());
}
//TODO: this can be avoided if the sending logic is decoupled from this function
...
...
@@ -1085,24 +1209,38 @@ class MailTemplateService {
return
$mail
;
}
/**
* Get the mail object by uid and check if it's blacklisted
* @param $uid
*/
private
function
getMailObjectByUid
(
$uid
)
{
$mailRepository
=
$this
->
objectManager
->
get
(
MailRepository
::
class
);
$mailObject
=
$mailRepository
->
findOneByUid
(
$uid
);
if
(
!
$mailObject
||
$mailObject
->
getBlacklisted
())
{
return
FALSE
;
}
return
$mailObject
;
}
/**
* Send a Mail from the queue, identified by its id
*
* @param int $uid
* @param null $mailToSend
* @return bool|NULL
* @throws \TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException
*/
public
function
sendMailFromQueue
(
$uid
,
$mailToSend
=
NULL
):
bool
{
public
function
sendMailFromQueue
(
$uid
):
bool
{
$mailRepository
=
$this
->
objectManager
->
get
(
MailRepository
::
class
);
/** @var Mail $mailToSend */
if
(
$mailToSend
===
NULL
)
{
$mailToSend
=
$
mailRepository
->
findOne
ByUid
(
$uid
);
if
(
!
$mailToSend
||
$mailToSend
->
getBlacklisted
()
)
{
if
(
!
isset
(
self
::
$mailObjectCache
[
$uid
])
||
!
self
::
$mailObjectCache
[
$uid
]
instanceof
Mail
)
{
$mailToSend
=
$
this
->
getMailObject
ByUid
(
$uid
);
if
(
$mailToSend
===
FALSE
)
{
return
FALSE
;
}
}
else
{
$mailToSend
=
self
::
$mailObjectCache
[
$uid
];
}
$this
->
mailMessage
->
setBody
(
$mailToSend
->
getMailBody
(),
'text/html'
);
...
...
@@ -1153,121 +1291,10 @@ class MailTemplateService {
}
else
{
$this
->
mailMessage
->
getFailedRecipients
();
}
unset
(
self
::
$mailObjectCache
[
$uid
]);
// free the memory
return
$success
;
}
/**
* @return string
*/
public
function
getOverwrittenBcc
():
string
{
return
$this
->
overwrittenBcc
;
}
/**
* @param string $overwrittenBcc
*/
public
function
setOverwrittenBcc
(
string
$overwrittenBcc
):
void
{
$this
->
overwrittenBcc
=
$overwrittenBcc
;
}
/**
* @return string
*/
public
function
getOverwrittenCc
():
string
{
return
$this
->
overwrittenCc
;
}
/**
* @param string $overwrittenCc
*/
public
function
setOverwrittenCc
(
string
$overwrittenCc
):
void
{
$this
->
overwrittenCc
=
$overwrittenCc
;
}
/**
* @return string
*/
public
function
getOverwrittenFromName
():
string
{
return
$this
->
overwrittenFromName
;
}
/**
* @param string $overwrittenFromName
*/
public
function
setOverwrittenFromName
(
string
$overwrittenFromName
):
void
{
$this
->
overwrittenFromName
=
$overwrittenFromName
;
}
/**
* @return string
*/
public
function
getOverwrittenFromMail
():
string
{
return
$this
->
overwrittenFromMail
;
}
/**
* @param string $overwrittenFromMail
*/
public
function
setOverwrittenFromMail
(
string
$overwrittenFromMail
):
void
{
$this
->
overwrittenFromMail
=
$overwrittenFromMail
;
}
/**
* @return string
*/
public
function
getOverwrittenReplyTo
():
string
{
return
$this
->
overwrittenReplyTo
;
}
/**
* @param string $overwrittenReplyTo
*/
public
function
setOverwrittenReplyTo
(
string
$overwrittenReplyTo
):
void
{
$this
->
overwrittenReplyTo
=
$overwrittenReplyTo
;
}
/**
* @return string
*/
public
function
getOverwrittenToAddresses
():
string
{
return
$this
->
overwrittenToAddresses
;
}
/**
* @param string $overwrittenToAddresses
*/
public
function
setOverwrittenToAddresses
(
string
$overwrittenToAddresses
):
void
{
$this
->
overwrittenToAddresses
=
$overwrittenToAddresses
;
}
/**
* @return string|string[]|null
*/
public
function
getMailBodyToSend
()
{
return
$this
->
mailBodyToSend
;
}
/**
* @param string|string[]|null $mailBodyToSend
*/
public
function
setMailBodyToSend
(
$mailBodyToSend
):
void
{
$this
->
mailBodyToSend
=
$mailBodyToSend
;
}
/**
* @return string
*/
public
function
getSubjectToSend
():
string
{
return
$this
->
subjectToSend
;
}
/**
* @param string $subjectToSend
*/
public
function
setSubjectToSend
(
string
$subjectToSend
):
void
{
$this
->
subjectToSend
=
$subjectToSend
;
}
/**
* Sets the fromMail property of the mailTemplateService.
* Checks validity and uses all available fallbacks
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment