<!DOCTYPE html> <html class="rl-started-trigger"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="google" content="notranslate"> <meta name="robots" content="noindex,nofollow,noodp"> <meta name="theme-color" content="black"> <title></title> <style id="app-boot-css">:root{--fontSans:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--fontSerif:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif;--fontMono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}#rl-app.fontArial{--fontSans:"Nimbus Sans L","Liberation sans","Arial Unicode MS",Arial,Helvetica,Garuda,Utkal,FreeSans,sans-serif}#rl-app.fontTahoma{--fontSans:"Luxi Sans",Tahoma,Loma,Geneva,Meera,sans-serif}#rl-app.fontTrebuchet{--fontSans:"DejaVu Sans Condensed",Trebuchet,"Trebuchet MS",sans-serif}#rl-app.fontLucida{--fontSans:"Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","DejaVu LGC Sans",sans-serif}#rl-app.fontVerdana{--fontSans:"DejaVu Sans",Verdana,Geneva,"Bitstream Vera Sans","DejaVu LGC Sans",sans-serif}#rl-app.fontMonoCourier{--fontMono:"Liberation Mono","Courier New",FreeMono,Courier,monospace}#rl-app.fontMonoLucida{--fontMono:"DejaVu Sans Mono","DejaVu LGC Sans Mono","Bitstream Vera Sans Mono","Lucida Console",Monaco,monospace}#rl-app.fontSerifTimes{--fontSerif:"Nimbus Roman No9 L","Times New Roman",Times,FreeSerif,serif}#rl-app.fontSerifPalatino{--fontSerif:"Bitstream Charter","Palatino Linotype",Palatino,Palladio,"URW Palladio L","Book Antiqua",Times,serif}#rl-app.fontSerifGeorgia{--fontSerif:"URW Palladio L",Georgia,Times,serif}body,html{margin:0;padding:0;-webkit-text-size-adjust:100%}#rl-app *,#rl-app ::after,#rl-app ::before{box-sizing:border-box}#rl-app{background-color:var(--main-bg-color,#aaa);color:var(--main-color,#333);font-family:var(--fontSans);-webkit-touch-callout:none;font-size:var(--main-font-size,14px);line-height:1.25;position:relative}body#rl-app{height:100vh;height:100dvh;width:100vw}#rl-BadBrowser,#rl-NoCookie,#rl-loading,#rl-loading-error{color:var(--loading-color,#000);text-shadow:var(--loading-text-shadow);font-size:214%;line-height:130%;position:fixed;text-align:center;top:50%;transform:translateY(-50%);width:100%}#rl-loading .icon-spinner{height:1em;width:1em}
</style> <link type="text/css" rel="stylesheet" href="/snappymail/v/2.38.2/static/css/admin.min.css"> <link rel="manifest" href="/snappymail/v/2.38.2/static/manifest.json"> <link rel="icon" href="/snappymail/v/2.38.2/static/favicon.svg" type="image/svg+xml"> <style id="app-theme-style" data-name="Default">:root{color-scheme:light;/* MAIN */
	--main-color:#333;--main-bg-color:#48525C;--main-bg-image:url("/snappymail/v/2.38.2/themes/Default/images/background.jpg");/* LOADING */
	--loading-color:#ddd;--loading-text-shadow:0px 1px 0px rgba(0,0,0,0.5);/* LOGIN */
	--login-color:#eee;--login-bg-color:rgba(0,0,0,0.5);--login-box-shadow:0px 2px 10px rgba(0,0,0,0.5);--login-border:none;--login-border-radius:7px;/* MENU */
	--dropdown-menu-color:#333;--dropdown-menu-bg-color:#fff;--dropdown-menu-hover-bg-color:#48525C;--dropdown-menu-hover-color:#eee;--dropdown-menu-disable-color:#999;/* FOLDERS */
	--folders-color:#fff;--folders-disabled-color:#aaa;--folders-selected-color:#fff;--folders-selected-bg-color:rgba(0,0,0,0.5);--folders-focused-color:#fff;--folders-focused-bg-color:rgba(0,0,0,0.7);--folders-hover-color:#fff;--folders-hover-bg-color:rgba(0,0,0,0.5);--folders-drop-color:#fff;--folders-drop-bg-color:rgba(0,0,0,0.5);/* SETTINGS */
	--settings-menu-color:#fff;--settings-menu-selected-color:#fff;--settings-menu-selected-bg-color:rgba(0,0,0,0.5);--settings-menu-hover-color:#fff;--settings-menu-hover-bg-color:rgba(0,0,0,0.5);/* MESSAGE LIST */
	--message-list-toolbar-bg-color:#eee;}.thm-message-list-top-toolbar,.thm-message-list-bottom-toolbar{background-image:linear-gradient(to bottom,#f4f4f4,#dfdfdf) !important;background-repeat:repeat-x !important;}</style> <link type="image/png" rel="shortcut icon" href="/snappymail/v/2.38.2/static/apple-touch-icon.png"> <link type="image/png" rel="apple-touch-icon" href="/snappymail/v/2.38.2/static/apple-touch-icon.png"> </head> <body id="rl-app" data-admin='1' spellcheck="false"> <div id="rl-loading"> <div id="rl-loading-desc">SnappyMail</div> <i class="icon-spinner"></i> <noscript><div class="error-desc">JavaScript is required for this application.<br />
JavaScript support is not available in your browser.<br />
Please enable JavaScript support in your browser settings and retry.</div></noscript> </div> <div id="rl-loading-error" hidden="">An error occurred.<br>Please refresh the page and try again.<br></div> <div id="rl-BadBrowser" hidden=""> <h1>Your browser is outdated.</h1> <div class="error-desc">To use all the features of the application,<br />
download and install one of the latest browsers.</div> </div> <div id="rl-NoCookie" hidden=""> <h1>Cookies support is required for this application.</h1> <div class="error-desc">Cookies support is not available in your browser.
Please enable Cookie support in your browser settings and retry.</div> </div> <div id="rl-content" hidden=""> <div id="rl-left"></div> <div id="rl-right"></div> </div> <div id="rl-popups"></div> <template id="CheckboxComponent"><label class="e-component e-checkbox material-design" data-bind="css: { 'disabled': !enable() }"> <div> <input type="checkbox" value="1" data-bind="checked: value, enable: enable, attr: {name: name}"> <div role="checkbox"></div> </div> <!-- ko if: label --> <span data-bind="attr: {'data-i18n': label}"></span> <!-- /ko --> </label> </template><template id="SelectComponent"><div class="e-component"> <select data-bind="options: options, value: value, optionsText: optionsText, optionsValue: optionsValue, css: className, optionsAfterRender: defaultOptionsAfterRender"></select> <!-- ko if: label --> <span data-bind="attr: {'data-i18n': label}"></span> <!-- /ko --> <!-- ko if: trigger --> <span data-bind="saveTrigger: trigger"></span> <!-- /ko --> </div> </template><template id="AdminLogin"><div class="descWrapper" data-i18n="TOP_PANEL/LABEL_ADMIN_PANEL"></div> <div class="alert" data-bind="hidden: !submitError()"> <a href="#" class="close" data-bind="click: hideError">×</a> <span data-bind="text: submitError"></span> </div> <form action="#/" spellcheck="false" method="POST" data-bind="submit: submitForm, css: {'errorAnimated': formError, 'submitting': submitRequest()}"> <div class="controls" data-bind="css: {'error': loginError}"> <span class="fontastic">👤</span> <input name="Login" required="" type="text" class="input-block-level" autofocus="" autocomplete="username" autocorrect="off" autocapitalize="off" data-bind="textInput: login, disable: submitRequest" data-i18n="[placeholder]LOGIN/LABEL_LOGIN"> </div> <div class="controls" data-bind="css: {'error': passwordError}"> <span class="fontastic">🔑</span> <input name="Password" required="" type="password" class="input-block-level" autocomplete="current-password" autocorrect="off" autocapitalize="off" data-bind="textInput: password, disable: submitRequest" data-i18n="[placeholder]GLOBAL/PASSWORD"> </div> <div class="controls"> <span class="fontastic">⏱</span> <input name="TOTP" type="text" pattern="[0-9]*" inputmode="numeric" class="input-block-level" autocomplete="one-time-code" autocorrect="off" autocapitalize="off" data-bind="textInput: totp, disable: submitRequest" data-i18n="[placeholder]LOGIN/LABEL_TOTP"> </div> <div id="plugin-Login-BottomControlGroup"></div> <div class="controls"> <button class="btn btn-large buttonLogin" data-bind="command: submitCommand" data-i18n="LOGIN/BUTTON_LOGIN"></button> </div> </form> </template><template id="AdminMenu"><nav data-bind="foreach: menu"> <a data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route), 'data-i18n': label }"></a> </nav> </template><template id="AdminPane"><div class="b-toolbar g-ui-user-select-none"> <a class="btn btn-thin fontastic toggleLeft" data-bind="click: toggleLeftPanel"></a> <h4>SnappyMail - <span data-i18n="TOP_PANEL/LABEL_ADMIN_PANEL"></span></h4> <a class="btn btn-logout fontastic" data-bind="click: logoutClick">⏻</a> </div> </template><template id="AdminSettingsAbout"><div class="form-horizontal"> <div class="legend" data-i18n="TAB_ABOUT/LEGEND_ABOUT"></div> <div class="row"> <div class="span4"> <div class="rl-logo"></div> <div> 2024 © <span data-i18n="TAB_ABOUT/LABEL_ALL_RIGHTS_RESERVED"></span> <br> <a class="g-ui-link" href="https://snappymail.eu/" target="_blank" style="padding-left: 0">https://snappymail.eu/</a> </div> </div> <div class="span6"> <h1 style="margin-bottom: 0;">SnappyMail</h1> <h4 style="margin-top: 0;" data-bind="text: version"></h4> <h4 style="color: #aaa; font-weight: normal;">An advanced fork of RainLoop</h4> <h4 style="color: #aaa; font-weight: normal;" data-i18n="TAB_ABOUT/LABEL_TAG_HINT"></h4> <a class="btn" target="_blank" href="https://github.com/sponsors/the-djmaze"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true"> <path stroke="#db61a2" fill="#db61a2" d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> <span style="margin-left:0.25rem">Sponsor</span> </a> <div> <hr> <div data-bind="visible: 'error' === statusType()"> <i class="fontastic" style="color:red">⚠</i> <span data-bind="text: errorDesc"></span> </div> <div data-bind="visible: 'available' === statusType()"> <i class="fontastic" style="color:orange">⚠</i> <span data-bind="html: coreVersionHtmlDesc"></span> <br> <span data-bind="if: coreWarning"> <br> <i class="fontastic" style="color:red">⚠</i> <b data-i18n="HINTS/WARNING"></b> <span data-i18n="TAB_ABOUT/HINT_READ_CHANGE_LOG"></span> <br> </span> <br> <a class="btn" href="https://github.com/the-djmaze/snappymail/releases" target="_blank" data-i18n="TAB_ABOUT/BUTTON_RELEASES"></a> <a class="btn" data-bind="visible: coreUpdatable, click: updateCoreData" data-i18n="GLOBAL/UPDATE"></a> <a class="btn" href="https://github.com/the-djmaze/snappymail/releases/latest" data-bind="visible: !coreUpdatable()" data-i18n="GLOBAL/UPDATE"></a> </div> <div data-bind="visible: 'up-to-date' === statusType()"> <i style="color: green">✔</i> <span data-i18n="TAB_ABOUT/HINT_IS_UP_TO_DATE"></span> </div> <div data-bind="visible: 'updating' === statusType()"> <i class="icon-spinner"></i> <span data-i18n="TAB_ABOUT/LABEL_UPDATING"></span>… </div> <div data-bind="visible: 'checking' === statusType()"> <i class="icon-spinner"></i> <span data-i18n="TAB_ABOUT/LABEL_CHECKING"></span>… </div> </div> <h3>System</h3> <table class="table table-hover table-bordered"><tbody> <tr> <td>Average load past minute</td> <td data-bind="text: load1"></td> </tr> <tr> <td>Average load past 5 minutes</td> <td data-bind="text: load5"></td> </tr> <tr> <td>Average load past 15 minutes</td> <td data-bind="text: load15"></td> </tr> </tbody> </table> <h3>PHP</h3> <div data-bind="hidden: php64" class="alert"> <i class="fontastic" style="color:red">⚠</i> PHP is running in 32bit mode. <a href="https://github.com/the-djmaze/snappymail/issues/830#issuecomment-1372112793">read here</a> </div> <table class="table table-hover table-bordered"><thead><tr> <th>Extension</th> <th>Loaded</th> </tr></thead><tbody data-bind="foreach: phpextensions"> <tr> <td data-bind="text: name"></td> <td data-bind="text: loaded ? '✔' : '❌'"></td> </tr> </tbody> </table> </div> </div> </div> </template><template id="AdminSettingsBranding"><div class="form-horizontal"> <div class="legend" data-i18n="TAB_BRANDING/LEGEND_BRANDING"></div> <div class="control-group"> <label data-i18n="TAB_BRANDING/LABEL_PAGE_TITLE"></label> <input class="span5" type="text" autocorrect="off" data-bind="textInput: title, saveTrigger: titleTrigger"> </div> <div class="control-group"> <label data-i18n="TAB_BRANDING/LABEL_LOADING_DESCRIPTION"></label> <input class="span5" type="text" autocorrect="off" data-bind="textInput: loadingDescription, saveTrigger: loadingDescriptionTrigger"> </div> <div class="control-group"> <label data-i18n="TAB_BRANDING/LABEL_FAVICON_URL"></label> <input class="span5" type="text" placeholder="https://" autocorrect="off" data-bind="textInput: faviconUrl, saveTrigger: faviconUrlTrigger"> </div> </div> </template><template id="AdminSettingsConfig"><div class="legend">application.ini</div> <form method="POST" data-bind="submit: saveConfig" spellcheck="false" autocomplete="off" autocapitalize="none"> <input type="search" data-bind="textInput: search" data-i18n="[placeholder]GLOBAL/SEARCH"> <table class="table table-hover table-bordered"> <!-- ko foreach: config --> <tbody> <tr><th colspan="3" data-bind="text: name"></th></tr> <!-- ko foreach: items --> <tr> <td data-bind="text: name"></td> <td> <!-- ko if: 'checkbox' == type --> <input type="checkbox" data-bind="attr: {name: key, checked: value}"> <!-- /ko --> <!-- ko if: options --> <select data-bind="attr: {name: key}, options: options, value: value"></select> <!-- /ko --> <!-- ko if: 'checkbox' != type && !options --> <input data-bind="attr: {name: key, type: type}, value: value" autocorrect="off"> <!-- /ko --> <em data-bind="text: comment, visible: comment"></em> </td> </tr> <!-- /ko --> </tbody> <!-- /ko --> </table> <button class="btn" data-i18n="GLOBAL/SAVE" data-bind="css:{'btn-success':saved()},attr:{'data-icon':saved()?'✔':'💾'}"></button> </form> </template><template id="AdminSettingsContacts"><div class="row" data-bind="visible: !contactsSupported"> <div class="alert span8" style="margin-top: 10px;"> <h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4> <div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DOES_NOT_SUPPORTED"></div> </div> </div> <form class="form-horizontal" spellcheck="false" data-bind="visible: contactsSupported"> <div class="legend" data-i18n="TAB_CONTACTS/LEGEND_CONTACTS"></div> <div class="control-group"> <div> <div data-bind="component: { name: 'Checkbox', params: { value: contactsEnable, label: 'TAB_CONTACTS/LABEL_ENABLE_CONTACTS' } }"></div> <div data-bind="component: { name: 'Checkbox', params: { value: contactsSync, label: 'TAB_CONTACTS/LABEL_ALLOW_SYNC' } }"></div> </div> </div> <div class="control-group"> <label data-i18n="TAB_CONTACTS/SUGGESTIONS_LIMIT"></label> <div> <input type="number" min="5" max="50" step="1" class="span1" data-bind="textInput: contactsSuggestionsLimit">   <span data-bind="saveTrigger: contactsSuggestionsLimitTrigger"></span> </div> </div> </form> <form class="form-horizontal" spellcheck="false" data-bind="visible: contactsSupported"> <div class="legend" data-i18n="TAB_CONTACTS/LEGEND_STORAGE"></div> <div class="control-group"> <label data-i18n="TAB_CONTACTS/LABEL_STORAGE_TYPE"></label> <div data-bind="component: { name: 'Select', params: { options: contactsTypesOptions, value: mainContactsType, trigger: contactsPdoTypeTrigger, optionsText: 'name', optionsValue: 'id' } }"></div> </div> <div data-bind="visible: 'sqlite' !== contactsPdoType()"> <div class="control-group"> <label data-i18n="TAB_CONTACTS/LABEL_STORAGE_DSN"></label> <div> <input type="text" class="span6" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="value: contactsPdoDsn, saveTrigger: contactsPdoDsnTrigger" placeholder="mysql:host=127.0.0.1;port=3306;dbname=snappymail"> </div> </div> <div class="control-group"> <label data-i18n="TAB_CONTACTS/LABEL_STORAGE_USER"></label> <div> <input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="value: contactsPdoUser, saveTrigger: contactsPdoUserTrigger"> </div> </div> <div class="control-group"> <label data-i18n="TAB_CONTACTS/LABEL_STORAGE_PASSWORD"></label> <div> <input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off" data-bind="value: contactsPdoPassword, saveTrigger: contactsPdoPasswordTrigger"> </div> </div> <div data-bind="visible: 'mysql' === contactsPdoType()"> <div class="control-group"> <label>SSL CA</label> <div> <textarea placeholder="PEM formatted" data-bind="value: contactsMySQLSSLCA, saveTrigger: contactsMySQLSSLCATrigger"></textarea> </div> </div> <div class="control-group"> <label></label> <div data-bind="component: { name: 'Checkbox', params: { value: contactsMySQLSSLVerify, label: 'VERIFY SERVER CERT' } }"></div> </div> <div class="control-group"> <label>SSL CIPHER</label> <div> <input type="text" placeholder="HIGH" data-bind="value: contactsMySQLSSLCiphers, saveTrigger: contactsMySQLSSLCiphersTrigger"> </div> </div> </div> </div> <div data-bind="visible: 'sqlite' === contactsPdoType()"> <div class="control-group"> <label></label> <div data-bind="component: { name: 'Checkbox', params: { value: contactsSQLiteGlobal, label: 'TAB_CONTACTS/SQLITE_GLOBAL' } }"></div> </div> <div class="control-group" data-bind="visible: contactsSQLiteGlobal"> <div class="alert"> <h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4> <div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DO_NOT_USE_THIS_DATABASE"></div> </div> </div> </div> <div data-bind="visible: contactsPdoType"> <div class="control-group"> <label></label> <a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }"> <i class="fontastic" data-bind="css: {'icon-spinner': testing()}">ℹ</i> <span data-i18n="GLOBAL/TEST"></span> </a> </div> </div> <div class="alert span8" data-bind="text: testContactsErrorMessage, visible: '' !== testContactsErrorMessage()"></div> </form> </template><template id="AdminSettingsDomains"><div class="legend"> <span data-i18n="TAB_DOMAINS/LEGEND_DOMAINS"></span> <i class="icon-spinner" style="margin: 5px" data-bind="visible: domains.loading"></i> </div> <p data-i18n="[html]TAB_DOMAINS/HTML_DOMAINS_HELPER"></p> <table class="table table-hover b-admin-domains-list-table" data-bind="i18nUpdate: domains"> <colgroup> <col> <col style="width: 140px"> <col style="width: 1%"> <col style="width: 1%"> </colgroup> <tbody data-bind="foreach: domains"> <tr data-bind="css: {'disabled': disabled }"> <td class="e-action"> <span class="domain-name" data-bind="text: name"></span> <span class="domain-alias" data-bind="if: alias">(alias)</span> </td> <td> <a class="btn btn-small btn-danger button-confirm-delete" data-bind="css: {'delete-access': askDelete()}, click: function(oDomain) { $root.deleteDomain(oDomain); }" data-i18n="TAB_DOMAINS/DELETE_ARE_YOU_SURE"></a> </td> <td> <span class="delete-domain fontastic" data-bind="visible: !askDelete(), click: function (oDomain) { $root.domainForDeletion(oDomain); }">🗑</span> </td> <td class="disabled-domain fontastic" data-bind="click: function (oDomain) { $root.disableDomain(oDomain); }, text: disabled() ? '☐' : '☑'"></td> </tr> </tbody> <tfoot> <tr><td colspan="4" style="text-align:right"> <a class="btn" data-bind="click: createDomain" data-icon="✚" data-i18n="TAB_DOMAINS/BUTTON_ADD_DOMAIN"></a>    <a class="btn" data-bind="click: createDomainAlias" data-icon="✚" data-i18n="TAB_DOMAINS/BUTTON_ADD_ALIAS"></a> </td></tr> </tfoot> </table> <div> <input data-i18n="[placeholder]GLOBAL/USERNAME" data-bind="textInput: username"> <button class="btn" data-i18n="GLOBAL/TEST" data-bind="click: testUsername"></button> </div> </template><template id="AdminSettingsGeneral"><div class="row" data-bind="visible: weakPassword"> <div class="alert alert-warning span8" style="margin-top: 10px;"> <h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4> <br> <div data-i18n="[html]TAB_GENERAL/HTML_ALERT_WEAK_PASSWORD"></div> </div> </div> <div class="row" data-bind="visible: dataFolderAccess"> <div class="alert alert-error span8" style="margin-top: 10px;"> <h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4> <div data-i18n="TAB_GENERAL/ALERT_DATA_ACCESS"></div> <a href="https://github.com/the-djmaze/snappymail/wiki/Installation-instructions#secure-data-folder" target="_blank"><strong>https://github.com/the-djmaze/snappymail/wiki/Installation-instructions</strong></a> </div> </div> <div class="form-horizontal"> <div class="legend" data-i18n="TAB_GENERAL/LEGEND_INTERFACE"></div> <div class="control-group"> <label data-i18n="TAB_GENERAL/LABEL_LANGUAGE"></label> <div> <span class="select" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span> <span data-bind="saveTrigger: languageTrigger"></span> </div> </div> <div class="control-group"> <label data-i18n="TAB_GENERAL/LABEL_LANGUAGE_ADMIN"></label> <div> <span class="select" tabindex="0" data-bind="text: languageAdminFullName, click: selectLanguageAdmin, onSpace: selectLanguageAdmin, onEnter: selectLanguageAdmin"></span> <span data-bind="saveTrigger: languageAdminTrigger"></span> </div> </div> <div class="control-group"> <label data-i18n="TAB_GENERAL/LABEL_THEME"></label> <div data-bind="component: { name: 'Select', params: { options: themesOptions, value: theme, trigger: themeTrigger, optionsText: 'optText', optionsValue: 'optValue', size: 2 } }"></div> </div> <div class="control-group"> <div> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_GENERAL/LABEL_ALLOW_LANGUAGES_ON_SETTINGS', value: allowLanguagesOnSettings } }"></div> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_GENERAL/LABEL_ALLOW_THEMES_ON_SETTINGS', value: capaThemes } }"></div> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_GENERAL/LABEL_ALLOW_BACKGROUND_ON_SETTINGS', value: capaUserBackground } }"></div> </div> </div> <div class="control-group"> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_GENERAL/LABEL_SHOW_THUMBNAILS', value: capaAttachmentThumbnails } }"></div> </div> <div class="legend" data-i18n="TAB_GENERAL/LEGEND_MAIN"></div> <div class="control-group"> <label data-i18n="TAB_GENERAL/LABEL_ATTACHMENT_SIZE_LIMIT"></label> <div> <input type="number" min="1" step="1" class="span1" data-bind="textInput: attachmentLimit">   <span data-i18n="MB"></span> <span data-bind="saveTrigger: attachmentLimitTrigger"></span> <br> <br> <div class="alert alert-info"> <b>PHP: </b><!-- ko text: uploadDataDesc --><!-- /ko --> </div> </div> </div> <div class="control-group"> <div> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_GENERAL/LABEL_ALLOW_ADDITIONAL_ACCOUNTS', value: capaAdditionalAccounts } }"></div> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_GENERAL/LABEL_ALLOW_IDENTITIES', value: capaIdentities } }"></div> </div> </div> </div> </template><template id="AdminSettingsLogin"><div class="form-horizontal"> <div class="legend" data-i18n="TAB_LOGIN/LEGEND_LOGIN_SCREEN"></div> <div class="control-group"> <label data-i18n="TAB_LOGIN/LABEL_DEFAULT_DOMAIN"></label> <input class="span3" type="text" spellcheck="false" autocomplete="off" autocapitalize="none" autocorrect="off" data-bind="textInput: loginDefaultDomain, saveTrigger: loginDefaultDomainTrigger"> </div> <div class="control-group"> <div> <div data-bind="component: { name: 'Checkbox', params: { value: determineUserDomain, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_DOMAIN' } }"></div> <div data-bind="component: { name: 'Checkbox', params: { value: allowLanguagesOnLogin, label: 'TAB_LOGIN/LABEL_ALLOW_LANGUAGES_ON_LOGIN' } }"></div> <div data-bind="visible: allowLanguagesOnLogin, component: { name: 'Checkbox', params: { enable: allowLanguagesOnLogin, value: determineUserLanguage, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_LANGUAGE' } }"></div> </div> </div> </div> </template><template id="AdminSettingsPackages"><div class="legend"> <span data-i18n="SETTINGS_LABELS/PACKAGES"></span> <i class="icon-spinner" style="margin: 5px" data-bind="visible: packages.loading"></i> </div> <div class="alert" style="margin-top: 10px;" data-bind="visible: !packages.real() && !packages.loading()"> <div data-i18n="TAB_PACKAGES/ALERT_CANNOT_ACCESS_REPOSITORY"></div> <!-- ko text: packages.error() --><!-- /ko --> </div> <div class="alert" style="margin-top: 10px;" data-bind="visible: packagesError()"> <a href="#" class="close" data-bind="click: function () { packagesError('') }">×</a> <span data-bind="text: packagesError"></span> </div> <div data-bind="component: { name: 'Checkbox', params: { value: pluginsEnable, label: 'TAB_PACKAGES/LABEL_ENABLE_PLUGINS' } }"></div> <br> <input type="search" data-bind="textInput: search" data-i18n="[placeholder]GLOBAL/SEARCH"> <br> <div data-bind="visible: packagesUpdate().length"> <div class="legend"> <span data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_UPDATE"></span> (<span data-bind="text: packagesUpdate().length"></span>) </div> <div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesUpdate} }"></div> </div> <div id="packages-installed" data-bind="visible: packagesCurrent().length, css: {'disabled': !pluginsEnable()}"> <div class="legend" data-i18n="TAB_PACKAGES/LEGEND_INSTALLED_PACKAGES"></div> <div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesCurrent} }"></div> </div> <div data-bind="visible: packagesAvailable().length"> <div class="legend" data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_INSTALLATION"></div> <div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailable} }"></div> </div> </template><template id="AdminSettingsPackagesTable"><table class="table table-hover table-bordered" data-bind="i18nUpdate: f"> <colgroup> <col> <col style="width: 100px"> <col style="width: 80px"> </colgroup> <tbody data-bind="foreach: f"> <tr data-bind="css: {'disabled': !enabled() }"> <td> <div> <span class="package-name" data-bind="text: name"></span> <a class="package-configure fontastic" data-bind="visible: installed">⚙</a> <a class="package-active fontastic" data-bind="visible: installed, text: enabled() ? '☑' : '☐'"></a> <span class="package-installed" data-bind="text: installed"></span> </div> <div class="package-desc" data-bind="text: desc"></div> </td> <td data-bind="text: version"></td> <td> <a class="fontastic" data-bind="visible: !loading() && canBeUpdated, click: function () { $root.installPackage($data); }">📥</a>   <a class="fontastic" data-bind="visible: !loading() && canBeDeleted, click: function () { $root.deletePackage($data); }">🗑</a> <i class="icon-spinner" data-bind="visible: loading"></i> </td> </tr> </tbody> </table> </template><template id="AdminSettingsPluginProperty"> <label data-bind="text: label, visible: 5 !== type"></label> <!-- ko if: 0 === type --> <input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="value: value, attr: {placeholder: placeholder}"> <!-- /ko --> <!-- ko if: 1 === type --> <input type="number" step="1" data-bind="value: value, attr: {placeholder: placeholder}"> <!-- /ko --> <!-- ko if: 3 === type --> <input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="value: value, attr: {placeholder: placeholder}"> <!-- /ko --> <!-- ko if: 2 === type --> <textarea rows="5" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="value: value, attr: {placeholder: placeholder }"></textarea> <!-- /ko --> <!-- ko if: 4 === type --> <select data-bind="options: options, value: value"></select> <!-- /ko --> <!-- ko if: 5 === type --> <div data-bind="component: { name: 'Checkbox', params: { value: value, label: label } }"></div> <!-- /ko --> <!-- ko if: 6 === type --> <input type="url" data-bind="value: value, attr: {placeholder: placeholder}"> <!-- /ko --> <!-- ko if: 8 === type --> <select data-bind="options: options, optionsText: 'name', optionsValue: 'id', value: value"></select> <!-- /ko --> <!-- ko if: '' !== desc --> <span tabindex="0" class="help-block"><span data-bind="text: desc"></span></span> <!-- /ko --> </template><template id="AdminSettingsSecurity"><div class="legend" data-i18n="TAB_SECURITY/LEGEND_SECURITY"></div> <div class="form-horizontal"> <div class="control-group"> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_SECURITY/LABEL_USE_IMAGE_PROXY', value: proxyExternalImages } }"></div> </div> </div> <div class="legend" data-i18n="TAB_SECURITY/CRYPTO"></div> <div class="form-horizontal"> <div class="control-group"> <div> <div data-bind="component: { name: 'Checkbox', params: { label: gnuPGversion, value: capaGnuPG } }"></div> <div data-bind="component: { name: 'Checkbox', params: { label: 'OpenPGP.js', value: capaOpenPGP } }"></div> <div data-bind="component: { name: 'Checkbox', params: { label: 'TAB_SECURITY/LABEL_AUTO_VERIFY', value: autoVerifySignatures } }"></div> </div> </div> </div> <form class="form-horizontal" spellcheck="false"> <div class="legend" data-i18n="TAB_SECURITY/LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS"></div> <div class="control-group" data-bind="css: {'error': adminLoginError}"> <label data-i18n="GLOBAL/USERNAME"></label> <input type="text" autocomplete="username" autocorrect="off" autocapitalize="off" data-bind="textInput: adminLogin"> </div> <div class="control-group"> <label data-i18n="TAB_SECURITY/LABEL_CURRENT_PASSWORD"></label> <input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off" data-bind="textInput: adminPassword"> </div> <div class="control-group" data-bind="css: {'error': adminPasswordNewError}"> <label data-i18n="TAB_SECURITY/LABEL_NEW_PASSWORD"></label> <input type="password" autocomplete="new-password" autocorrect="off" autocapitalize="off" data-bind="textInput: adminPasswordNew"> </div> <div class="control-group" data-bind="css: {'error': adminPasswordNewError}"> <label data-i18n="TAB_SECURITY/LABEL_REPEAT_PASSWORD"></label> <input type="password" autocomplete="new-password" autocorrect="off" autocapitalize="off" data-bind="textInput: adminPasswordNew2"> </div> <div class="control-group"> <label data-i18n="LOGIN/LABEL_TOTP"></label> <input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" pattern="[A-Z2-7]{16,}" data-bind="textInput: adminTOTP"> <button type="button" data-bind="visible:!adminTOTP(), click:generateTOTP">Generate</button> </div> <div class="control-group"> <label></label> <pre data-bind="text: viewQRCode" style="font-family:var(--fontMono);font-size:11px;letter-spacing:-1px;line-height:1;"></pre> </div> <div class="control-group"> <label></label> <a class="btn" data-bind="command: saveAdminUserCommand, css: { 'btn-success': saveSuccess, 'btn-danger': saveError }" data-icon="🔑" data-i18n="GLOBAL/SAVE"></a> </div> </form> </template><template id="PopupsDomain"><header> <a href="#" class="close" data-bind="click: close">×</a> <h3 data-bind="text: headerText"></h3> </header> <form class="modal-body" action="#/" spellcheck="false" onsubmit="return false;"> <div class="row" data-bind="hidden: edit" style="margin-bottom: 20px;"> <div class="span5"> <span data-i18n="POPUPS_DOMAIN/LABEL_NAME"></span> <span style="opacity:0.7"> (<span data-i18n="POPUPS_DOMAIN/NAME_HELPER"></span>)</span> <br> <input name="Name" type="text" class="span4" autofocus="" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="textInput: name"> <div class="alert-error" data-bind="visible: savingError, text: savingError"></div> <button class="btn" type="button" data-bind="click: autoconfig"> <i class="fontastic" data-bind="css: {'icon-spinner': detectingConfig()}">⚙</i> autoconfig </button> </div> <div class="span5 alert-info domain-desc" data-bind="visible: domainDesc, html: domainDesc"></div> </div> <div class="form-horizontal domain-form"> <div class="tabs"> <input type="radio" name="tabs" id="tab-imap" checked> <label for="tab-imap" role="tab" tabindex="0" data-bind="css: { 'testing-done': testingDone, 'testing-error': testingImapError }" >IMAP</label> <div class="tab-content" role="tabpanel" aria-hidden="false"> <div class="alert alert-error" data-bind="visible: testingImapError, text: testingImapError"></div> <div class="row"> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_SERVER"></span> <br> <input name="IMAP[host]" type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="textInput: imapHost, hasfocus: imapHostFocus"> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_SECURE"></span> <br> <select name="IMAP[type]" class="span2" data-bind="value: imapType"> <option value="0" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_NONE"></option> <option value="1">SSL/TLS</option> <option value="2">STARTTLS</option> </select> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_PORT"></span> <br> <input name="IMAP[port]" type="number" style="width:6em" data-bind="textInput: imapPort"> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/TIMEOUT"></span> <br> <input name="IMAP[timeout]" type="number" min="5" step="1" style="width:6em" data-bind="textInput: imapTimeout"> </div> </div> <br> <div style="display: inline-block;" data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_USE_SHORT_LOGIN', value: imapShortLogin } }"></div> <span style="opacity:0.7"> (user@example.com → user)</span> <br> <div style="display: inline-block;" data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_LOWERCASE_LOGIN', value: imapLowerLogin } }"></div> <span style="opacity:0.7"> (USER@example.com → user@example.com)</span> <h4>SSL/TLS</h4> <div data-bind="component: { name: 'Checkbox', params: { value: imapSslVerify_peer, label: 'TAB_SECURITY/LABEL_REQUIRE_VERIFICATION' } }"></div> <div data-bind="component: { name: 'Checkbox', params: { enable: imapSslVerify_peer, value: imapSslAllow_self_signed, label: 'TAB_SECURITY/LABEL_ALLOW_SELF_SIGNED' } }"></div> <h4> <span data-i18n="POPUPS_DOMAIN/DISABLE_CAPABILITIES"></span> <a style="margin-left:0.5em" href="https://github.com/the-djmaze/snappymail/wiki/IMAP-capabilities" target="_blank">ⓘ</a> </h4> <div data-bind="foreach: imapCapabilities" style="columns: 16em auto"> <div> <label class="e-component e-checkbox material-design"> <div> <input type="checkbox" data-bind="checked: $parent.imapDisabled_capabilities,  value: $data"> <div role="checkbox"></div> </div> <span data-bind="text: $data"></span> </label> </div> </div> <h4 data-i18n="POPUPS_DOMAIN/LIMITS"></h4> <div class="control-group"> <label data-i18n="POPUPS_DOMAIN/MESSAGES"></label> <input name="IMAP[message_list_limit]" type="number" min="0" step="1" class="span2" data-bind="textInput: imapMessage_list_limit"> </div> <!-- <div class="control-group"> <label data-i18n="POPUPS_DOMAIN/FOLDERS"></label> <input name="IMAP[folder_list_limit]" type="number" min="0" step="1" class="span1" data-bind="textInput: imapFolder_list_limit"> </div>         "use_expunge_all_on_delete": false,         "fast_simple_search": true,         "force_select": false,         "message_all_headers": false, <div class="control-group"> <label>Search filter</label> <input name="IMAP[search_filter]" type="text" class="span3" data-bind="textInput: imapSearch_filter"> </div> --> <div class="control-group"> <label data-i18n="POPUPS_DOMAIN/VALID_SPAM_HEADERS"></label> <input name="IMAP[spam_headers]" type="text" class="span3" data-bind="textInput: imapSpam_headers" title="rspamd,spamassassin,bogofilter"> </div> <div class="control-group"> <label data-i18n="POPUPS_DOMAIN/VALID_VIRUS_HEADERS"></label> <input name="IMAP[virus_headers]" type="text" class="span3" data-bind="textInput: imapVirus_headers" title="rspamd,clamav"> </div> </div> <input type="radio" name="tabs" id="tab-smtp"> <label for="tab-smtp" role="tab" tabindex="0" data-bind="css: { 'testing-done': testingDone, 'testing-error': testingSmtpError }" >SMTP</label> <div class="tab-content" role="tabpanel" aria-hidden="true"> <div class="alert alert-error" data-bind="visible: testingSmtpError, text: testingSmtpError"></div> <div data-bind="visible: !smtpUsePhpMail()"> <div class="row"> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_SERVER"></span> <br> <input name="SMTP[host]" type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="textInput: smtpHost, hasfocus: smtpHostFocus"> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_SECURE"></span> <br> <select name="SMTP[type]" class="span2" data-bind="value: smtpType"> <option value="0" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_NONE"></option> <option value="1">SSL/TLS</option> <option value="2">STARTTLS</option> </select> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_PORT"></span> <br> <input name="SMTP[port]" type="number" style="width:6em" data-bind="textInput: smtpPort"> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/TIMEOUT"></span> <br> <input name="SMTP[timeout]" type="number" min="5" step="1" style="width:6em" data-bind="textInput: smtpTimeout"> </div> </div> <br> <div style="display: inline-block;" data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_USE_SHORT_LOGIN', value: smtpShortLogin } }"></div> <span style="opacity:0.7"> (user@example.com → user)</span> <br> <div style="display: inline-block;" data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_LOWERCASE_LOGIN', value: smtpLowerLogin } }"></div> <span style="opacity:0.7"> (USER@example.com → user@example.com)</span> <div data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_USE_AUTH', value: smtpUseAuth } }"></div> <br> </div> <div data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_SET_SENDER', value: smtpSetSender } }"></div> <div data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_AUTH_PLAIN_LINE', value: smtpAuthPlainLine } }"></div> <div style="display: inline-block;" data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_USE_PHP_MAIL', value: smtpUsePhpMail } }"></div> <span style="color:red"> (<span data-i18n="HINTS/BETA"></span>)</span> <h4>SSL/TLS</h4> <div data-bind="component: { name: 'Checkbox', params: { value: smtpSslVerify_peer, label: 'TAB_SECURITY/LABEL_REQUIRE_VERIFICATION' } }"></div> <div data-bind="component: { name: 'Checkbox', params: { enable: smtpSslVerify_peer, value: smtpSslAllow_self_signed, label: 'TAB_SECURITY/LABEL_ALLOW_SELF_SIGNED' } }"></div> </div> <input type="radio" name="tabs" id="tab-sieve"> <label for="tab-sieve" role="tab" tabindex="0" data-bind="css: { 'testing-done': testingDone, 'testing-error': testingSieveError }"> <i class="icon-filter"></i> SIEVE </label> <div class="tab-content" role="tabpanel" aria-hidden="true"> <div class="alert alert-error" data-bind="visible: testingSieveError, text: testingSieveError"></div> <div class="row"> <div class="span5" data-bind="component: { name: 'Checkbox', params: { label: 'POPUPS_DOMAIN/LABEL_ALLOW_SIEVE_SCRIPTS', value: sieveEnabled } }"></div> </div> <div data-bind="visible: sieveEnabled"> <div class="row"> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_SERVER"></span> <br> <input name="Sieve[host]" type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" data-bind="textInput: sieveHost, hasfocus: sieveHostFocus"> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/LABEL_SECURE"></span> <br> <select name="Sieve[type]" class="span2" data-bind="value: sieveType"> <option value="0" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_NONE"></option> <option value="1">SSL/TLS</option> <option value="2">STARTTLS</option> </select> </div> <div class="span"> <span name="Sieve[port]" data-i18n="POPUPS_DOMAIN/LABEL_PORT"></span> <br> <input type="number" style="width:6em" data-bind="textInput: sievePort"> </div> <div class="span"> <span data-i18n="POPUPS_DOMAIN/TIMEOUT"></span> <br> <input name="Sieve[timeout]" type="number" min="5" step="1"  style="width:6em" data-bind="textInput: sieveTimeout"> </div> </div> <h4 data-i18n="LOGIN/LABEL_LOGIN"></h4> <div data-bind="component: { name: 'Checkbox', params: { value: sieveAuthLiteral, label: 'Use LITERAL+' } }"></div> </div> </div> <input type="radio" name="tabs" id="tab-whitelist"> <label for="tab-whitelist" role="tab" tabindex="0" data-icon="👥" data-i18n="POPUPS_DOMAIN/BUTTON_WHITE_LIST"></label> <div class="tab-content" role="tabpanel" aria-hidden="true"> <div class="alert" data-i18n="POPUPS_DOMAIN/WHITE_LIST_ALERT"></div> <textarea class="input-xxlarge" style="width: 100%" rows="8" data-bind="value: whiteList" tabindex="-1" placeholder="@example.com&#10;user@example.org&#10;username"></textarea> </div> </div> </div> </form> <footer> <a class="btn" data-bind="command: testConnectionCommand, css: {    'btn-success': testingDone() && !testingImapError() && !testingSmtpError(),    'btn-danger': testingDone() && (testingImapError() || testingSmtpError()) }"> <i class="fontastic" data-bind="css: {'icon-spinner': testing()}">ℹ</i> <span data-i18n="GLOBAL/TEST"></span> </a> <a class="btn buttonClose" data-bind="click: close, visible: edit()" data-icon="✖" data-i18n="GLOBAL/CLOSE"></a> <a class="btn buttonClose" data-bind="click: close, visible: !edit()" data-icon="✖" data-i18n="GLOBAL/CANCEL"></a> <a class="btn" data-bind="command: createOrAddCommand"> <i class="fontastic" data-bind="css: {'icon-spinner': saving()}">✔</i> <span data-i18n="GLOBAL/SAVE"></span> </a> </footer> </template><template id="PopupsDomainAlias"><header> <a href="#" class="close" data-bind="click: close">×</a> <h3 data-i18n="POPUPS_DOMAIN_ALIAS/TITLE_ADD_DOMAIN_ALIAS"></h3> </header> <form id="DomainAlias" class="modal-body" spellcheck="false" autocomplete="off" autocapitalize="none" data-bind="submit: createCommand" > <div class="control-group" data-bind="css: {error: '' !== savingError()}"> <label data-i18n="POPUPS_DOMAIN_ALIAS/LABEL_ALIAS"></label> <div> <input class="span4" type="text" autocorrect="off" data-bind="textInput: name"> <div class="alert-error" data-bind="visible: '' !== savingError(), text: savingError"></div> </div> </div> <div class="control-group"> <label data-i18n="POPUPS_DOMAIN_ALIAS/LABEL_DOMAIN"></label> <div data-bind="component: { name: 'Select', params: { options: domainsOptions, value: alias, optionsText: 'optText', optionsValue: 'optValue', size: 4 } }"></div> </div> </form> <footer> <button class="btn buttonClose" data-bind="click: close" data-icon="✖" data-i18n="GLOBAL/CLOSE"></button> <button class="btn" data-bind="command: createCommand"> <i class="fontastic" data-bind="visible: !saving()">✚</i> <i class="icon-spinner" data-bind="visible: saving"></i> <span data-i18n="GLOBAL/ADD"></span> </button> </footer> </template><template id="PopupsPlugin"><header> <a href="#" class="close" data-bind="click: close">×</a> <h4> <span data-i18n="POPUPS_PLUGIN/TITLE_PLUGIN"></span> "<span data-bind="text: name"></span>" </h4> <span data-bind="visible: hasReadme, text: readme"></span> </header> <div class="modal-body"> <div class="tabs"> <input type="radio" name="tabs" id="tab-extension-config" checked> <label for="tab-extension-config" role="tab" tabindex="0">Config</label> <div class="tab-content" role="tabpanel" aria-hidden="false"> <form class="form-horizontal plugin-form" action="#/" spellcheck="false" onsubmit="return false;"> <div class="alert alert-info" data-bind="visible: !hasConfiguration()" data-i18n="POPUPS_PLUGIN/DESC_NOTHING_TO_CONFIGURE"></div> <div class="alert" data-bind="visible: '' !== saveError()"> <a href="#" class="close" data-bind="click: hideError">×</a> <span data-bind="text: saveError"></span> </div> <div data-bind="foreach: config, visible: hasConfiguration"> <!-- ko if: 7 == type --> <details open=""> <summary class="legend" data-bind="text: label"></summary> <div data-bind="foreach: config"> <div class="control-group" data-bind="template: { name: 'AdminSettingsPluginProperty' }"></div> </div> </details> <!-- /ko --> <!-- ko if: 7 != type --> <div class="control-group" data-bind="template: { name: 'AdminSettingsPluginProperty' }"></div> <!-- /ko --> </div> </form> </div> <input type="radio" name="tabs" id="tab-extension-info"> <label for="tab-extension-info" role="tab" tabindex="0">Info</label> <div class="tab-content" role="tabpanel" aria-hidden="true"><tbody> <table><tbody> <tr><td>Author</td><td data-bind="text: author"></td></tr> <tr><td>Website</td><td><a data-bind="attr:{href: url}, text: url"></a></td></tr> <tr><td>Version</td><td data-bind="text: version"></td></tr> <tr><td>Date</td><td data-bind="text: released"></td></tr> </tbody> </table> </div> </div> </div> <footer> <a class="btn buttonClose" data-bind="click: close" data-icon="✖" data-i18n="GLOBAL/CLOSE"></a> <a class="btn" data-bind="command: saveCommand, visible: hasConfiguration" data-icon="✔" data-i18n="GLOBAL/SAVE"></a> </footer> </template><template id="Paginator"><nav class="e-paginator g-ui-user-select-none" data-bind="foreach: $data"> <a data-bind="css: { 'current': current }, attr: { title: title }, text: name"></a> </nav> </template><template id="PopupsAsk"><div class="modal-body"> <div data-bind="html: askDesc"></div> <form class="form-horizontal" data-bind="visible: askPass() || askUsername(), submit: yesClick" style="margin: 2em 0 0" id="AskForm"> <div class="control-group" data-bind="visible: askUsername"> <label data-i18n="GLOBAL/USERNAME"></label> <input type="text" data-bind="value: username"> </div> <div class="control-group" data-bind="visible: askPass"> <label data-i18n="GLOBAL/PASSWORD"></label> <input type="password" data-bind="value: passphrase"> </div> <div data-bind="visible: askRemeber, component: { name: 'Checkbox', params: { label: 'GLOBAL/REMEMBER', value: remember } }"></div> </form> </div> <footer> <button class="btn buttonYes" form="AskForm" data-bind="click: yesClick, text: yesButton" data-icon="✔"></button> <button class="btn buttonNo" data-bind="click: noClick, text: noButton" data-icon="✖"></button> </footer> </template><template id="PopupsLanguages"><header> <a href="#" class="close" data-bind="click: close">×</a> <h3 data-i18n="POPUPS_LANGUAGES/TITLE_LANGUAGES"></h3> </header> <div class="modal-body" style="min-height: 150px;" data-bind="foreach: languages"> <label data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected, 'user': user}, attr: { title: title }, text: fullName"> </label> </div> </template> <script nonce="" type="text/javascript">(e=>{const t=t=>e.location.pathname.replace(/\/+$/,"")+"/?/"+t,r=t=>e.getElementById("rl-"+t),a="1"==r("app").dataset.admin,o="application/json",n=e=>{r("loading").hidden=!0,e.hidden=!1},s=e=>{let t=r("loading-error");t.append(e),n(t)},i=t=>t?new Promise(((r,a)=>{const o=e.createElement("script");o.onload=()=>r(),o.onerror=()=>a("Failed loading "+t),o.src=t,e.head.append(o)})):Promise.reject("src is empty");try{let t=e.cookie.match(/(^|;) ?smctoken=([^;]+)/);if(t=t?t[2]:localStorage.getItem("smctoken"),!t){let e=new Uint8Array(16);crypto.getRandomValues(e),t=encodeURIComponent(btoa(String.fromCharCode(...e)))}localStorage.setItem("smctoken",t),e.cookie="smctoken="+t+";path=/;samesite=strict"}catch(e){}let c={};window.rl={adminArea:()=>a,settings:{get:e=>c[e],set:(e,t)=>c[e]=t,app:e=>c.System[e]},setTitle:t=>e.title=(t||"")+(c.title?(t?" - ":"")+c.title:""),setData:e=>{c=e,rl.app.refresh()},loadScript:i,fetch:(e,t,r)=>{t=Object.assign({mode:"same-origin",cache:"no-cache",redirect:"error",referrerPolicy:"no-referrer",credentials:"same-origin",headers:{}},t);let a=1,n=(c.System||{}).token,s={};return r&&(t.method="POST",r instanceof FormData&&(r.forEach(((e,t)=>{e instanceof File?a=0:Reflect.has(s,t)?(Array.isArray(s[t])||(s[t]=[s[t]]),s[t].push(e)):s[t]=e})),a?r=s:n&&r.set("XToken",n)),a&&(t.headers["Content-Type"]=o,r=JSON.stringify(r)),t.body=r),n&&(t.headers["X-SM-Token"]=n),fetch(e,t)},fetchJSON:(e,t,r)=>((t=Object.assign({headers:{}},t)).headers.Accept=o,rl.fetch(e,t,r).then((t=>{if(t.ok){const r=t.headers.get("Content-Type");return r.startsWith(o)?t.json():Promise.reject(new Error(`Invalid Content-Type '${r}' for url '${e}'`))}return Promise.reject(new Error("Network response error: "+t.status))})))},navigator.cookieEnabled?[].flat?rl.fetchJSON(t(`${a?"Admin":""}AppData/0/${Math.random().toString().slice(2)}/`)).then((r=>{c=r;const o=r.StaticLibsJs,n=()=>rl.app.bootstart();i(o).then((()=>i(o.replace("/libs.",`/${a?"admin":"app"}.`)))).then((()=>r.PluginsLink?i(t(r.PluginsLink)):Promise.resolve())).then((()=>rl.app?n():e.addEventListener("readystatechange",(()=>"complete"==e.readyState&&n())))).catch((e=>{throw s(e),e}))})).catch((e=>s(e))):n(r("BadBrowser")):n(r("NoCookie"))})(document);
document.documentElement.lang = 'en';
rl.I18N={"LANGS_NAMES":{"id":"Bahasa Indonesia","cs":"Čeština","da":"Dansk","de":"Deutsch","en":"English","es":"Español","eu":"Euskara","fr":"Français","it":"Italiano","lt":"Lietuvių","hu":"Magyar","nl":"Nederlands","nb":"Norsk (bokmål)","pl":"Polski","pt":"Português","pt-BR":"Português (Brasil)","sk":"Slovenčina","sl":"Slovenščina","fi":"Suomi","sv":"Svenska","vi":"Tiếng Việt","be":"Беларуская","ru":"Русский","fa":"‏فارسی‏","ja":"日本語","zh":"简体中文","zh-TW":"繁體中文(台灣)"},"LANGS_NAMES_EN":{"eu":"Basque","be":"Belarusian","zh":"Chinese Simplified (China)","zh-TW":"Chinese Traditional (Taiwan)","cs":"Czech","da":"Danish","nl":"Dutch","en":"English","fi":"Finnish","fr":"French","de":"German","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","lt":"Lithuanian","nb":"Norwegian Bokmål","fa":"Persian","pl":"Polish","pt":"Portuguese","pt-BR":"Portuguese (Brazil)","ru":"Russian","sk":"Slovak","sl":"Slovenian","es":"Spanish","sv":"Swedish","vi":"Vietnamese"},"GLOBAL":{"ADD":"Add","CLOSE":"Close","SAVE":"Save","TEST":"Test","UPDATE":"Update","USERNAME":"Username","PASSWORD":"Passphrase","CANCEL":"Cancel","SEARCH":"Search","YES":"Yes","NO":"No"},"LOGIN":{"LABEL_LOGIN":"Login","LABEL_TOTP":"TOTP code","BUTTON_LOGIN":"Log into the admin panel"},"TOP_PANEL":{"LABEL_ADMIN_PANEL":"Admin Panel"},"SETTINGS_LABELS":{"GENERAL":"General","LOGIN":"Login","BRANDING":"Branding","CONTACTS":"Contacts","DOMAINS":"Domains","SECURITY":"Security","PACKAGES":"Extensions","CONFIG":"Config","ABOUT":"About"},"TAB_GENERAL":{"LEGEND_INTERFACE":"Interface","LABEL_LANGUAGE":"Language","LABEL_LANGUAGE_ADMIN":"Language (admin)","LABEL_THEME":"Theme","LABEL_ALLOW_LANGUAGES_ON_SETTINGS":"Allow language selection on settings screen","LABEL_ALLOW_THEMES_ON_SETTINGS":"Allow theme selection on settings screen","LABEL_ALLOW_BACKGROUND_ON_SETTINGS":"Allow background selection on settings screen","LABEL_SHOW_THUMBNAILS":"Show thumbnails (attachments)","LEGEND_MAIN":"Main","LABEL_ATTACHMENT_SIZE_LIMIT":"Attachment size limit","LABEL_ALLOW_ADDITIONAL_ACCOUNTS":"Allow additional accounts","LABEL_ALLOW_IDENTITIES":"Allow multiple identities","ALERT_DATA_ACCESS":"Data folder is accessible. Please configure your web server to hide the data folder from external access. Read more here:","ALERT_WARNING":"Warning!","HTML_ALERT_WEAK_PASSWORD":"You are using the default admin passphrase.\n<br>\nFor security reasons please\n<strong><a href=\"#/security\">change</a></strong>\npassphrase to something else now.\n"},"TAB_LOGIN":{"LEGEND_LOGIN_SCREEN":"Login Screen","LABEL_DEFAULT_DOMAIN":"Default Domain","LABEL_DETERMINE_USER_DOMAIN":"Try to determine user domain","LABEL_ALLOW_LANGUAGES_ON_LOGIN":"Allow language selection on login screen","LABEL_DETERMINE_USER_LANGUAGE":"Try to determine user language"},"TAB_BRANDING":{"LEGEND_BRANDING":"Branding","LABEL_PAGE_TITLE":"Page Title","LABEL_LOADING_DESCRIPTION":"Loading Description","LABEL_FAVICON_URL":"Favicon"},"TAB_CONTACTS":{"LEGEND_CONTACTS":"Contacts","LEGEND_STORAGE":"Storage (PDO)","LABEL_ENABLE_CONTACTS":"Enable contacts","LABEL_ALLOW_SYNC":"Allow contacts sync (with external CardDAV server)","LABEL_STORAGE_TYPE":"Type","LABEL_STORAGE_DSN":"Data Source Name (DSN)","LABEL_STORAGE_USER":"User","LABEL_STORAGE_PASSWORD":"Passphrase","SQLITE_GLOBAL":"Use a global DB instead of per account","ALERT_NOTICE":"Notice!","SUGGESTIONS_LIMIT":"Suggestions limit","HTML_ALERT_DO_NOT_USE_THIS_DATABASE":"Don't use this database type with a large number of active users.","HTML_ALERT_DOES_NOT_SUPPORTED":"Your system doesn't support contacts.\n<br>\nYou need to install or enable <strong>PDO (SQLite / MySQL / PostgreSQL)</strong> extension on your server.\n"},"TAB_DOMAINS":{"LEGEND_DOMAINS":"Domains","BUTTON_ADD_DOMAIN":"Add Domain","BUTTON_ADD_ALIAS":"Add Alias","DELETE_ARE_YOU_SURE":"Are you sure?","HTML_DOMAINS_HELPER":"List of domains that are allowed.\n<br>\nClick on the name to configure the domain.\n"},"TAB_SECURITY":{"LEGEND_SECURITY":"Security","LABEL_USE_IMAGE_PROXY":"Use local proxy for external images","LABEL_AUTO_VERIFY":"Verify signatures automatically","LABEL_SHOW_PHP_INFO":"Show PHP information","LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS":"Admin Panel Access Credentials","LABEL_CURRENT_PASSWORD":"Current passphrase","LABEL_NEW_PASSWORD":"New passphrase","LABEL_REPEAT_PASSWORD":"Repeat passphrase","LABEL_REQUIRE_VERIFICATION":"Require verification of SSL certificate","CRYPTO":"Crypto","LABEL_ALLOW_SELF_SIGNED":"Allow self signed certificates"},"TAB_PACKAGES":{"LABEL_ENABLE_PLUGINS":"Enable extensions","LEGEND_AVAILABLE_FOR_UPDATE":"Available for Update","LEGEND_AVAILABLE_FOR_INSTALLATION":"Available for Installation","LEGEND_INSTALLED_PACKAGES":"Installed Extensions","ALERT_CANNOT_ACCESS_REPOSITORY":"Cannot access the repository at the moment."},"TAB_ABOUT":{"LEGEND_ABOUT":"About","LABEL_TAG_HINT":"Simple, modern & fast web-based email client","LABEL_ALL_RIGHTS_RESERVED":"All Rights Reserved.","HINT_READ_CHANGE_LOG":"Please read the change log before updating.","HINT_IS_UP_TO_DATE":"SnappyMail is up to date.","HTML_NEW_VERSION":"New <b>%VERSION%</b> version is available.","LABEL_UPDATING":"Updating","LABEL_CHECKING":"Checking for updates","BUTTON_RELEASES":"Releases"},"POPUPS_DOMAIN_ALIAS":{"TITLE_ADD_DOMAIN_ALIAS":"Add Alias","LABEL_ALIAS":"Alias","LABEL_DOMAIN":"Domain"},"POPUPS_DOMAIN":{"TITLE_ADD_DOMAIN":"Add Domain","TITLE_ADD_DOMAIN_WITH_NAME":"Add Domain \"%NAME%\"","TITLE_EDIT_DOMAIN":"Edit Domain \"%NAME%\"","LABEL_NAME":"Name","NAME_HELPER":"wildcard supported","LABEL_SERVER":"Server","LABEL_PORT":"Port","LABEL_SECURE":"Security","TIMEOUT":"Timeout","DISABLE_CAPABILITIES":"Disable capabilities","LIMITS":"Limits","FOLDERS":"Folders","MESSAGES":"Messages","SECURE_OPTION_NONE":"None","LABEL_ALLOW_SIEVE_SCRIPTS":"Allow sieve scripts","LABEL_USE_SHORT_LOGIN":"Use short login","LABEL_LOWERCASE_LOGIN":"Lowercase login (case-insensitive)","LABEL_USE_AUTH":"Use authentication","LABEL_SET_SENDER":"Use login as sender","LABEL_AUTH_PLAIN_LINE":"Force single command AUTH PLAIN login","LABEL_USE_PHP_MAIL":"Use php mail() function","BUTTON_WHITE_LIST":"White List","NEW_DOMAIN_DESC":"This domain configuration will allow you to work with <strong>%NAME%</strong> email addresses.","WHITE_LIST_ALERT":"List of domain users webmail is allowed to access.\nUse a space as delimiter.\n","VALID_SPAM_HEADERS":"Valid SPAM headers","VALID_VIRUS_HEADERS":"Valid virus headers"},"POPUPS_PLUGIN":{"TITLE_PLUGIN":"Extension","DESC_NOTHING_TO_CONFIGURE":"Nothing to configure"},"POPUPS_ASK":{"DESC_WANT_CLOSE_THIS_WINDOW":"Are you sure you want to close this window?"},"POPUPS_LANGUAGES":{"TITLE_LANGUAGES":"Choose your language"},"HINTS":{"BETA":"beta","WARNING":"Warning!"},"ERRORS":{"DOMAIN_ALREADY_EXISTS":"Domain already exists","UNKNOWN_ERROR":"Unknown error"},"NOTIFICATIONS":{"RequestError":"Request failed","RequestAborted":"Request is aborted","RequestTimeout":"Request timed out","InvalidToken":"Invalid token","AuthError":"Authentication failed","DomainAlreadyExists":"Domain already exists","CantSavePluginSettings":"Can't save settings","CantInstallPackage":"Failed to install extension","CantDeletePackage":"Failed to remove extension","InvalidPluginPackage":"Invalid extension package","UnsupportedPluginPackage":"Unsupported extension package","UnknownError":"Unknown error"}};
rl.relativeTime = {
	long: {
		year: {
			past: {
				one: "{0} year ago",
				other: "{0} years ago"
			},
			future: {
				one: "in {0} year",
				other: "in {0} years"
			}
		},
		month: {
			past: {
				one: "{0} month ago",
				other: "{0} months ago"
			},
			future: {
				one: "in {0} month",
				other: "in {0} months"
			}
		},
		week: {
			past: {
				one: "{0} week ago",
				other: "{0} weeks ago"
			},
			future: {
				one: "in {0} week",
				other: "in {0} weeks"
			}
		},
		day: {
			past: {
				one: "{0} day ago",
				other: "{0} days ago"
			},
			future: {
				one: "in {0} day",
				other: "in {0} days"
			}
		},
		hour: {
			past: {
				one: "{0} hour ago",
				other: "{0} hours ago"
			},
			future: {
				one: "in {0} hour",
				other: "in {0} hours"
			}
		},
		minute: {
			past: {
				one: "{0} minute ago",
				other: "{0} minutes ago"
			},
			future: {
				one: "in {0} minute",
				other: "in {0} minutes"
			}
		},
		second: {
			past: {
				one: "{0} second ago",
				other: "{0} seconds ago"
			},
			future: {
				one: "in {0} second",
				other: "in {0} seconds"
			}
		}
	},
	/* 'zero', 'one', 'two', 'few', 'many', 'other' */
	plural: n => 1 == n ? 'one' : 'other'
}
;</script> </body> </html>