Skip to content

Commit

Permalink
Added hooks for custom fetch email providers
Browse files Browse the repository at this point in the history
  • Loading branch information
Wouter0100 committed Dec 23, 2021
1 parent 01b8da7 commit 33767a5
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 71 deletions.
4 changes: 2 additions & 2 deletions app/Console/Commands/FetchEmails.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ public function handle()

$this->extra_import = [];

// Get active mailboxes
$this->mailboxes = Mailbox::get();
// Get active mailboxes with the default in_protocols
$this->mailboxes = Mailbox::whereIn('in_protocol', array_keys(Mailbox::$in_protocols))->get();

foreach ($this->mailboxes as $mailbox) {
if (!$mailbox->isInActive()) {
Expand Down
2 changes: 2 additions & 0 deletions app/Http/Controllers/MailboxesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,8 @@ public function ajax(Request $request)
$response['msg'] = __('Not enough permissions');
}

$response = \Eventy::filter('mailbox.fetch_test', $response, $mailbox);

// Check if outgoing port is open.
if (!$response['msg']) {
$test_result = \Helper::checkPort($mailbox->in_server, $mailbox->in_port);
Expand Down
33 changes: 32 additions & 1 deletion app/Mailbox.php
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,12 @@ public function isActive()
*/
public function isInActive()
{
$in_active = \Eventy::filter('mailbox.in_active', null, $this);

if (is_bool($in_active)) {
return $in_active;
}

if ($this->in_protocol && $this->in_server && $this->in_port && $this->in_username && $this->in_password) {
return true;
} else {
Expand Down Expand Up @@ -595,7 +601,32 @@ public function getInEncryptionName()
*/
public function getInProtocolName()
{
return self::$in_protocols[$this->in_protocol] ?? '';
return $this->getInProtocols()[$this->in_protocol] ?? '';
}

/**
* Get incoming protocol display name for the UI.
*
* @return array
*/
public static function getInProtocolDisplayNames()
{
$display_names = self::$in_protocols;

$display_names[self::IN_PROTOCOL_IMAP] = 'IMAP';
$display_names[self::IN_PROTOCOL_POP3] = 'POP3';

return \Eventy::filter('mailbox.in_protocols.display_names', $display_names);
}

/**
* Get available incoming protocols.
*
* @return array
*/
public static function getInProtocols()
{
return \Eventy::filter('mailbox.in_protocols', self::$in_protocols);
}

/**
Expand Down
21 changes: 21 additions & 0 deletions public/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,27 @@ function mailboxConnectionInit(out_method_smtp)
function mailboxConnectionIncomingInit()
{
$(document).ready(function(){
let changeProtocol = function() {
let in_protocol = $('[name="in_protocol"]').val();

// Only show default connection settings for IMAP/POP3.
$('[data-in-protocol]').hide();

let specific = $('[data-in-protocol="' + in_protocol + '"]');

if (specific.length >= 1) {
specific.show();
} else {
$('[data-in-protocol="default"]').show();
}
};

$('[name="in_protocol"]').on('change', function(event) {
changeProtocol();
});

changeProtocol();

$('#check-connection').click(function(event) {
var button = $(this);
button.button('loading');
Expand Down
150 changes: 82 additions & 68 deletions resources/views/mailboxes/connection_incoming.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,118 +58,132 @@
<div class="col-sm-6">
<div class="flexy">
<select id="in_protocol" class="form-control input-sized" name="in_protocol" required autofocus>
<option value="{{ App\Mailbox::IN_PROTOCOL_IMAP }}" @if (old('in_protocol', $mailbox->in_protocol) == App\Mailbox::IN_PROTOCOL_IMAP)selected="selected"@endif>IMAP</option>
<option value="{{ App\Mailbox::IN_PROTOCOL_POP3 }}" @if (old('in_protocol', $mailbox->in_protocol) == App\Mailbox::IN_PROTOCOL_POP3)selected="selected"@endif>POP3</option>
@foreach($mailbox->getInProtocolDisplayNames() as $id => $name)
<option value="{{$id}}" @if (old('in_protocol', $mailbox->in_protocol) == $id)selected="selected"@endif>{{$name}}</option>
@endforeach
</select>
</div>

@include('partials/field_error', ['field'=>'in_protocol'])
</div>
</div>

<div class="form-group{{ $errors->has('in_server') ? ' has-error' : '' }}">
<label for="in_server" class="col-sm-2 control-label">{{ __('Server') }}</label>
<div data-in-protocol="default" style="display: none;">
<div class="form-group{{ $errors->has('in_server') ? ' has-error' : '' }}">
<label for="in_server" class="col-sm-2 control-label">{{ __('Server') }}</label>

<div class="col-sm-6">
<input id="in_server" type="text" class="form-control input-sized" name="in_server" value="{{ old('in_server', $mailbox->in_server) }}" maxlength="255">
<div class="col-sm-6">
<input id="in_server" type="text" class="form-control input-sized" name="in_server" value="{{ old('in_server', $mailbox->in_server) }}" maxlength="255">

{{--@include('partials/field_error', ['field'=>'in_server'])--}}
{{--@include('partials/field_error', ['field'=>'in_server'])--}}
</div>
</div>
</div>

<div class="form-group{{ $errors->has('in_port') ? ' has-error' : '' }}">
<label for="in_port" class="col-sm-2 control-label">{{ __('Port') }}</label>
<div class="form-group{{ $errors->has('in_port') ? ' has-error' : '' }}">
<label for="in_port" class="col-sm-2 control-label">{{ __('Port') }}</label>

<div class="col-sm-6">
<input id="in_port" type="number" class="form-control input-sized" name="in_port" value="{{ old('in_port', $mailbox->in_port) }}" maxlength="5" required autofocus>
<div class="col-sm-6">
<input id="in_port" type="number" class="form-control input-sized" name="in_port" value="{{ old('in_port', $mailbox->in_port) }}" maxlength="5" required autofocus>

{{--@include('partials/field_error', ['field'=>'in_port'])--}}
{{--@include('partials/field_error', ['field'=>'in_port'])--}}
</div>
</div>
</div>

<div class="form-group{{ $errors->has('in_username') ? ' has-error' : '' }}">
<label for="in_username" class="col-sm-2 control-label">{{ __('Username') }}</label>
<div class="form-group{{ $errors->has('in_username') ? ' has-error' : '' }}">
<label for="in_username" class="col-sm-2 control-label">{{ __('Username') }}</label>

<div class="col-sm-6">
<input id="in_username" type="text" class="form-control input-sized" name="in_username" value="{{ old('in_username', $mailbox->in_username) }}" maxlength="100" {{-- This added to prevent autocomplete in Chrome --}}autocomplete="new-password">
<div class="col-sm-6">
<input id="in_username" type="text" class="form-control input-sized" name="in_username" value="{{ old('in_username', $mailbox->in_username) }}" maxlength="100" {{-- This added to prevent autocomplete in Chrome --}}autocomplete="new-password">

{{--@include('partials/field_error', ['field'=>'in_username'])--}}
{{--@include('partials/field_error', ['field'=>'in_username'])--}}
</div>
</div>
</div>

<div class="form-group{{ $errors->has('in_password') ? ' has-error' : '' }}">
<label for="in_password" class="col-sm-2 control-label">{{ __('Password') }}</label>
<div class="form-group{{ $errors->has('in_password') ? ' has-error' : '' }}">
<label for="in_password" class="col-sm-2 control-label">{{ __('Password') }}</label>

<div class="col-sm-6">
<input id="in_password" type="password" class="form-control input-sized" name="in_password" value="{{ old('in_password', $mailbox->inPasswordSafe()) }}" maxlength="255" {{-- This added to prevent autocomplete in Chrome --}}autocomplete="new-password">
<div class="col-sm-6">
<input id="in_password" type="password" class="form-control input-sized" name="in_password" value="{{ old('in_password', $mailbox->inPasswordSafe()) }}" maxlength="255" {{-- This added to prevent autocomplete in Chrome --}}autocomplete="new-password">

{{--@include('partials/field_error', ['field'=>'in_password'])--}}
{{--@include('partials/field_error', ['field'=>'in_password'])--}}
</div>
</div>
</div>

<div class="form-group{{ $errors->has('in_encryption') ? ' has-error' : '' }}">
<label for="in_encryption" class="col-sm-2 control-label">{{ __('Encryption') }}</label>
<div class="form-group{{ $errors->has('in_encryption') ? ' has-error' : '' }}">
<label for="in_encryption" class="col-sm-2 control-label">{{ __('Encryption') }}</label>

<div class="col-sm-6">
<select id="in_encryption" class="form-control input-sized" name="in_encryption" @if ($mailbox->out_method == App\Mailbox::OUT_METHOD_SMTP) required @endif autofocus>
<option value="{{ App\Mailbox::IN_ENCRYPTION_NONE }}" @if (old('in_encryption', $mailbox->in_encryption) == App\Mailbox::IN_ENCRYPTION_NONE)selected="selected"@endif>{{ __('None') }}</option>
<option value="{{ App\Mailbox::IN_ENCRYPTION_SSL }}" @if (old('in_encryption', $mailbox->in_encryption) == App\Mailbox::IN_ENCRYPTION_SSL)selected="selected"@endif>SSL</option>
<option value="{{ App\Mailbox::IN_ENCRYPTION_TLS }}" @if (old('in_encryption', $mailbox->in_encryption) == App\Mailbox::IN_ENCRYPTION_TLS)selected="selected"@endif>TLS</option>
</select>
<div class="col-sm-6">
<select id="in_encryption" class="form-control input-sized" name="in_encryption" @if ($mailbox->out_method == App\Mailbox::OUT_METHOD_SMTP) required @endif autofocus>
<option value="{{ App\Mailbox::IN_ENCRYPTION_NONE }}" @if (old('in_encryption', $mailbox->in_encryption) == App\Mailbox::IN_ENCRYPTION_NONE)selected="selected"@endif>{{ __('None') }}</option>
<option value="{{ App\Mailbox::IN_ENCRYPTION_SSL }}" @if (old('in_encryption', $mailbox->in_encryption) == App\Mailbox::IN_ENCRYPTION_SSL)selected="selected"@endif>SSL</option>
<option value="{{ App\Mailbox::IN_ENCRYPTION_TLS }}" @if (old('in_encryption', $mailbox->in_encryption) == App\Mailbox::IN_ENCRYPTION_TLS)selected="selected"@endif>TLS</option>
</select>

@include('partials/field_error', ['field'=>'in_encryption'])
@include('partials/field_error', ['field'=>'in_encryption'])
</div>
</div>
</div>

<div class="form-group{{ $errors->has('in_imap_folders') ? ' has-error' : '' }}">
<label for="in_imap_folders" class="col-sm-2 control-label">{{ __('IMAP Folders') }}</label>
<div class="form-group{{ $errors->has('in_imap_folders') ? ' has-error' : '' }}">
<label for="in_imap_folders" class="col-sm-2 control-label">{{ __('IMAP Folders') }}</label>

<div class="col-sm-6 flexy">
<select id="in_imap_folders" class="form-control input-sized" name="in_imap_folders[]" multiple>
@foreach ($mailbox->getInImapFolders() as $imap_folder)
<option value="{{ $imap_folder }}" selected="selected">{{ $imap_folder }}</option>
@endforeach
</select>
<div class="col-sm-6 flexy">
<select id="in_imap_folders" class="form-control input-sized" name="in_imap_folders[]" multiple>
@foreach ($mailbox->getInImapFolders() as $imap_folder)
<option value="{{ $imap_folder }}" selected="selected">{{ $imap_folder }}</option>
@endforeach
</select>

<a href="#" class="btn btn-link btn-sm" data-toggle="tooltip" title="{{ __('Retrieve a list of available IMAP folders from the server') }}" id="retrieve-imap-folders" data-loading-text="{{ __('Retrieving') }}">{{ __('Get folders') }}</a>
<a href="#" class="btn btn-link btn-sm" data-toggle="tooltip" title="{{ __('Retrieve a list of available IMAP folders from the server') }}" id="retrieve-imap-folders" data-loading-text="{{ __('Retrieving') }}">{{ __('Get folders') }}</a>

@include('partials/field_error', ['field'=>'in_imap_folders'])
@include('partials/field_error', ['field'=>'in_imap_folders'])
</div>
</div>
</div>

<div class="form-group{{ $errors->has('in_validate_cert') ? ' has-error' : '' }}">
<label for="in_validate_cert" class="col-sm-2 control-label">{{ __('Validate Certificate') }}</label>
<div class="form-group{{ $errors->has('in_validate_cert') ? ' has-error' : '' }}">
<label for="in_validate_cert" class="col-sm-2 control-label">{{ __('Validate Certificate') }}</label>

<div class="col-sm-6">
<div class="controls">
<div class="onoffswitch-wrap">
<div class="onoffswitch">
<input type="checkbox" name="in_validate_cert" value="1" id="in_validate_cert" class="onoffswitch-checkbox" @if (old('in_validate_cert', $mailbox->in_validate_cert))checked="checked"@endif >
<label class="onoffswitch-label" for="in_validate_cert"></label>
<div class="col-sm-6">
<div class="controls">
<div class="onoffswitch-wrap">
<div class="onoffswitch">
<input type="checkbox" name="in_validate_cert" value="1" id="in_validate_cert" class="onoffswitch-checkbox" @if (old('in_validate_cert', $mailbox->in_validate_cert))checked="checked"@endif >
<label class="onoffswitch-label" for="in_validate_cert"></label>
</div>

<i class="glyphicon glyphicon-info-sign icon-info icon-info-inline" data-toggle="popover" data-trigger="hover" data-placement="top" data-content="{{ __('Disable certificate validation if receiving "Certificate failure" error.') }}"></i>
</div>

<i class="glyphicon glyphicon-info-sign icon-info icon-info-inline" data-toggle="popover" data-trigger="hover" data-placement="top" data-content="{{ __('Disable certificate validation if receiving "Certificate failure" error.') }}"></i>
</div>
</div>

@include('partials/field_error', ['field'=>'in_validate_cert'])
@include('partials/field_error', ['field'=>'in_validate_cert'])

<div class="form-help">{!! __("Make sure to save settings before checking connection.") !!}</div>
<div class="form-help">{!! __("Make sure to save settings before checking connection.") !!}</div>
</div>
</div>
</div>

<div>
<div class="form-group">
<label for="imap_sent_folder" class="col-sm-2 control-label">{{ __('IMAP Folder To Save Outgoing Replies') }}</label>
<div>
<div class="form-group">
<label for="imap_sent_folder" class="col-sm-2 control-label">{{ __('IMAP Folder To Save Outgoing Replies') }}</label>

<div class="col-sm-6">
<input id="imap_sent_folder" type="text" class="form-control input-sized" name="imap_sent_folder" value="{{ old('imap_sent_folder', $mailbox->imap_sent_folder) }}" maxlength="255" placeholder="Sent">
<div class="form-help">{!! __("Enter IMAP folder name to save outgoing replies if your mail service provider does not do it automatically (Gmail does it), otherwise leave it blank.") !!}</div>
<div class="col-sm-6">
<input id="imap_sent_folder" type="text" class="form-control input-sized" name="imap_sent_folder" value="{{ old('imap_sent_folder', $mailbox->imap_sent_folder) }}" maxlength="255" placeholder="Sent">
<div class="form-help">{!! __("Enter IMAP folder name to save outgoing replies if your mail service provider does not do it automatically (Gmail does it), otherwise leave it blank.") !!}</div>
</div>
</div>
<hr/>
</div>
<hr/>
</div>

@foreach($mailbox->getInProtocols() as $key => $name)
{{-- Skip the default protocols --}}
@if(isset(\App\Mailbox::$in_protocols[$key]))
@continue
@endif

<div data-in-protocol="{{$key}}" style="display: none;">
@include(\Eventy::filter('mailbox.connection_incoming.settings', null, $key, $name))
</div>
@endforeach

<div class="form-group margin-top-2">
<div class="col-sm-6 col-sm-offset-2">
<button type="submit" class="btn btn-primary">
Expand Down

0 comments on commit 33767a5

Please sign in to comment.