]>
Commit | Line | Data |
---|---|---|
1 | //! # olden-mail | |
2 | //! | |
3 | //! `olden-mail` is an IMAP & SMTP proxy that allows you to connect to SSL | |
4 | //! enabled mail servers using insecure plaintext connections. | |
5 | //! | |
6 | //! This is of course very insecure, but it's intended to allow vintage | |
7 | //! computers that don't have SSL capability or ther right ciphers to still | |
8 | //! be used for e-mail. | |
9 | //! | |
10 | //! ## Installation | |
11 | //! | |
12 | //! ### Pre-built binaries and packages | |
13 | //! | |
14 | //! Binaries are available for macos and linux, for both aarch64 and `x86_64` | |
15 | //! from <https://build.r.bdr.sh/olden-mail>, including `.deb` and `.rpm` | |
16 | //! packages. | |
17 | //! | |
18 | //! ### Homebrew | |
19 | //! | |
20 | //! You can also install this on macos via homebrew. | |
21 | //! | |
22 | //! ``` | |
23 | //! % brew tap rbdr/apps git@git.sr.ht:~rbdr/homebrew-apps | |
24 | //! % brew install rbdr/apps/olden-mail | |
25 | //! ``` | |
26 | //! | |
27 | //! ### From source | |
28 | //! | |
29 | //! You can run `make` for a debug build, or `make -e profile=release` for a | |
30 | //! release build. | |
31 | //! | |
32 | //! ## Usage | |
33 | //! | |
34 | //! The proxy requires you to set environment variables, but otherwise takes | |
35 | //! no options. | |
36 | //! | |
37 | //! * `LOCAL_IMAP_PORT` u16, the port in which the server will listen for | |
38 | //! IMAP clients. Defaults to 143. | |
39 | //! * `LOCAL_IMAP_BIND_ADDRESS` String, the address on which to listen for | |
40 | //! IMAP clients. Defaults to 0.0.0.0. | |
41 | //! * `REMOTE_IMAP_PORT` u16, the port to which the server will forward the | |
42 | //! IMAP messages. Defaults to 993. | |
43 | //! * `REMOTE_IMAP_HOST` String, the host to which the server will forward the | |
44 | //! IMAP messages. Required. | |
45 | //! | |
46 | //! * `LOCAL_SMTP_PORT` u16, the port in which the server will listen for | |
47 | //! SMTP clients. Defaults to 25. | |
48 | //! * `LOCAL_SMTP_BIND_ADDRESS` String, the address on which to listen for | |
49 | //! SMTP clients. Defaults to 0.0.0.0. | |
50 | //! * `REMOTE_SMTP_PORT` u16, the port to which the server will forward the | |
51 | //! SMTP messages. Defaults to 465. | |
52 | //! * `REMOTE_SMTP_HOST` String, the host to which the server will forward the | |
53 | //! SMTP messages. Required. | |
54 | //! | |
55 | //! This means the minimum invocation is this (Shown here with inline | |
56 | //! environment variables) | |
57 | //! | |
58 | //! ``` | |
59 | //! % REMOTE_IMAP_HOST=imap.coolmailsite.example REMOTE_SMTP_HOST=smtp.coolmailsite.example olden-mail | |
60 | //! ``` | |
61 | //! | |
62 | //! ## Debugging | |
63 | //! | |
64 | //! You can control how much it prints by setting `RUST_LOG`. Setting it to | |
65 | //! `debug` will output the whole protocol stream. The default level is | |
66 | //! `info`. | |
67 | ||
68 | use env_logger::{Builder, Env}; | |
69 | use log::{error, info}; | |
70 | use std::process::exit; | |
71 | use std::sync::mpsc; | |
72 | ||
73 | mod configuration; | |
74 | mod proxy; | |
75 | ||
76 | use configuration::Configuration; | |
77 | use proxy::Server; | |
78 | ||
79 | fn main() { | |
80 | Builder::from_env(Env::default().default_filter_or("info")) | |
81 | .format_timestamp_millis() | |
82 | .init(); | |
83 | ||
84 | let configuration = Configuration::new().unwrap_or_else(|error| { | |
85 | error!("{error}"); | |
86 | exit(1); | |
87 | }); | |
88 | ||
89 | let (tx, rx) = mpsc::channel(); | |
90 | ||
91 | let mut imap_proxy = Server::new(configuration.imap_configuration); | |
92 | let mut smtp_proxy = Server::new(configuration.smtp_configuration); | |
93 | ||
94 | ctrlc::set_handler(move || { | |
95 | info!("Shutting down..."); | |
96 | imap_proxy.shutdown(); | |
97 | smtp_proxy.shutdown(); | |
98 | let _ = tx.send(()); | |
99 | }) | |
100 | .unwrap_or_else(|e| { | |
101 | error!("Error setting Ctrl-C handler: {e}"); | |
102 | std::process::exit(1); | |
103 | }); | |
104 | ||
105 | // Block until we get a shutdown | |
106 | rx.recv().unwrap_or(()); | |
107 | } |