GithubHelp home page GithubHelp logo

forwardemail / forwardemail.net Goto Github PK

View Code? Open in Web Editor NEW
760.0 10.0 102.0 217.01 MB

Privacy-focused encrypted email for everyone.

Home Page: https://forwardemail.net

License: Other

JavaScript 73.48% Pug 25.02% SCSS 1.07% Jinja 0.41% Shell 0.01% HCL 0.02%
email forwarding forwarder free custom domain send mail aes256 chacha20 encrypted imap newsletter pop privacy smtp sqlite

forwardemail.net's Introduction

ForwardEmail

build status code style styled with prettier license

Forward Email is the 100% open-source and privacy-focused email service @ https://forwardemail.net.

Table of Contents

How do I get started

For Consumers

Visit https://forwardemail.net to get started!

For Developers

See Requirements and Local Development Guide below.

Requirements

macOS

  1. Install n and Node v18.16.0:

    curl -L https://raw.githubusercontent.com/mklement0/n-install/stable/bin/n-install | bash -s -- -y 18.16.0
  2. Ensure that you are running on Node v18.6.0:

    node --version
    v18.16.0
  3. Install brew and the following dependencies using brew command:

    brew tap mongodb/brew
    brew install mongodb-community redis libtool automake autoconf nasm
    brew services start mongodb-community
    brew services start redis
  4. Install pnpm:

    npm i -g pnpm
  5. Fork the repository from GitHub

  6. Clone your fork locally (replace forwardemail with your username):

    git clone [email protected]:forwardemail/forwardemail.net.git
    cd forwardemail.net
  7. Install npm dependencies:

    pnpm install
  8. Install wkhtmltopdf (optional: only used for generating PDF receipts)

Ubuntu

  1. Install n and Node v18.16.0:

    curl -L https://raw.githubusercontent.com/mklement0/n-install/stable/bin/n-install | bash -s -- -y 18.16.0
  2. Ensure that you are running on Node v18.6.0:

    node --version
    v18.16.0
  3. Install pnpm:

    npm i -g pnpm
  4. Fork the repository from GitHub

  5. Clone your fork locally (replace forwardemail with your username):

    git clone [email protected]:forwardemail/forwardemail.net.git
    cd forwardemail.net
  6. Install npm dependencies:

    pnpm install
  7. Install fonts:

    echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
    sudo apt-get install xfonts-75dpi fontconfig libxrender1 xfonts-base ttf-mscorefonts-installer libfontconfig fonts-powerline
  8. Install wkhtmltopdf (optional: only used for generating PDF receipts):

    wget "https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.$(lsb_release -c -s)_$(dpkg --print-architecture).deb"
    sudo dpkg -i "wkhtmltox_0.12.6.1-2.$(lsb_release -c -s)_$(dpkg --print-architecture).deb"
  9. Install MongoDB by following the guide at https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition

  10. Install Redis by following the guide at https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-20-04.

Local Development Guide

Once you have followed Requirements, you should now have all the dependencies, repository, and npm packages installed.

You can start any of the services using our pre-built commands to make it easy. Note that all of these pre-built commands are using nps and ttab (it will automatically open a new tab in terminal for you!).

Service Name Command Default Development Port Development Preview URL
Web npm start web 3000 http://localhost:3000
API npm start api 4000 http://localhost:4000
Bree npm start bree None None
SMTP npm start smtp 2432 telnet localhost 2432
IMAP npm start imap 2113 telnet localhost 2113
POP3 npm start pop3 2115 telnet localhost 2115
SQLite npm start sqlite 3456 telnet localhost 3456
CalDAV npm start caldav 5000 http://localhost:5000

You can test the local SMTP, IMAP, POP3, and CalDAV servers using Thunderbird, telnet, or openssl. Note that all local development servers do not require TLS and are running with { rejectUnauthorized: true } option passed to TLS server configurations.

Try running the local web server:

npm start webAndWatch

It should open a new tab for you with the local web server running and terminal output using signale. You can now open your browser to http://localhost:3000 for a development playground.

You can also run all apps at once:

npm start all

Note that if you open your browser to http://localhost:3000 and no assets are rendering, then you must have forgotten to run a build beforehand. You can run builds manually by running npm run build.

An easy way to kill all existing Node apps running is by typing killall node.

Server Infrastructure

Naming Convention

