Add Reply-To header to emails sent from Kanboard

This commit is contained in:
Frederic Guillot 2017-02-18 19:13:08 -05:00
parent b4dc602381
commit bd0ed33179
8 changed files with 86 additions and 55 deletions

View File

@ -4,6 +4,7 @@ Version 1.0.40 (unreleased)
New features:
* Send comments by email
* Add Reply-To header to emails sent from Kanboard
* Upload Sqlite database from user interface
Improvements:
@ -23,6 +24,7 @@ Breaking changes:
* Columns "default_swimlane" and "show_default_swimlane" from "projects" table are not used anymore
* Remove API method "getDefaultSwimlane()"
* Add mandatory argument "project_id" to API method "updateSwimlane()"
* Change interface for mail transports
Bug fixes:

View File

@ -9,7 +9,7 @@ use Kanboard\Core\Base;
/**
* Mail Client
*
* @package mail
* @package Kanboard\Core\Mail
* @author Frederic Guillot
*/
class Client extends Base
@ -38,30 +38,35 @@ class Client extends Base
* Send a HTML email
*
* @access public
* @param string $email
* @param string $name
* @param string $recipientEmail
* @param string $recipientName
* @param string $subject
* @param string $html
* @return Client
*/
public function send($email, $name, $subject, $html)
public function send($recipientEmail, $recipientName, $subject, $html)
{
if (! empty($email)) {
$this->queueManager->push(EmailJob::getInstance($this->container)
->withParams($email, $name, $subject, $html, $this->getAuthor())
);
if (! empty($recipientEmail)) {
$this->queueManager->push(EmailJob::getInstance($this->container)->withParams(
$recipientEmail,
$recipientName,
$subject,
$html,
$this->getAuthorName(),
$this->getAuthorEmail()
));
}
return $this;
}
/**
* Get email author
* Get author name
*
* @access public
* @return string
*/
public function getAuthor()
public function getAuthorName()
{
$author = 'Kanboard';
@ -72,6 +77,22 @@ class Client extends Base
return $author;
}
/**
* Get author email
*
* @access public
* @return string
*/
public function getAuthorEmail()
{
if ($this->userSession->isLogged()) {
$userData = $this->userSession->getAll();
return ! empty($userData['email']) ? $userData['email'] : '';
}
return '';
}
/**
* Get mail transport instance
*

View File

@ -5,7 +5,7 @@ namespace Kanboard\Core\Mail;
/**
* Mail Client Interface
*
* @package mail
* @package Kanboard\Core\Mail
* @author Frederic Guillot
*/
interface ClientInterface
@ -14,11 +14,12 @@ interface ClientInterface
* Send a HTML email
*
* @access public
* @param string $email
* @param string $name
* @param string $subject
* @param string $html
* @param string $author
* @param string $recipientEmail
* @param string $recipientName
* @param string $subject
* @param string $html
* @param string $authorName
* @param string $authorEmail
*/
public function sendEmail($email, $name, $subject, $html, $author);
public function sendEmail($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail = '');
}

View File

