Conifgure email settings through user interface

This commit is contained in:
Frederic Guillot 2016-06-05 14:53:46 -04:00
parent a08339059b
commit cd4c09c10a
35 changed files with 213 additions and 82 deletions

View File

@ -11,6 +11,7 @@ New features:
Improvements:
* Configure email settings with the user interface in addition to config file
* Upgrade Docker image to Alpine Linux 3.4
* Move task import to a separate section
* Mark web notification as read when clicking on it

View File

@ -72,6 +72,7 @@ class ConfigController extends BaseController
public function application()
{
$this->response->html($this->helper->layout->config('config/application', array(
'mail_transports' => $this->emailClient->getAvailableTransports(),
'languages' => $this->languageModel->getLanguages(),
'timezones' => $this->timezoneModel->getTimezones(),
'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()),
@ -81,6 +82,26 @@ class ConfigController extends BaseController
)));
}
/**
* Display the email settings page
*
* @access public
*/
public function email()
{
$values = $this->configModel->getAll();
if (empty($values['mail_transport'])) {
$values['mail_transport'] = MAIL_TRANSPORT;
}
$this->response->html($this->helper->layout->config('config/email', array(
'values' => $values,
'mail_transports' => $this->emailClient->getAvailableTransports(),
'title' => t('Settings').' > '.t('Email settings'),
)));
}
/**
* Display the project settings page
*

View File

@ -102,4 +102,16 @@ class Client extends Base
return $this;
}
/**
* Return the list of registered transports
*
* @access public
* @return array
*/
public function getAvailableTransports()
{
$availableTransports = $this->transports->keys();
return array_combine($availableTransports, $availableTransports);
}
}

View File

@ -62,4 +62,21 @@ class MailHelper extends Base
return MAIL_FROM;
}
/**
* Get mail sender address
*
* @access public
* @return string
*/
public function getMailTransport()
{
$transport = $this->configModel->get('mail_transport');
if (!empty($transport)) {
return $transport;
}
return MAIL_TRANSPORT;
}
}

View File

