]> git.r.bdr.sh - rbdr/olden-mail/blob - src/main.rs
Remove unhelpful debug lines
[rbdr/olden-mail] / src / main.rs
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 }