@ -12,7 +12,7 @@ use Kanboard\Core\Mail\ClientInterface;
/**
* PHP Mail Handler
*
* @package transport
* @package Kanboard\Core\Mail\Transport
* @author Frederic Guillot
*/
class Mail extends Base implements ClientInterface
@ -21,20 +21,26 @@ class Mail extends Base implements ClientInterface
* Send a HTML email
*
* @access public
* @param string $email
* @param string $name
* @param string $subject
* @param string $html
* @param string $author
* @param string $recipientEmail
* @param string $recipientName
* @param string $subject
* @param string $html
* @param string $authorName
* @param string $authorEmail
*/
public function sendEmail($email, $name, $subject, $html, $author)
public function sendEmail($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail = '')
{
try {
$message = Swift_Message::newInstance()
->setSubject($subject)
->setFrom(array($this->helper->mail->getMailSenderAddress() => $author))
->setTo(array($email => $name))
->setBody($html, 'text/html');
->setFrom($this->helper->mail->getMailSenderAddress(), $authorName)
->setTo(array($recipientEmail => $recipientName));
if (! empty($authorEmail)) {
$message->setReplyTo($authorEmail);
}
$message->setBody($html, 'text/html');
Swift_Mailer::newInstance($this->getTransport())->send($message);
} catch (Swift_TransportException $e) {
@ -46,7 +52,7 @@ class Mail extends Base implements ClientInterface
* Get SwiftMailer transport
*
* @access protected
* @return \Swift_Transport|\Swift_MailTransport|\Swift_SmtpTransport|\Swift_SendmailTransport
* @return \Swift_Transport
*/
protected function getTransport()
{

View File

@ -7,7 +7,7 @@ use Swift_SendmailTransport;
/**
* PHP Mail Handler
*
* @package transport
* @package Kanboard\Core\Mail\Transport
* @author Frederic Guillot
*/
class Sendmail extends Mail
@ -16,7 +16,7 @@ class Sendmail extends Mail
* Get SwiftMailer transport
*
* @access protected
* @return \Swift_Transport|\Swift_MailTransport|\Swift_SmtpTransport|\Swift_SendmailTransport
* @return \Swift_Transport
*/
protected function getTransport()
{

View File

@ -7,7 +7,7 @@ use Swift_SmtpTransport;
/**
* PHP Mail Handler
*
* @package transport
* @package Kanboard\Core\Mail\Transport
* @author Frederic Guillot
*/
class Smtp extends Mail
@ -16,7 +16,7 @@ class Smtp extends Mail
* Get SwiftMailer transport
*
* @access protected
* @return \Swift_Transport|\Swift_MailTransport|\Swift_SmtpTransport|\Swift_SendmailTransport
* @return \Swift_Transport
*/
protected function getTransport()
{
@ -29,8 +29,8 @@ class Smtp extends Mail
$transport->setStreamOptions(array(
'ssl' => array(
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
'verify_peer' => false,
'verify_peer_name' => false,
)
));
}

View File

@ -14,16 +14,17 @@ class EmailJob extends BaseJob
* Set job parameters
*
* @access public
* @param string $email
* @param string $name
* @param string $recipientEmail
* @param string $recipientName
* @param string $subject
* @param string $html
* @param string $author
* @param string $authorName
* @param string $authorEmail
* @return $this
*/
public function withParams($email, $name, $subject, $html, $author)
public function withParams($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail)
{
$this->jobParams = array($email, $name, $subject, $html, $author);
$this->jobParams = array($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail);
return $this;
}
@ -31,25 +32,24 @@ class EmailJob extends BaseJob
* Execute job
*
* @access public
* @param string $email
* @param string $name
* @param string $recipientEmail
* @param string $recipientName
* @param string $subject
* @param string $html
* @param string $author
* @param string $authorName
* @param string $authorEmail
*/
public function execute($email, $name, $subject, $html, $author)
public function execute($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail)
{
$transport = $this->helper->mail->getMailTransport();
$this->logger->debug(__METHOD__.' Sending email to: '.$email.' using transport: '.$transport);
$startTime = microtime(true);
$this->logger->debug(__METHOD__.' Sending email to: '.$recipientEmail.' using transport: '.$transport);
$this->emailClient
->getTransport($transport)
->sendEmail($email, $name, $subject, $html, $author)
;
->sendEmail($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail);
if (DEBUG) {
$this->logger->debug('Email sent in '.round(microtime(true) - $startTime, 6).' seconds');
}
$this->logger->debug(__METHOD__.' Email sent in '.round(microtime(true) - $startTime, 6).' seconds');
}
}

View File

@ -24,13 +24,14 @@ interface ClientInterface
* Send a HTML email
*
* @access public
* @param string $email
* @param string $name
* @param string $subject
* @param string $html
* @param string $author
* @param string $recipientEmail
* @param string $recipientName
* @param string $subject
* @param string $html
* @param string $authorName
* @param string $authorEmail
*/
public function sendEmail($email, $name, $subject, $html, $author);
public function sendEmail($recipientEmail, $recipientName, $subject, $html, $authorName, $authorEmail = '');
}
```