@ -39,11 +39,12 @@ class EmailJob extends BaseJob
*/
public function execute($email, $name, $subject, $html, $author)
{
$this->logger->debug(__METHOD__.' Sending email to '.$email.' via '.MAIL_TRANSPORT);
$transport = $this->helper->mail->getMailTransport();
$this->logger->debug(__METHOD__.' Sending email to: '.$email.' using transport: '.$transport);
$startTime = microtime(true);
$this->emailClient
->getTransport(MAIL_TRANSPORT)
->getTransport($transport)
->sendEmail($email, $name, $subject, $html, $author)
;

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Pregledaj zadatak',
'Remove user' => 'Ukloni korisnika',
'Do you really want to remove this user: "%s"?' => 'Da li zaista želiš da ukloniš korisnika: "%s"?',
'New user' => 'Novi korisnik',
'All users' => 'Svi korisnici',
'Username' => 'Korisničko ime',
'Password' => 'Šifra',
@ -412,9 +411,7 @@ return array(
'About' => 'O Kanboardu',
'Database driver:' => 'Database driver:',
'Board settings' => 'Postavke table',
'URL and token' => 'URL i token',
'Webhook settings' => 'Postavke za webhook',
'URL for task creation:' => 'URL za kreiranje zadataka',
'Reset token' => 'Resetuj token',
'API endpoint:' => 'API endpoint',
'Refresh interval for private board' => 'Interval osvježavanja privatnih ploča',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Zobrazit úkol',
'Remove user' => 'Odebrat uživatele',
'Do you really want to remove this user: "%s"?' => 'Opravdu chcete odebrat uživatele: "%s"?',
'New user' => 'Nový uživatel',
'All users' => 'Všichni uživatelé',
'Username' => 'Uživatelské jméno',
'Password' => 'Heslo',
@ -412,9 +411,7 @@ return array(
'About' => 'O projektu',
'Database driver:' => 'Databáze',
'Board settings' => 'Nastavení nástěnky',
'URL and token' => 'URL a Token',
'Webhook settings' => 'Webhook nastavení',
'URL for task creation:' => 'URL pro vytvoření úkolu',
'Reset token' => 'Token reset',
'API endpoint:' => 'API endpoint',
'Refresh interval for private board' => 'Interval automatického obnovování pro soukromé nástěnky',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Se denne opgave',
'Remove user' => 'Fjern bruger',
'Do you really want to remove this user: "%s"?' => 'Ønsker du virkelig at fjerne denne bruger: "%s"?',
'New user' => 'Ny bruger',
'All users' => 'Alle brugere',
'Username' => 'Brugernavn',
'Password' => 'Password',
@ -412,9 +411,7 @@ return array(
'About' => 'Om',
'Database driver:' => 'Database driver:',
'Board settings' => 'Baord indstillinger',
'URL and token' => 'URL og token',
'Webhook settings' => 'Webhook indstillinger',
'URL for task creation:' => 'URL for opgave oprettelse:',
'Reset token' => 'Reset endpoint',
'API endpoint:' => 'API endpoint:',
'Refresh interval for private board' => 'Refresh interval for privat board',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Aufgabe ansehen',
'Remove user' => 'Benutzer löschen',
'Do you really want to remove this user: "%s"?' => 'Soll dieser Benutzer wirklich gelöscht werden: "%s"?',
'New user' => 'Neuer Benutzer',
'All users' => 'Alle Benutzer',
'Username' => 'Benutzername',
'Password' => 'Passwort',
@ -412,9 +411,7 @@ return array(
'About' => 'Über',
'Database driver:' => 'Datenbanktreiber:',
'Board settings' => 'Pinnwandeinstellungen',
'URL and token' => 'URL und Token',
'Webhook settings' => 'Webhook-Einstellungen',
'URL for task creation:' => 'URL zur Aufgabenerstellung:',
'Reset token' => 'Token zurücksetzen',
'API endpoint:' => 'API-Endpunkt:',
'Refresh interval for private board' => 'Aktualisierungsintervall für private Pinnwände',
@ -1200,4 +1197,9 @@ return array(
'Enter one task by line.' => 'Geben Sie eine Aufgabe pro Zeile ein.',
'Number of failed login:' => 'Anzahl fehlgeschlagener Anmeldungen:',
'Account locked until:' => 'Konto gesperrt bis:',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Προβολή της εργασίας',
'Remove user' => 'Αφαίρεση χρήστη',
'Do you really want to remove this user: "%s"?' => 'Θέλετε σίγουρα να αφαιρέσετε αυτό τον χρήστη: « %s » ?',
'New user' => 'Νέος Χρήστης',
'All users' => 'Όλοι οι χρήστες',
'Username' => 'Όνομα χρήστη',
'Password' => 'Κωδικός',
@ -412,9 +411,7 @@ return array(
'About' => 'About',
'Database driver:' => 'Database driver:',
'Board settings' => 'Board settings',
'URL and token' => 'URL / token',
'Webhook settings' => 'Webhook settings',
'URL for task creation:' => 'URL για δημιουργία εργασίας:',
'Reset token' => 'Reset token',
'API endpoint:' => 'URL API:',
'Refresh interval for private board' => 'Ανανέωση interval στο private board',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Ver esta tarea',
'Remove user' => 'Eliminar un usuario',
'Do you really want to remove this user: "%s"?' => '¿De verdad que desea suprimir a este usuario: « %s » ?',
'New user' => 'Añadir un usuario',
'All users' => 'Todos los usuarios',
'Username' => 'Nombre de usuario',
'Password' => 'Contraseña',
@ -412,9 +411,7 @@ return array(
'About' => 'Acerca de',
'Database driver:' => 'Controlador (Driver) de la base de datos',
'Board settings' => 'Configuraciones del Tablero',
'URL and token' => 'URL y ficha',
'Webhook settings' => 'Configuraciones del Disparador Web (Webhook)',
'URL for task creation:' => 'URL para la creación de tareas',
'Reset token' => 'Limpiar ficha',
'API endpoint:' => 'Punto final del API',
'Refresh interval for private board' => 'Intervalo de refresco del tablero privado',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Näytä tämä tehtävä',
'Remove user' => 'Poista käyttäjä',
'Do you really want to remove this user: "%s"?' => 'Oletko varma että haluat poistaa käyttäjän "%s"?',
'New user' => 'Uusi käyttäjä',
'All users' => 'Kaikki käyttäjät',
'Username' => 'Käyttäjänimi',
'Password' => 'Salasana',
@ -412,9 +411,7 @@ return array(
'About' => 'Tietoja',
'Database driver:' => 'Tietokantaohjelmisto:',
'Board settings' => 'Taulun asetukset',
'URL and token' => 'URL ja token',
'Webhook settings' => 'Webhookin asetukset',
'URL for task creation:' => 'URL tehtävän luomiseksi:',
'Reset token' => 'Vaihda token',
'API endpoint:' => 'API päätepiste:',
'Refresh interval for private board' => 'Päivitystiheys yksityisille tauluille',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Voir cette tâche',
'Remove user' => 'Supprimer un utilisateur',
'Do you really want to remove this user: "%s"?' => 'Voulez-vous vraiment supprimer cet utilisateur : « %s » ?',
'New user' => 'Ajouter un utilisateur',
'All users' => 'Tous les utilisateurs',
'Username' => 'Nom d\'utilisateur',
'Password' => 'Mot de passe',
@ -412,9 +411,7 @@ return array(
'About' => 'À propos',
'Database driver:' => 'Type de base de données :',
'Board settings' => 'Paramètres du tableau',
'URL and token' => 'URL et jeton de sécurité',
'Webhook settings' => 'Paramètres pour les webhooks',
'URL for task creation:' => 'URL pour la création de tâche :',
'Reset token' => 'Regénérer le jeton de sécurité',
'API endpoint:' => 'URL de l\'API :',
'Refresh interval for private board' => 'Intervalle pour rafraîchir un tableau privé',
@ -1201,4 +1198,9 @@ return array(
'Enter one task by line.' => 'Entrez une tâche par ligne.',
'Number of failed login:' => 'Nombre de connexion échouées :',
'Account locked until:' => 'Compte bloqué jusqu\'au :',
'Email settings' => 'Paramètres des emails',
'Email sender address' => 'Adresse email de l\'expéditeur',
'Email transport' => 'Transport des emails',
'Webhook token' => 'Jeton de sécurité des webhooks',
'Imports' => 'Importations',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Feladat megtekintése',
'Remove user' => 'Felhasználó törlése',
'Do you really want to remove this user: "%s"?' => 'Valóban törölni akarja ezt a felhasználót: "%s"?',
'New user' => 'Új felhasználó',
'All users' => 'Minden felhasználó',
'Username' => 'Felhasználónév',
'Password' => 'Jelszó',
@ -412,9 +411,7 @@ return array(
'About' => 'Kanboard információ',
'Database driver:' => 'Adatbázis motor:',
'Board settings' => 'Tábla beállítások',
'URL and token' => 'URL és tokenek',
'Webhook settings' => 'Webhook beállítások',
'URL for task creation:' => 'Feladat létrehozás URL:',
'Reset token' => 'Token újragenerálása',
'API endpoint:' => 'API végpont:',
'Refresh interval for private board' => 'Privát táblák frissítési intervalluma',
@ -1189,7 +1186,7 @@ return array(
'Not available' => 'Nem áll rendelkezésre',
'Remove plugin' => 'Plugin eltávolítása',
'Do you really want to remove this plugin: "%s"?' => 'Valóban el kívánja távolítani ezt a plugin-t: "%s"?',
//'Uninstall' => '',
// 'Uninstall' => '',
'Listing' => 'Listázás',
'Metadata' => 'Metaadat',
'Manage projects' => 'Projektek kezelése',
@ -1200,4 +1197,9 @@ return array(
'Enter one task by line.' => 'Minden sorban egy feladatot adjon meg.',
'Number of failed login:' => 'A sikertelen bejelentkezések száma:',
'Account locked until:' => 'A számla zárolva a következő időpontig:',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Lihat tugas ini',
'Remove user' => 'Hapus pengguna',
'Do you really want to remove this user: "%s"?' => 'Anda yakin akan menghapus pengguna ini : « %s » ?',
'New user' => 'Pengguna baru',
'All users' => 'Semua pengguna',
'Username' => 'Nama pengguna',
'Password' => 'Kata sandi',
@ -412,9 +411,7 @@ return array(
'About' => 'Tentang',
'Database driver:' => 'Driver basis data :',
'Board settings' => 'Pengaturan papan',
'URL and token' => 'URL dan token',
'Webhook settings' => 'Pengaturan webhook',
'URL for task creation:' => 'URL untuk pembuatan tugas :',
'Reset token' => 'Mereset token',
'API endpoint:' => 'API endpoint :',
'Refresh interval for private board' => 'Interval pembaruan untuk papan pribadi',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Visualizza questo task',
'Remove user' => 'Cancella un utente',
'Do you really want to remove this user: "%s"?' => 'Veramente vuoi cancellare questo utente: "%s" ?',
'New user' => 'Aggiungi un utente',
'All users' => 'Tutti gli utenti',
'Username' => 'Nome utente',
'Password' => 'Password',
@ -412,9 +411,7 @@ return array(
'About' => 'Informazioni',
'Database driver:' => 'Driver per Database',
'Board settings' => 'Impostazioni bacheca',
'URL and token' => 'URL e token',
'Webhook settings' => 'Impostazione Webhook',
'URL for task creation:' => 'URL per la creazione dei task:',
'Reset token' => 'Rigenera il token',
'API endpoint:' => 'Endpoint dell\'API:',
'Refresh interval for private board' => 'Intervallo di refresh per le bacheche private',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'このタクスを見る',
'Remove user' => 'ユーザの削除',
'Do you really want to remove this user: "%s"?' => 'ユーザ「%s」を本当に削除しますか',
'New user' => 'ユーザを追加する',
'All users' => 'すべてのユーザ',
'Username' => 'ユーザ名',
'Password' => 'パスワード',
@ -412,9 +411,7 @@ return array(
'About' => '情報',
'Database driver:' => 'データベースドライバ:',
'Board settings' => '基本設定',
'URL and token' => 'URL とトークン',
'Webhook settings' => 'Webhook の設定',
'URL for task creation:' => 'Task 作成の URL:',
'Reset token' => 'トークンのリセット',
'API endpoint:' => 'API エンドポイント:',
'Refresh interval for private board' => '非公開ボードの更新頻度',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => '이 할일 보기',
'Remove user' => '사용자 삭제',
'Do you really want to remove this user: "%s"?' => '사용자 "%s"를 정말로 삭제하시겠습니까?',
'New user' => '사용자를 추가하는 ',
'All users' => '모든 사용자',
'Username' => '사용자 이름',
'Password' => '패스워드',
@ -412,9 +411,7 @@ return array(
'About' => '정보',
'Database driver:' => '데이터베이스 드라이버:',
'Board settings' => '기본 설정',
'URL and token' => 'URL와 토큰',
'Webhook settings' => 'Webhook의 설정',
'URL for task creation:' => 'Task작성의 URL:',
'Reset token' => '토큰 리셋',
'API endpoint:' => 'API엔드 포인트:',
'Refresh interval for private board' => '비공개 보드의 갱신 빈도',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Lihat tugas ini',
'Remove user' => 'Hapus pengguna',
'Do you really want to remove this user: "%s"?' => 'Anda yakin mahu menghapus pengguna ini : « %s » ?',
'New user' => 'Pengguna baru',
'All users' => 'Semua pengguna',
'Username' => 'Nama pengguna',
'Password' => 'Kata laluan',
@ -412,9 +411,7 @@ return array(
'About' => 'Tentang',
'Database driver:' => 'Driver pengkalan data:',
'Board settings' => 'Pengaturan papan',
'URL and token' => 'URL dan token',
'Webhook settings' => 'Penetapan webhook',
'URL for task creation:' => 'URL untuk cipta tugas:',
'Reset token' => 'Menetap semula token',
'API endpoint:' => 'API endpoint :',
'Refresh interval for private board' => 'Interval pembaruan untuk papan pribadi',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Se denne oppgaven',
'Remove user' => 'Fjern bruker',
'Do you really want to remove this user: "%s"?' => 'Vil du fjerne denne brukeren: "%s"?',
'New user' => 'Ny bruker',
'All users' => 'Alle brukere',
'Username' => 'Brukernavn',
'Password' => 'Passord',
@ -412,9 +411,7 @@ return array(
'About' => 'Om',
'Database driver:' => 'Database driver:',
'Board settings' => 'Innstillinger for prosjektside',
'URL and token' => 'URL og token',
'Webhook settings' => 'Webhook innstillinger',
'URL for task creation:' => 'URL for oppgaveopprettelse:',
'Reset token' => 'Resette token',
'API endpoint:' => 'API endpoint:',
'Refresh interval for private board' => 'Oppdateringsintervall for privat hovedside',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Deze taak bekijken',
'Remove user' => 'Gebruiker verwijderen',
'Do you really want to remove this user: "%s"?' => 'Weet u zeker dat u deze gebruiker wil verwijderen : « %s » ?',
'New user' => 'Nieuwe gebruiker',
'All users' => 'Alle gebruikers',
'Username' => 'Gebruikersnaam',
'Password' => 'Wachtwoord',
@ -412,9 +411,7 @@ return array(
'About' => 'Over',
'Database driver:' => 'Database driver :',
'Board settings' => 'Bord instellingen',
'URL and token' => 'URL en token',
'Webhook settings' => 'Webhook instellingen',
'URL for task creation:' => 'URL voor aanmaken taken :',
'Reset token' => 'Token resetten',
'API endpoint:' => 'API endpoint :',
'Refresh interval for private board' => 'Verversingsinterval voor private borden',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Zobacz zadanie',
'Remove user' => 'Usuń użytkownika',
'Do you really want to remove this user: "%s"?' => 'Na pewno chcesz usunąć użytkownika: "%s"?',
'New user' => 'Nowy użytkownik',
'All users' => 'Wszyscy użytkownicy',
'Username' => 'Nazwa użytkownika',
'Password' => 'Hasło',
@ -412,9 +411,7 @@ return array(
'About' => 'Informacje',
'Database driver:' => 'Silnik bazy danych:',
'Board settings' => 'Ustawienia tablicy',
'URL and token' => 'URL i token',
'Webhook settings' => 'Ustawienia webhook',
'URL for task creation:' => 'URL do tworzenia zadań',
'Reset token' => 'Resetuj token',
'API endpoint:' => 'Endpoint API',
'Refresh interval for private board' => 'Częstotliwość odświeżania dla tablicy prywatnej',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Ver esta tarefa',
'Remove user' => 'Remover usuário',
'Do you really want to remove this user: "%s"?' => 'Você realmente deseja remover este usuário: "%s"?',
'New user' => 'Novo usuário',
'All users' => 'Todos os usuários',
'Username' => 'Nome de usuário',
'Password' => 'Senha',
@ -412,9 +411,7 @@ return array(
'About' => 'Sobre',
'Database driver:' => 'Driver do banco de dados:',
'Board settings' => 'Configurações do board',
'URL and token' => 'URL e token',
'Webhook settings' => 'Configurações do Webhook',
'URL for task creation:' => 'URL para a criação da tarefa:',
'Reset token' => 'Resetar token',
'API endpoint:' => 'API endpoint:',
'Refresh interval for private board' => 'Intervalo de atualização para um board privado',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Ver esta tarefa',
'Remove user' => 'Remover utilizador',
'Do you really want to remove this user: "%s"?' => 'Pretende mesmo remover este utilizador: "%s"?',
'New user' => 'Novo utilizador',
'All users' => 'Todos os utilizadores',
'Username' => 'Nome de utilizador',
'Password' => 'Senha',
@ -412,9 +411,7 @@ return array(
'About' => 'Sobre',
'Database driver:' => 'Driver da base de dados:',
'Board settings' => 'Configurações do Quadro',
'URL and token' => 'URL e token',
'Webhook settings' => 'Configurações do Webhook',
'URL for task creation:' => 'URL para a criação da tarefa:',
'Reset token' => 'Redefinir token',
'API endpoint:' => 'API endpoint:',
'Refresh interval for private board' => 'Intervalo de actualização para um quadro privado',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Посмотреть задачу',
'Remove user' => 'Удалить пользователя',
'Do you really want to remove this user: "%s"?' => 'Вы точно хотите удалить пользователя: « %s » ?',
'New user' => 'Новый пользователь',
'All users' => 'Все пользователи',
'Username' => 'Имя пользователя',
'Password' => 'Пароль',
@ -412,9 +411,7 @@ return array(
'About' => 'Информация',
'Database driver:' => 'Драйвер базы данных',
'Board settings' => 'Настройки доски',
'URL and token' => 'URL и токен',
'Webhook settings' => 'Параметры Webhook',
'URL for task creation:' => 'URL для создания задачи:',
'Reset token' => 'Перезагрузить токен',
'API endpoint:' => 'API endpoint:',
'Refresh interval for private board' => 'Период обновления для частных досок',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Pregledaj zadatak',
'Remove user' => 'Ukloni korisnika',
'Do you really want to remove this user: "%s"?' => 'Da li zaista želiš da ukloniš korisnika: "%s"?',
'New user' => 'novi korisnik',
'All users' => 'Svi korisnici',
'Username' => 'Korisnik',
'Password' => 'Lozinka',
@ -412,9 +411,7 @@ return array(
'About' => 'Informacje',
'Database driver:' => 'Database driver:',
'Board settings' => 'Podešavanje table',
'URL and token' => 'URL i token',
// 'Webhook settings' => '',
'URL for task creation:' => 'URL za kreiranje zadataka',
'Reset token' => 'Resetuj token',
// 'API endpoint:' => '',
'Refresh interval for private board' => 'Interval osvežavanja privatnih tabli',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Se denna uppgift',
'Remove user' => 'Ta bort användare',
'Do you really want to remove this user: "%s"?' => 'Vill du verkligen ta bort användaren: "%s"?',
'New user' => 'Ny användare',
'All users' => 'Alla användare',
'Username' => 'Användarnamn',
'Password' => 'Lösenord',
@ -412,9 +411,7 @@ return array(
'About' => 'Om',
'Database driver:' => 'Databasdrivrutin:',
'Board settings' => 'Inställningar för tavla',
'URL and token' => 'URL och token',
'Webhook settings' => 'Webhook inställningar',
'URL for task creation:' => 'URL för att skapa uppgift:',
'Reset token' => 'Nollställ token',
'API endpoint:' => 'API ändpunkt:',
'Refresh interval for private board' => 'Uppdateringsintervall för privat tavla',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'รายละเอียดงานนี้',
'Remove user' => 'เอาผู้ใช้ออก',
'Do you really want to remove this user: "%s"?' => 'คุณต้องการเอาผู้ใช้ « %s » ออกใช่หรือไม่?',
'New user' => 'ผู้ใช้ใหม่',
'All users' => 'ผู้ใช้ทั้งหมด',
'Username' => 'ชื่อผู้ใช้',
'Password' => 'รหัสผ่าน',
@ -412,9 +411,7 @@ return array(
'About' => 'เกี่ยวกับ',
'Database driver:' => 'เครื่องมือฐานขข้อมูล',
'Board settings' => 'ตั้งค่าบอร์ด',
// 'URL and token' => '',
// 'Webhook settings' => '',
// 'URL for task creation:' => '',
// 'Reset token' => '',
// 'API endpoint:' => '',
'Refresh interval for private board' => 'ระยะรีเฟรชบอร์ดส่วนตัว',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => 'Bu görevi görüntüle',
'Remove user' => 'Kullanıcıyı kaldır',
'Do you really want to remove this user: "%s"?' => 'Bu kullanıcıyı gerçekten silmek istiyor musunuz: "%s"?',
'New user' => 'Yeni kullanıcı',
'All users' => 'Tüm kullanıcılar',
'Username' => 'Kullanıcı adı',
'Password' => 'Şifre',
@ -412,9 +411,7 @@ return array(
'About' => 'Hakkında',
'Database driver:' => 'Veritabanı sürücüsü:',
'Board settings' => 'Tablo ayarları',
'URL and token' => 'URL veya Belirteç',
'Webhook settings' => 'Webhook ayarları',
'URL for task creation:' => 'Görev oluşturma için URL',
'Reset token' => 'Belirteci sıfırla',
'API endpoint:' => 'API bitiş noktası:',
'Refresh interval for private board' => 'Özel tablolar için yenileme sıklığı',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -35,7 +35,6 @@ return array(
'View this task' => '查看该任务',
'Remove user' => '移除用户',
'Do you really want to remove this user: "%s"?' => '确定要删除用户"%s"吗?',
'New user' => '新建用户',
'All users' => '所有用户',
'Username' => '用户名',
'Password' => '密码',
@ -412,9 +411,7 @@ return array(
'About' => '关于',
'Database driver:' => '数据库驱动:',
'Board settings' => '看板设置',
'URL and token' => 'URL和令牌',
'Webhook settings' => 'Webhook 设置',
'URL for task creation:' => '创建任务的URL',
'Reset token' => '重置令牌',
'API endpoint:' => 'API 端点:',
'Refresh interval for private board' => '私人看板的刷新时间',
@ -1200,4 +1197,9 @@ return array(
// 'Enter one task by line.' => '',
// 'Number of failed login:' => '',
// 'Account locked until:' => '',
// 'Email settings' => '',
// 'Email sender address' => '',
// 'Email transport' => '',
// 'Webhook token' => '',
// 'Imports' => '',
);

View File

@ -9,9 +9,6 @@
<?= $this->form->text('application_url', $values, $errors, array('placeholder="http://example.kanboard.net/"')) ?>
<p class="form-help"><?= t('Example: http://example.kanboard.net/ (used to generate absolute URLs)') ?></p>
<?= $this->form->label(t('Email sender address'), 'mail_sender_address') ?>
<?= $this->form->text('mail_sender_address', $values, $errors, array('placeholder="'.MAIL_FROM.'"')) ?>
<?= $this->form->label(t('Language'), 'application_language') ?>
<?= $this->form->select('application_language', $languages, $values, $errors) ?>

View File

@ -0,0 +1,18 @@
<div class="page-header">
<h2><?= t('Email settings') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'email')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Email sender address'), 'mail_sender_address') ?>
<?= $this->form->text('mail_sender_address', $values, $errors, array('placeholder="'.MAIL_FROM.'"')) ?>
<?= $this->form->label(t('Email transport'), 'mail_transport') ?>
<?= $this->form->select('mail_transport', $mail_transports, $values, $errors) ?>
<?= $this->hook->render('template:config:email', array('values' => $values, 'errors' => $errors)) ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
</form>

View File

@ -7,6 +7,9 @@
<li <?= $this->app->checkMenuSelection('ConfigController', 'application') ?>>
<?= $this->url->link(t('Application settings'), 'ConfigController', 'application') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'email') ?>>
<?= $this->url->link(t('Email settings'), 'ConfigController', 'email') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'project') ?>>
<?= $this->url->link(t('Project settings'), 'ConfigController', 'project') ?>
</li>

View File

@ -54,7 +54,7 @@ abstract class Base extends PHPUnit_Framework_TestCase
$this->container['httpClient'] = $this
->getMockBuilder('\Kanboard\Core\Http\Client')
->setConstructorArgs(array($this->container))
->setMethods(array('get', 'getJson', 'postJson', 'postForm'))
->setMethods(array('get', 'getJson', 'postJson', 'postJsonAsync', 'postForm', 'postFormAsync'))
->getMock();
$this->container['emailClient'] = $this

View File

@ -32,4 +32,15 @@ class MailHelperTest extends Base
$this->assertEquals('me@here', $helper->getMailSenderAddress());
}
public function testGetTransport()
{
$helper = new MailHelper($this->container);
$this->assertEquals(MAIL_TRANSPORT, $helper->getMailTransport());
$this->container['configModel']->save(array('mail_transport' => 'smtp'));
$this->container['memoryCache']->flush();
$this->assertEquals('smtp', $helper->getMailTransport());
}
}