Our server alias naming convention consists of the following fields, joined together by a hyphen, and converted to lower case:

  1. App name (e.g. "web", "api", "bree", "smtp", "imap", "pop3", "sqlite", or "caldav")
  2. (Optional) App count (starting with 1) of the application (relative to the same provider and region). Only applicable for apps with potential count > 1.
  3. Provider name (abbreviated to 2 characters, e.g. "do" for "Digital Ocean", but you can optionally use more verbose for providers such as "Vultr" as "vultr")
  4. Region name (this is the region name given by the provider, e.g. "sfo3" for DO's SFO3 region)

For example, one of our web servers is named web-do-sfo3 and another is web-vultr-dallas.

Load Balancing

All server aliases with the same hostname (with a minimum count of at least 2) are set in Cloudflare under a geo-located load balancer.

Unless otherwise noted, all of the servers should have dedicated CPU's and not be running in a shared CPU environment.

Provisioning

See the ansible folder for our Ansible configuration and playbooks, which we use to provision servers with.

We recommend you to install yamllint and configure it in your editor while working with Ansible playbooks.

Also note that ansible-lint is a helpful linting tool you can use if you plan on making changes to playbooks. Note that our current playbooks have several existing lint errors.

First you must provision Ubuntu 18.04 LTS 64-bit server(s) using Digital Ocean, Linode, Vultr, or your host of choice. These newly provisioned server(s) should have your SSH key automatically added.

Follow the Deployment guide below for automatic provisioning and deployment instructions.

Deployment

  1. Ensure that you have pm2 installed locally:

    npm i -g pm2
  2. Ensure that you have ansible and ansible-lint installed locally:

    For macOS:

    brew install ansible ansible-lint

    For Ubuntu:

    sudo apt-add-repository ppa:ansible/ansible
    sudo apt update
    sudo apt install ansible
    pip3 install ansible-lint
  3. Install ansible-galaxy requirements (assumes current working directory is the root of this repository):

    ansible-galaxy install -r ansible/requirements.yml
  4. Set up host configuration by copying the hosts.yml file template:

    cp ansible/playbooks/templates/hosts.yml hosts.yml
  5. Edit this configuration and update the file with your newly created server aliases and IP addresses. You can add more than one host to each group if you are setting up load balancing. Refer to the Naming Convention documentation for our recommended approach to server alias naming. Note that this file is automatically ignored by git. If you have a private repository and would like to commit this, then remove hosts.yml from the root .gitignore file.

    vim hosts.yml
  6. Set up environment configuration by copying the env file template:

    cp ansible/playbooks/templates/env .env.production
  7. Edit this configuration and reference the official Lad documentation for a list of all available environment variables (or see .env.defaults). You will need to open this file in your preferred editor and set the values for any fields containing TODO, whereby you replace TODO with the appropriate value. Preserve double quotes where they are already defined.

    vim .env.production
  8. Generate pm2 ecosystem files using our automatic template generator. We created an ansible-playbook.js which loads the .env.production environment variables rendered with @ladjs/env into process.env, which then gets used in the playbooks. This is a superior, simple, and the only known dotenv approach we know of in Ansible. Newly created ecosystem-api.json, ecosystem-bree.json, ecosystem-web.json, ecosystem-smtp.json, ecosystem-imap.json, ecosystem-pop3.json, ecosystem-sqlite.json, and ecosystem-caldav.json files will now be created for you in the root of the repository. If you ever more add or change IP addresses, you can simply re-run this command.

    node ansible-playbook ansible/playbooks/ecosystem.yml -l 'localhost'
  9. Set up the web, API, and CalDAV server(s) (see patterns and ansible-playbook flags docs if you need help). If you completely (or partially) run this playbook (or any others below), then the second time you try to run it may not succeed. This is because we prevent root user access through security hardening. To workaround this, run the same command but without --user root appended as it will default to the devops user created.

    node ansible-playbook ansible/playbooks/http.yml --user root -l 'http'
  10. Set up the Bree server(s):

    node ansible-playbook ansible/playbooks/bree.yml --user root -l 'bree'
  11. Set up the SMTP server(s):

    node ansible-playbook ansible/playbooks/smtp.yml --user root -l 'smtp'
  12. Set up the IMAP server(s):

    node ansible-playbook ansible/playbooks/imap.yml --user root -l 'imap'
  13. Set up the POP3 server(s):

    node ansible-playbook ansible/playbooks/pop3.yml --user root -l 'pop3'
  14. Set up the SQLite server(s):

    node ansible-playbook ansible/playbooks/sqlite.yml --user root -l 'sqlite'
  15. Set up the MX server(s):

    node ansible-playbook ansible/playbooks/mx1.yml --user root -l 'mx1'
    node ansible-playbook ansible/playbooks/mx2.yml --user root -l 'mx2'
  16. Set up GitHub deployment keys for all the servers. Note that the deployment-keys directory is ignored from git, so if you have a private repository and wish to commit it, then remove deployment-keys from the .gitignore file.

    node ansible-playbook ansible/playbooks/deployment-keys.yml -l 'imap:pop3:smtp:http:bree:sqlite' --user deploy
  17. Go to your repository "Settings" page on GitHub, click on "Deploy keys", and then add a deployment key for each servers' deployment key copied to the deployment-keys directory. If you're on macOS, you can use the pbcopy command to copy each file's contents to your clipboard. Use tab completion for speed, and replace the server names and paths with yours. You can also use the gh CLI at https://cli.github.com/manual/gh_repo_deploy-key_add as shown below (switch the repo/org/repo paths and deployment key paths below to yours):

    gh repo deploy-key add deployment-keys/api-do-sf-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/api-vu-sj-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/web-do-sf-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/web-vu-sj-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/bree-vu-sj-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/smtp-vu-sj-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/smtp-do-am-nl.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/imap-vu-sj-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/imap-do-am-nl.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/pop3-vu-sj-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/sqlite-do-sf-ca.pub -R forwardemail/forwardemail.net
    gh repo deploy-key add deployment-keys/caldav-do-sf-ca.pub -R forwardemail/forwardemail.net
  18. Set up PM2 deployment directories on all the servers:

    pm2 deploy ecosystem-web.json production setup
    pm2 deploy ecosystem-api.json production setup
    pm2 deploy ecosystem-bree.json production setup
    pm2 deploy ecosystem-smtp.json production setup
    pm2 deploy ecosystem-imap.json production setup
    pm2 deploy ecosystem-pop3.json production setup
    pm2 deploy ecosystem-sqlite.json production setup
    pm2 deploy ecosystem-caldav.json production setup
  19. Create a SSL certificate at Namecheap (we recommend a 5 year wildcard certificate), set up the certificate, and download and extract the ZIP file with the certificate (emailed to you) to your computer. We do not recommend using tools like LetsEncrypt and certbot due to complexity when you have (or scale to) a cluster of servers set up behind load balancers. In other words, we've tried approaches like lsyncd in combination with crontab for certbot renewals and automatic checking. Furthermore, using this exposes the server(s) to downtime as ports 80 and 443 may need to be shut down so that certbot can use them for certificate generation. This is not a reliable approach, and simply renewing certificates once a year is vastly simpler and also makes using load balancers trivial. Instead you can use a provider like Namecheap to get a cheap SSL certificate, then run a few commands as we've documented below. This command will prompt you for an absolute file path to the certificates you downloaded. Renewed your certificate after 1 year? Simply follow this step again. Do not set a password on the certificate files. When using the openssl command (see Namecheap instructions), you need to use *.example.com with an asterisk followed by a period if you are registering a wildcard certificate.

    node ansible-playbook ansible/playbooks/certificates.yml --user deploy

    Important: If you renew or change certificates in the future, then after running the previous command, you will subsequently need to reload the processes as such:

    #
    # NOTE: See the "Important" note above BEFORE running this command.
    #       This command ONLY APPLIES for certificate renewals/changes.
    #
    pm2 deploy ecosystem-web.json production exec "pm2 reload all"
    pm2 deploy ecosystem-api.json production exec "pm2 reload all"
    pm2 deploy ecosystem-smtp.json production exec "pm2 reload all"
    pm2 deploy ecosystem-imap.json production exec "pm2 reload all"
    pm2 deploy ecosystem-pop3.json production exec "pm2 reload all"
    pm2 deploy ecosystem-sqlite.json production exec "pm2 reload all"
    pm2 deploy ecosystem-caldav.json production exec "pm2 reload all"
  20. (Optional) Create a Google application credentials profile file and store it locally. You only need this if you want to support automatic translation. The following command will prompt you for the absolute file path (e.g. /path/to/client-profile.json). See the mandarin docs for more information.

    node ansible-playbook ansible/playbooks/gapp-creds.yml -l 'imap:pop3:smtp:http:bree:sqlite' --user deploy
  21. (Optional) Copy over custom TTF or OTF fonts to be installed on the server (e.g. used for PDF rendering, rendering with Sharp, open-graph images, etc):

    node ansible-playbook ansible/playbooks/fonts.yml -l 'imap:pop3:smtp:http:bree:sqlite' --user deploy
  22. (Optional) Copy over GPG keys to be installed on the server (e.g. used for GPG signing security.txt, see https://forwardemail.net/security.txt).

    NOTE: This assumes that you have also set in .env file the keys of GPG_SECURITY_KEY with the full file path to the key and GPG_SECURITY_PASSPHRASE with the GPG passphrase. You can export via gpg --armor --export-secret-key YOURKEYIDHERE > .gpg-security-key. You can get YOURKEYIDHERE via gpg --list-keys. You can generate a key with gpg --full-generate-key (e.g. for [email protected] or [email protected]). Note you should also update the path in config/index.js for openPGPKey value.

    node ansible-playbook ansible/playbooks/gpg-security-key.yml -l 'imap:pop3:smtp:http:bree:sqlite' --user deploy
  23. Copy the .env.production to the servers:

    node ansible-playbook ansible/playbooks/env.yml -l 'imap:pop3:smtp:http:bree:sqlite' --user deploy
  24. Run an initial deploy to all the servers:

    pm2 deploy ecosystem-web.json production
    pm2 deploy ecosystem-api.json production
    pm2 deploy ecosystem-bree.json production
    pm2 deploy ecosystem-smtp.json production
    pm2 deploy ecosystem-imap.json production
    pm2 deploy ecosystem-pop3.json production
    pm2 deploy ecosystem-sqlite.json production
    pm2 deploy ecosystem-caldav.json production
  25. Save the process list on the servers so when if the server were to reboot, it will automatically boot back up the processes:

    pm2 deploy ecosystem-web.json production exec "pm2 save"
    pm2 deploy ecosystem-api.json production exec "pm2 save"
    pm2 deploy ecosystem-bree.json production exec "pm2 save"
    pm2 deploy ecosystem-smtp.json production exec "pm2 save"
    pm2 deploy ecosystem-imap.json production exec "pm2 save"
    pm2 deploy ecosystem-pop3.json production exec "pm2 save"
    pm2 deploy ecosystem-sqlite.json production exec "pm2 save"
    pm2 deploy ecosystem-caldav.json production exec "pm2 save"
  26. Test by visiting your web and API server in your browser (click "proceed to unsafe" site and bypass certificate warning).

  27. Configure your DNS records for the web and API server hostnames and respective IP addresses.

  28. Test by visiting your web and API server in your browser (in an incognito window). There should not be any certificate warnings (similar to the one that occurred in step 15).

  29. (Optional) Remove the local .env.production file for security purposes. If you do this, then make sure you have a backup, or securely back up off the server in the future before destroying the server.

    rm .env.production
  30. (Optional) Remove the local certificate files you downloaded locally and specified in step 11. If you do this, then make sure you have a backup, or securely back up off the server in the future before destroying the server.

  31. Finished. If you need to deploy again, then push your changes to GitHub master branch and then follow step 14 again. We recommend you to read the Ansible getting started guide, as it provides you with insight into commands like ansible all -a "echo hello" which can be run across all or specific servers.

Deployment Advice

If you do not change any assets, then there is no reason to do a full deployment.

For example, if you made changes to a web controller, then you only need to deploy it to the web codebase without a build:

pm2 deploy ecosystem-web.json production exec "git reset --hard HEAD && git pull origin master && pm2 reload all"

License

(BUSL-1.1 AND MPL-2.0) © Forward Email LLC

#

forwardemail.net's People

Contributors

178inaba avatar 5idereal avatar alicegomaird avatar aoaoho avatar bastelpichi avatar benders avatar c0dr avatar c0refast avatar cbertelli avatar chrnie avatar clouedoc avatar fbartels avatar homburg avatar hyunbridge avatar izumisenasora avatar maxr1998 avatar melendeze13 avatar niftylettuce avatar olearycrew avatar robertscholts avatar samshadwell avatar shadowgate15 avatar shaunwarman avatar spence-s avatar thorpelawrence avatar titanism avatar wonderlandpark avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

forwardemail.net's Issues

Uncaught Error: Syntax error, unrecognized expression

If you go to https://forwardemail.net/fr/faq?domain=some.domain.com&email=some.email%40gmail.com#questions-fr%C3%A9quemment-pos%C3%A9es and then click on the first header, the DOM will give you this error in DevTools console:

jquery.js:1560 Uncaught Error: Syntax error, unrecognized expression: #questions-fr%C3%A9quemment-pos%C3%A9es
    at Function.Sizzle.error (jquery.js:1560)
    at Sizzle.tokenize (jquery.js:2216)
    at Sizzle.select (jquery.js:2643)
    at Function.Sizzle [as find] (jquery.js:862)
    at jQuery.fn.init.find (jquery.js:2896)
    at new jQuery.fn.init (jquery.js:3006)
    at jQuery (jquery.js:152)
    at changeHashOnScroll (change-hash-on-scroll.js:10)
    at dispatch (jquery.js:5237)
    at elemData.handle (jquery.js:5044)

Webhooks raw data bug

Hello everyone,

first thanks for this great service, its very useful!

I set up a webhook and found out the raw attribute of the json data send to my webhooks contains malformed data. In FAQ it seems raw should look like this:

"raw": "DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=forwardemail.net;\r\n q=dns/txt; ...

however in the actual http request they look like this

"raw":{"type":"Buffer","data":[65,82,67,45,83,101,97,108,58,32,105,61,49,59,32,97,61,114,115,97,45,115,104,
97,50,53,54,59,32,116,61,49,54,51,50,52,56,48,57,50,52,59,32,99,118,61,110,111,110,101,59,32,100,61,102,
111,114,119,97,114,100,101,109,97,105,108,...

This causes the webhook requests to be huge and often refused by services like requestbin.com with expcetions claiming request is too large (in this particular case The body of the request is too large. Requests must be smaller than 100k (413).

Password not strong enough

Not sure how the system try to check if a password is strong or not, but 64 characters with 256bit key autogenerated password should be enough.
But it is not.
I suggest to change the way to check the passwords on the system.

Thanks

informed consent missing

configuration is exposed in the TXT records in plain text

This is not clearly explained on the website. Not only ought it be stated during signup not-burried in a link, but the impact ought be explained. DNS is harvested for any number of privacy demeaning free services since 2008. Free users can ironically expect spam.

Main Page - Changes Needed

  • Change "We don't store logs nor emails." to "We do not keep logs nor store emails."
    • Make sure this change is made everywhere that phrase is shown
  • "Stay Protected" button should be blue and in all caps to stand out and call attention for action (similar to the "SIGN UP FOR FREE" button
  • Under "100% open-source" section make these changes:
    • change "we don't store logs never read emails" to "we do not keep logs, never read nor store emails"
  • Our feature buttons should be blue instead of grey when you hover over it (this is to keep in line with branding and make blue associated with call-to-action buttons)
    Screen Shot 2020-06-11 at 9 35 09 PM
  • "View source code" should be blue and in all caps as well
  • If possible, make the "Our Numbers" section add up like a stopwatch to final numbers

FAQs Page - Changes Needed

  • Add step before step 6 called "Double-check and make sure you have the following MX and TXT records set in your registrar's DNS management page:"
Name/Host/Alias TTL Record Type Priority Value/Answer/Destination
@ or leave blank 3600 MX 10 mx1.forwardemail.net
@ or leave blank 3600 MX 20 mx2.forwardemail.net
Name/Host/Alias TTL Record Type Value/Answer/Destination
@ or leave blank 3600 TXT Option A, B, C, D, E, or F
@ or leave blank 3600 TXT v=spf1 a mx include:spf.forwardemail.net -all
  • After this added step, please add this step below
    • "After you've saved all your changes, please purge your cache at https://1.1.1.1/purge-cache/"
    • Tip: Make sure you purge all MX, TXT, and DNS records

Cancel Subscription throws 500 internal server error

I trying to one-time cancel subscription for changing payment mehod,
but I got 500 internal server error with this message:

Cannot read property 'paypalSubscriptionID' of undefined

Background

Today (2021-01-17 JST), I want change subscription method from Paypal to Credit card (via Revolut),
but I cannot found changing to payment method on forwardemail.net.

So, I think:

Maybe, I'm enable to change of payment method,
one-time cancel subscription, and re-subscribe to different payment method...?

and trying that, but I got 500 error.

And note, I'm ok that I cannot change to payment method at today or later,
but that error probablly makes trouble another people I think.

How to reproduce

  1. Go to billing page on My account
  2. Click Cancel Subscription button and OK on confirm dialog
  3. I got 500 internal server error with Cannot read property 'paypalSubscriptionID' of undefined

Environments

  • Windows 10 Pro 20H2 (Japanese Edition)
  • Firefox 84.0.2 by PortableApps (Japanese locale)
  • Currenly, My subscription method is payment at monthly via Paypal

and,

  • I got this error both Normal and Private mode on Firefox
  • My main locale is Japanese, but I used by English on forwardemail.net
  • When I trying to one-time cancel subscription, I registered two own domain my account.

[feat] Encrypted DNS records

I have been using the freeplan for quite a while and the only thing I would like to improve a bit is the fact that the configuration is exposed in the TXT records in plain text. I know the paid plan has a feature that fixes this, but there is another option:

Store the configuration in publicly exposed DNS records, but in an encrypted form. The DNS record could then look for example like this:

Name/Host/Alias TTL Record Type Value/Answer/Destination
@ or leave blank 3600 TXT forward-email=enc:

Option 1 - Symmetric algorithm

Given that the key for symmetric encryption must be kept secret, the encryption would have to be done by the site. The user would sign into their account in forwardemail.net, enter the desired value and the website would return an encrypted version of the value. User would then just copy-paste this value into their DNS configuration.

Option 2 - Asymmetric algorithm

In this case, the public key could be really publicly exposed and therefore the encryption could be done by the users manually, it can be done on users' machines, it could be used in automated scripts etc. Decryption of asymmetrically encrypted data is usually more complex though.

I know this means development of new functionality (e.g. encryption key storage), but it does not require additional storage which would grow with the number of users (you can just rotate the keys every couple of weeks/months and the keys can be shared) and it does not require additional network calls when processing a forwarded e-mail.

Another benefit of this feature is that DNS records for webhooks could then also contain shared secret for signing the payload (like GitHub uses for their webhooks) which makes security the webhook consuming endpoint a lot simpler.

I case you decided to give this one a try, I am happy to assist.

new domain - no info about TXT/MX records

Hi, after registering a domain I don't see information needed to set TXT and MX records. I added MX from FAQ, it was verifed succesfully. Additionaly, after free domain upgrade, i see error while entering domains:

Błąd
/var/www/production/source/app/views/my-account/domains/retrieve.pug:72 70| h5.card-header= t('Enhanced Protection Verification Record') 71| .card-body > 72| p!= t('Please ensure that a TXT record exists for %s with the following value:', domain.name) 73| .input-group 74| input(type='text', readonly, value=${config.recordPrefix}-site-verification=${domain.verification_record}).form-control#verification-record 75| .input-group-append [sprintf] unexpected placeholder

mailgun smtp [send-only]

Could mailgun be used as the underlying provider forwarding messages? I have no interest running a public instance. I would want the upside of DEA [for a small group of personally known basic-auth users] without the not-awesomeness of catch-all email sieves.

gmail would be extremely opposite of respecting users' privacy concerns

Browser extensions

In the Enhanced Protection plan's features, one of the features is a "Browser extension", but I can't find any other info about it... is this feature still in development?

Interested to see what the extension will be for – is it for generating new aliases?

Messages Without DKIM Aren't Forwarded To Gmail

Hello, and thanks for your great service!

It appears that some of the mail messages that are supposed to be forwarded to Gmail fail to arrive.

Here are the facts:

My bank sends me a mail notification for every transaction in my account. When it's sent directly to my Gmail address, it arrives without any problem (it passes SPF and DMARC, but doesn't have DKIM). When I configure my bank account to send the notification to my custom-domain address (which is supposed to be forwarded by ForwardEmail.net to the same Gmail address) I stop getting those messages all-together.

All SpamScanner features are disabled for this domain.

I tested what happens when I forward the messages to a Protonmail address instead of Gmail. They do arrive, but to the spam folder, and with the warning "This email has failed its domain's authentication requirements. It may be spoofed or improperly forwarded!" (Ironically, when the bank sends the notifications directly to the Protonmail address, they don't arrive at all).

For my specific use case, I found a workaround: I configured the bank account to send the notifications to a special address on my domain, which (using ForwardEmail.net) triggers a webhook. This webhook on my web server crafts a new message, and sends it to the "real" custom-domain address I want (and then ForwardEmail.net forwards it to my Gmail). Since I just want to know that a notification was received (and don't need to see the content), this is fine for me.

However, I suppose you may want to take a look at the problem, and find why it happens. I can send you (privately) examples of:

  • A notification mail from the bank (as received directly in my Gmail);
  • A forwarded notification as received in my Protonmail;
  • A payload that was received by the webhook.

Please let me know if I can be of any assistance.

Rethink bad tlds

In

badDomains: [

different bad tlds get declared. Trying to use one of them for emailforwarding will require a piad plan. Looking throught the given sources these lists do not correlate to them. E.g .email and .ga can not be found on one of the three lists while others that are on the lists are not on there.

I would also like to see a way to be capable of using theme, as the only free available tlds out there are all on the list, so someone who would like to create a hobbypage could not use it. Maybe make it a one time payment at least in order of some kind of verification process.

DKIM keys?

Where do i get the dkim record that I need to add in my domain DNS txt record?
I am using cloudflare for dns

new domain - no info about TXT/MX records

Hi, after registering a domain I don't see information needed to set TXT and MX records. I added MX from FAQ, it was verifed succesfully. Additionaly, after free domain upgrade, i see error while entering domains:

Błąd
/var/www/production/source/app/views/my-account/domains/retrieve.pug:72 70| h5.card-header= t('Enhanced Protection Verification Record') 71| .card-body > 72| p!= t('Please ensure that a TXT record exists for %s with the following value:', domain.name) 73| .input-group 74| input(type='text', readonly, value=${config.recordPrefix}-site-verification=${domain.verification_record}).form-control#verification-record 75| .input-group-append [sprintf] unexpected placeholder

Feature request: Notification on forwarding failure

Hi,

New user here.
Im moving over to your service from mailgun (I'm sure I am not alone due to mailgun change to free tier).
One of the things I found very valuable in mailgun is the ability to call a webhook on forwarding failure. This allowed my to (via IFTTT) email an alternative account to advise there have been forwarding issues.
Why is this so important is that my provider (outlook.com) occasionally blocked mailgun due to their IPs being flagged as spam distributors (which MG were swift to address) but in the interim it allowed me to change routing to avoid further email losses.

I checked in your faq and github issues but I didnt find mention of such a capability in forwardemail.net

Is forwarding failure notification something you are considering to add?
Does not need to be a webhook - could also be simple email, SMS etc.

Forward mails to other host and port with same domain

Hi there, thank you for this great service!

Is it possible to forward emails to another host (in conjunction with the forward-email-port setting) without rewriting the domain? If I am using forward-email=mx2.domain.com for my domain domain.com, then emails like [email protected] will be rewritten to [email protected], but I want them stay the same.

Scenario: using forwardemail as backup mx to a host with blocked port 25

Thank you very much!

Can't open domain settings. Error in /var/www/production/....

When i try to enter domain settings, this popup displays:

/var/www/production/source/app/views/my-account/domains/retrieve.pug:72 70| h5.card-header= t('Enhanced Protection Verification Record') 71| .card-body > 72| p!= t('Please ensure that a TXT record exists for %s with the following value:', domain.name) 73| .input-group 74| input(type='text', readonly, value=${config.recordPrefix}-site-verification=${domain.verification_record}).form-control#verification-record 75| .input-group-append [sprintf] unexpected placeholder

And i can't enter the page.

Our Story Page - Changes Needed

  • Remove "TLDR;"
    *Make the layout the same as the home page
    • Include dark grey boxes, like the one shown below (perhaps for the Foreward)
      • Change "Foreward" to "Introduction"
        Screen Shot 2020-06-11 at 9 48 52 PM
  • Make a timeline for the history where you can hover over the important dates and read about them (will look more organized and actually show our progress)

Lookup question

It's pretty easy to create a DNS scraper that checks if the top-level MX records are pointing to mx1.forwardemail.net and mx2.forwardemail.net. In these cases we can run another DNS query to obtain all the aliases. When you type: dig TXT example.com, then it would show all the email forwardings and expose the private email address.

This could easily be prevented by creating a secret during domain registration with forwardemail.net. Instead of looking up the TXT record on the root-level, it could check for the secret TXT record. Both forwardemail.net knows about this secret and the user that registered the email domain. Nobody else knows the secret and therefore can't find the forwarding records and the private email addresses stay private.

The only catch is when AXFR is configured incorrectly and accepts requests from any IP addresses (which is flawed anyway). Most cloud providers (i.e. Azure DNS, AWS Route53) don't support AXFR at all, so this is hardly a problem in real-life.

How'd I add a DMARC reject policy ?

Hey !, I'm super naive to how emails work, but tolerate me here.

say I want to set a DMARC policy to only allow emails if they pass SPF checks, what would such a DMARC policy look like, is it possible to set such a DMARC policy ?

I recently learnt about DMARC policies and I want to ensure people can't send emails using my domain by spoofing

How to: Translate to German

Thanks for setting this service up and open source it.
I'd like to add some translations as PRs if possible.
Where do I start best?
The website shows CN and ES translations but I can't seem to find them here in the repo.

TODOS

  • Fix translation of Markdown files
  • Log in as seems to hang (in admin)
  • POST to create aliases should allow multiple at once
  • the check for mx1 and mx2 should also check that no other mx records exist (we should also update FAQ probably for this, and only permit if user has pass through mx option, which is a future feature)
  • Automatic abuse@ ARF reporting parsing
  • Add List-Unsubscribe header to all emails (only on free plan?)
  • Make auth clearer (#6)
  • Better spam filtering (per email thread with SpamAssassin team and possibly dclassify Bayes filter)
  • Priority user email subjects need to be prefixed with Priority
  • Queue job for DNS check (with email alerts on changes)
  • /disposable-addresses landing page
  • Mail relay setup
  • Ensure that IDN/EAI validation is working (per https://en.m.wikipedia.org/wiki/International_email and discussion at https://webmasters.stackexchange.com/a/127447/84805)
  • Non-standard port forwarding (e.g. forward-email-port=2525)
  • Refer a friend
  • Gift cards
  • Ensure DNSSEC is setup on all domains (https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-configure-dnssec.html)
  • Swag shop
  • delete aliases for users when they delete their accounts
  • Email temp password for FAQ signups
  • HEAD / (e.g. support UptimeRobot)
  • Too many DNS lookups (SPF cap of 10 should be increased to 20 maybe)
  • "Leave us a review on G2 https://www.g2.com/categories/other-email Trust Pilot https://www.capterra.com/p/166646/SMTP2GO/ and capterra https://www.trustpilot.com/review/www.smtp2go.com" (in footer of emails)
  • rg "TODO" in codebase
  • Slack notifications with errors (anonymous data/omit fields)
  • When account is upgraded, verification error message should appear
  • if > 10 on the recipients list for an alias or catch-all, then add List-Unsubscribe and Feedback-ID header information
  • Handle limitations of 'User cannot have more than (5) aliases on global domains.' more friendly/managed
  • Savings slider comparison + alternative to pages (aliases # + domains #) vs Google Business, Zoho, competitors, etc
  • Guide + Alternative To XYZ at footer + pages

Order by Description & Labels Column

When using multiple aliases with random addresses (dice feature - very nice by the way!), the order of rows is therefore random as well. It would be desirable to have the option (ideally saved in some way) to order by the Description & Labels column so that it's easier to scroll to the correct position. Find on page works well but column ordering would be better in my opinion.

Closed

The website claims 100% open-source, which the server-side is not (source-available, yes, but not open source).

The license is clearly not open source. Which is ok, just be honest about it because the website is confusing

I suggest to correct the website.

Shady TLD list needs updating

I in particular .pl does not (no longer?) appear on any of the mentioned misused TLD lists. Also, it is only 20% cheaper than .com from most registrars (never got any spam from .pl, .pl is more expensive than .eu, which is not banned, nor listed on any of the lists, and I got tons of spam from .eu and .com domains, don't ban them right away, just sayin').

// bad domains (arbitrary just for Forward Email, not for Lad)
// <https://symantec-enterprise-blogs.security.com/blogs/feature-stories/top-20-shady-top-level-domains>
// <https://www.spamhaus.org/statistics/tlds/>
// <https://krebsonsecurity.com/tag/top-20-shady-top-level-domains/>
badDomains: [
'.casa',
'.cf',
'.click',
'.email',
'.fit',
'.ga',
'.gdn',
'.gq',
'.loan',
'.london',
'.men',
'.ml',
'.pl',

There is much more TLDs that are used way more for shady business, spam or scam.

Did someone try registering a malicious domain? Did they indeed benefit from the free service's resources? If so, you can restrict free-plan sus domains to incoming mail only, like improvmx.com does (it is currently unable to forward mail to IPv6-only servers, and is closed-source, so I dropped them a bug notice and moved on to checking the alternatives).

As always, it is all about the money, so my ulterior motive is that I am unable to set up my personal domain mail on https://arusekk.pl/ for free because of that. (And I don't like online payments, but this is a different story.)

Imagine banning .com because of 'many malicious sites being there' and it being cheap, come on.

It looks like it was never changed besides 02b9437.

I would like to say something positive, but I am yet to even try the service out, so for now... a huge plus for the website working quite well with scripts disabled, and for localization support.

[question] is it bad if I disable FE Spam filters and use Gmail spam filters? (does it harm your smtp servers?)

I have an address registered with forwardemail and disabled spam filter. I plan to use it to register to forums.

I disabled spam filters because I want all the emails to come! I don't want to get legitimate emails not delivered to me because they were misidentified as spam. My problem with FE spam filter is there is no folder where I can see what emails were caught!

I see 2 potential problems.

  1. If spam does come from my domain, gmail may report my domain as a spam sender.
  2. If spam does come from my domain, gmail may report forwardemail.net smtp servers as spam senders.

Is this a real problem or am I imagining things? Am I harming FE by disabling spam filters? What choices do I have if I want everything to be delivered but don't want to harm either FE or my domain?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.