Support per-company SMTP settings [Self-host]

This commit is contained in:
Hillel Coren 2018-01-22 18:24:37 +02:00
parent 5bdaad25c2
commit dd360fb271
4 changed files with 58 additions and 27 deletions

View File

@ -169,14 +169,18 @@ class AppController extends BaseController
$_ENV['DB_PASSWORD'] = $db['type']['password']; $_ENV['DB_PASSWORD'] = $db['type']['password'];
if ($mail) { if ($mail) {
$_ENV['MAIL_DRIVER'] = $mail['driver']; $prefix = '';
$_ENV['MAIL_PORT'] = $mail['port']; if (($user = auth()->user()) && Account::count() > 1) {
$_ENV['MAIL_ENCRYPTION'] = $mail['encryption']; $prefix = $user->account_id . '_';
$_ENV['MAIL_HOST'] = $mail['host']; }
$_ENV['MAIL_USERNAME'] = $mail['username']; $_ENV[$prefix . 'MAIL_DRIVER'] = $mail['driver'];
$_ENV['MAIL_FROM_NAME'] = $mail['from']['name']; $_ENV[$prefix . 'MAIL_PORT'] = $mail['port'];
$_ENV['MAIL_FROM_ADDRESS'] = $mail['from']['address']; $_ENV[$prefix . 'MAIL_ENCRYPTION'] = $mail['encryption'];
$_ENV['MAIL_PASSWORD'] = $mail['password']; $_ENV[$prefix . 'MAIL_HOST'] = $mail['host'];
$_ENV[$prefix . 'MAIL_USERNAME'] = $mail['username'];
$_ENV[$prefix . 'MAIL_FROM_NAME'] = $mail['from']['name'];
$_ENV[$prefix . 'MAIL_FROM_ADDRESS'] = $mail['from']['address'];
$_ENV[$prefix . 'MAIL_PASSWORD'] = $mail['password'];
$_ENV['MAILGUN_DOMAIN'] = $mail['mailgun_domain']; $_ENV['MAILGUN_DOMAIN'] = $mail['mailgun_domain'];
$_ENV['MAILGUN_SECRET'] = $mail['mailgun_secret']; $_ENV['MAILGUN_SECRET'] = $mail['mailgun_secret'];
} }

View File

@ -61,4 +61,17 @@ class HTMLUtils
return $previous; return $previous;
} }
} }
public static function getEnvForAccount($field, $default = '')
{
$key = '';
if ($user = auth()->user()) {
$key .= $user->account->id . '_';
}
$key .= $field;
return env($key, env($field, $default));
}
} }

View File

@ -29,22 +29,36 @@ class Mailer
return true; return true;
} }
/*
if (isset($_ENV['POSTMARK_API_TOKEN'])) {
$views = 'emails.'.$view.'_html';
} else {
$views = [
'emails.'.$view.'_html',
'emails.'.$view.'_text',
];
}
*/
$views = [ $views = [
'emails.'.$view.'_html', 'emails.'.$view.'_html',
'emails.'.$view.'_text', 'emails.'.$view.'_text',
]; ];
if (Utils::isSelfHost()) {
if (isset($data['account'])) {
$account = $data['account'];
if (env($account->id . '_MAIL_FROM_ADDRESS')) {
$fields = [
'driver',
'host',
'port',
'from.address',
'from.name',
'encryption',
'username',
'password',
];
foreach ($fields as $field) {
$envKey = strtoupper(str_replace('.', '_', $field));
if ($value = env($account->id . '_MAIL_' . $envKey)) {
config(['mail.' . $field => $value]);
}
}
(new \Illuminate\Mail\MailServiceProvider(app()))->register();
}
}
}
try { try {
$response = Mail::send($views, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject, $data) { $response = Mail::send($views, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject, $data) {
$toEmail = strtolower($toEmail); $toEmail = strtolower($toEmail);

View File

@ -33,23 +33,23 @@
</div> </div>
<div class="panel-body form-padding-right"> <div class="panel-body form-padding-right">
{!! Former::select('mail[driver]')->label('driver')->options(['smtp' => 'SMTP', 'mail' => 'Mail', 'sendmail' => 'Sendmail', 'mailgun' => 'Mailgun']) {!! Former::select('mail[driver]')->label('driver')->options(['smtp' => 'SMTP', 'mail' => 'Mail', 'sendmail' => 'Sendmail', 'mailgun' => 'Mailgun'])
->value(isset($_ENV['MAIL_DRIVER']) ? $_ENV['MAIL_DRIVER'] : 'smtp')->setAttributes(['onchange' => 'mailDriverChange()']) !!} ->value(HTMLUtils::getEnvForAccount('MAIL_DRIVER', 'smtp'))->setAttributes(['onchange' => 'mailDriverChange()']) !!}
{!! Former::text('mail[from][name]')->label('from_name') {!! Former::text('mail[from][name]')->label('from_name')
->value(isset($_ENV['MAIL_FROM_NAME']) ? $_ENV['MAIL_FROM_NAME'] : '') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_FROM_NAME')) !!}
{!! Former::text('mail[from][address]')->label('from_address') {!! Former::text('mail[from][address]')->label('from_address')
->value(isset($_ENV['MAIL_FROM_ADDRESS']) ? $_ENV['MAIL_FROM_ADDRESS'] : '') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_FROM_ADDRESS')) !!}
{!! Former::text('mail[username]')->label('username') {!! Former::text('mail[username]')->label('username')
->value(isset($_ENV['MAIL_USERNAME']) ? $_ENV['MAIL_USERNAME'] : '') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_USERNAME')) !!}
<div id="standardMailSetup"> <div id="standardMailSetup">
{!! Former::text('mail[host]')->label('host') {!! Former::text('mail[host]')->label('host')
->value(isset($_ENV['MAIL_HOST']) ? $_ENV['MAIL_HOST'] : '') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_HOST')) !!}
{!! Former::text('mail[port]')->label('port') {!! Former::text('mail[port]')->label('port')
->value(isset($_ENV['MAIL_PORT']) ? $_ENV['MAIL_PORT'] : '587') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_PORT', '587')) !!}
{!! Former::select('mail[encryption]')->label('encryption') {!! Former::select('mail[encryption]')->label('encryption')
->options(['tls' => 'TLS', 'ssl' => 'SSL', '' => trans('texts.none')]) ->options(['tls' => 'TLS', 'ssl' => 'SSL', '' => trans('texts.none')])
->value(isset($_ENV['MAIL_ENCRYPTION']) ? $_ENV['MAIL_ENCRYPTION'] : 'tls') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_ENCRYPTION', 'tls')) !!}
{!! Former::password('mail[password]')->label('password') {!! Former::password('mail[password]')->label('password')
->value(isset($_ENV['MAIL_PASSWORD']) ? $_ENV['MAIL_PASSWORD'] : '') !!} ->value(HTMLUtils::getEnvForAccount('MAIL_PASSWORD')) !!}
</div> </div>
<div id="mailgunMailSetup"> <div id="mailgunMailSetup">
{!! Former::text('mail[mailgun_domain]')->label('mailgun_domain') {!! Former::text('mail[mailgun_domain]')->label('mailgun_domain')