A more or less simple php application to take in anonymus questions from people you know. It's a bit like Tellonym but hosted on your own platform and based on open and established Protocols. If there is a new message for you, you will get an E-Mail. There is no data stored by the application itself. Therefore it does not require any form of Database or writable storage. In future the could even be some sort of automatic PGP encrypton for enhanced privacy & security. On the clientside, only CSS is required. There is no JavaScript to make the page unresponsive and intrusive.
It is capable of sending E-Mail either trough SMTP or sendmail.
- PHP, tested with Version 7.4 but should be finde with at leas 7.*
- Webserver (nginx example is provided)
- Some sort of Mail Transfer Agent (MTA)
- SMTP Server
- sendmail
- PHPMailer by Marcus Bointonis is used to send E-Mails (included as a git submodule)
The current stable source code is available at https://github.com/e1mo/ask.e1mo.de in the main
branch. You just need to clone it to a location of your choosing, initialize all git submodules and point your webserver at it.
The following commands show an example installation process to /var/www/ask.e1mo.de/
:
$ cd /var/www
$ git clone https://github.com/e1mo/ask.e1mo.de.git
Cloning into 'ask.e1mo.de'...
[...]
$ git submodule init
Submodule 'PHPMailer' (https://github.com/e1mo/PHPMailer.git) registered for path 'PHPMailer'
$ git submodule update
Cloning into '/var/www/ask.e1mo.de/PHPMailer'...
Submodule path 'PHPMailer': checked out 'e9a56bb317c649705956edd71e91a7f895aa9b71'
$ cp config.default.php config.php
$ vim config.php
# You can change vim for any of your favourite editors such as vim, emacs, ed, ...
# A listing of all configuration parameters is further down in the README.md
That's it for the basic setup, now you need to configure your webserver. If you want to use the provided nginx configuration (located at res/nginx-vhost.conf
simply copy copy it to your sites directory. Usually it is /etc/nginx/sites-enabled/
.
$ sudo cp res/nginx-vhost.conf /etc/nginx/sites-enabled/ask.e1mo.de.conf
# sudo can be ommited if you are already root
# replace ask.e1mo.de with your domain, same goes for the commands down below
$ sudo vim /etc/nginx/sites-enabled/ask.e1mo.de.conf
# You can change vim for any of your favourite editors such as vim, emacs, ed, ...
$ sudo nginx -t
# Check if everything is correct
# If it throws erros don't proceed but fix the config file
$ sudo systemctl restart nginx
If you are using the apache httpd web server any basic configuration should do. Only note, that you must manually create a .htaccess
or something comparable to deny access to the config.php
! Theoretically it s hould not display anything, but in case PHP is misconfigured it may leak your SMTP Credentials.
All configuration parameters are read from config.php
. Values not defined in there will be taken from config.default.php
. This is a fail-safe, do not the defaults file, there is a good chance of it causing errors. It will also be updated with newer releases to avoid errors.
The configuration is divided into these sections, they're explain in more detail down below:
Section | Description |
---|---|
page | Basic information about the page |
owner | To whom should the mail go |
message | A few parameters about the message being sent |
form | Placeholders and labels for the form fields |
Configure the sending of mails |
As a note: The subsection headings define the top level array key, the keys in the table reference the direct key within the n-th Level array.
For Example, if the heading reads page
and in the table lang
the correspondign (trimmed) Config looks like this:
<?php
return [
'page' => [
'lang' => 'en',
[...]
],
[...]
];
If you have deeper level keys, such under email
the subheadign smtp
and the key host
it will look like this and so on:
<?php
return [
'email' => [
'smtp' => [
'host' => 'smtp.myprovider.info',
],
]
];
This section section basic parameters of the page. These preferences are located under the page
key.
key | description | default | type |
---|---|---|---|
language | Two digit language code (as of ISO 639-1) of your site, only used in the HTML header | 'en' |
string |
title | Title tag and heading on the page | 'Ask me something!' |
string |
description | HTML Meta description and printed below the heading | 'Feel free to ask me anything. Please just be reasonably polite.' |
string |
debug | Enable PHPs printing of exceptions, ... | false |
boolean |
This section controlls to whom the mail should go.
key | description | default | type |
---|---|---|---|
name | The owners name, used in the mail to section | '' (empty) |
string |
The default E-Mail to send mail to, is the fallback if recipient-choices are not enabled or invalid | '[email protected]' |
string | |
recipient-choices | Allow users to chose an E-Mail to whom the mail should be delivered, it's a nice gimmick. Full configuration is described down below | ['enabled' => false, 'choices' => []] |
array |
allow-bad-recipient | Force a bad recipient address to be accepted (e.g. having no domain part) | false |
boolean |
key | description | default | type |
---|---|---|---|
enabled | Enable dropdown(s) below the form to choose a custom recipient | false |
boolean |
choices | The available recipients. Can be either a list with adresses or domain names as keys for another array with the user part listed in there | [] |
array |
Some explanation and examples for the choices
key:
The simplest configuration looks like this:
Please not that these the layout for this section of the configuration may be subject to change. But we'll try to maintain a level of backward-compatibility.
'choices' => [
'[email protected]',
'[email protected]',
'[email protected]'
]
In this case one drop-down will be present above the submit button. All addresses will be available as separate entries.
'choices' => [
'mysite.org' => [
'me',
'awesome-you',
'info'
],
'another-person.org' => [
'hello',
'name',
'info'
]
]
In this case, just like the one above, one drop-down will be present above the submit button. All addresses will be available as separate entries. It happens when domain-keys are given, but the values inside differ.
'choices' => [
'mysite.org' => [
'me',
'awesome-you',
'info'
],
'another-person.org' => [
'me',
'awesome-you',
'info'
]
]
In this case, just like the one above, two drop-down will be present above the submit button. One for the user (the part before the @-sign) and one for the domain. It happens when domain-keys are given and the values are equal across all domains.
key | description | default | type |
---|---|---|---|
subject | Subject of the E-Mail sent to you | '[ask.e1mo.de] New message for you' |
string |
sender | The E-Mail for the from E-Mail header | '[email protected]' |
string |
force-sender | Always set the from E-Mail to the value of sender . If a user provides their E-Mail it will be used as the reply to value. |
'false' | boolean |
Every entry, except the submit button, consists of of a label and a placeholder, both of them are strings. Labels will be printed above the field, placeholders are present when there is nothing inside a input field.
key | description | default | type |
---|---|---|---|
message | The main textarea at the top of the page | ['label' => 'Your message to me', 'placeholder' => 'I\'ve always wanted to tell you...'] |
array with strings |
submit | The label of the submit button | ['label' => 'Send it!'] |
array with strings |
sender | Array with label and placeholder for the optional senders name and email | See sender | array |
recipient | The label / description printed aboce the recipient choices if enabled | ['label' => 'Whom to send the message to?'] |
array with string |
key | description | default | type |
---|---|---|---|
label | Will be printed above the input fields | 'This is optional.' |
string |
Input field for the senders email, consists of label and placeholder | ['label' => 'Your E-Mail (optional)', 'placeholder' => '[email protected]'] |
array with strings | |
name | Input field for the senders email, consists of label and placeholder | ['label' => 'Your Name (optional)', 'placeholder' => 'Lucky Luke'] |
array with strings |
key | description | default | type |
---|---|---|---|
provider | How to deliver the E-Mail, available: sendmail and smtp |
'sendmail' |
string |
smtp | Configuration (host, user, password, port, crypt) when using SMTP. See smtp | ['host' => '', 'port' => 465, 'crypt' => 'smtps', 'user' => '', pass => ''] |
array |
key | description | default | type |
---|---|---|---|
host | IP-Address or FQDN of the outgoing Mailserver | '' |
string |
port | Port for SMTP on the host | 465 |
integer |
crypt | Encryption when communicating with the smtp-host. Can be smtps or starttls |
'smtps' |
string |
user | User for authenticating against the smtp-host | '' |
string |
pass | Password for authenticating against the smtp-host | '' |
string |
key | description | default | type |
---|---|---|---|
headers | Modules for providing custom headers to the E-Mail, add one module name per array item | [] |
array |
See modules for further explanation of the different functions a module can support.
Modules are still very much WIP. Currently modules only can add custom headers to the E-Mails sent out. Their layout is very simple. Header-Modules must be listed in the configuration under ['modules']['headers']
to be enabled. It must be listed with the name the module (located in /modules/
) folder has. For every supported function, the module must provide a corresponding PHP file returning a certain datatype.
In this table are all supported functions with their filenames, return types and an examples listed:
Function | Explanation | Filename | Data-Type | Example |
---|---|---|---|---|
Headers | Add custom headers to ourgoing mail | headers.php |
Array, keys are the header names and values the values | https://github.com/e1mo/git-version-headers/blob/main/headers.php |
This software is released under the bsd 3-clause by Moritz 'e1mo' Fromm