You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
meli/meli/src/conf/composing.rs

205 lines
7.7 KiB
Rust

/*
* meli - conf module
*
* Copyright 2019 Manos Pitsidianakis
*
* This file is part of meli.
*
* meli is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* meli is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with meli. If not, see <http://www.gnu.org/licenses/>.
*/
//! Configuration for composing email.
use std::collections::HashMap;
use melib::{email::HeaderName, ToggleFlag};
1 year ago
use super::{
default_vals::{ask, false_val, none, true_val},
deserializers::non_empty_string,
};
1 year ago
/// Settings for writing and sending new e-mail
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct ComposingSettings {
/// A command to pipe new emails to
/// Required
pub send_mail: SendMail,
1 year ago
/// Command to launch editor. Can have arguments. Draft filename is given as
/// the last argument. If it's missing, the environment variable $EDITOR is
/// looked up.
#[serde(
default = "none",
alias = "editor-command",
alias = "editor-cmd",
alias = "editor_cmd"
)]
pub editor_command: Option<String>,
/// Embedded editor (for terminal interfaces) instead of forking and
/// waiting.
#[serde(default = "false_val", alias = "embed")]
pub embedded_pty: bool,
/// Set "format=flowed" in plain text attachments.
/// Default: true
#[serde(default = "true_val", alias = "format-flowed")]
pub format_flowed: bool,
listing/thread: add option to hide consecutive identical From values inside a thread The config setting is listing.threaded_repeat_identical_from_values and the default value is false Before: data:image/webp;base64,UklGRiIlAABXRUJQVlA4WAoAAAAgAAAANwMAdwAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH5wAGABMABgAjACNhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDggXCIAABC3AJ0BKjgDeAA+kT6bSyWjIiGhka34sBIJZ27dX0EOqLnw8Hsord1P5fhIYpNsT6IOfq8//IsfV2/w+Sk+Qf5t+K/8z/Tv2b/wP+I/J/+o+RL7b+5fmZ/eP+p9p3lf04mqb0//SfyA/Hf7z/un+u/v37PeQT9A/znqF/jX8P/o/2ZftNzHGcf5X0DvXH5X/hv79+SHza+wf5X80vdL66/5T3Bf8l/Mf7Z+a/7////69/qH94/qv7//0H2le9P6d9yH2C/iT/hf5n0yP6j/B/vV/rf//8yfoH/W/1z9tP3////6Lf2P+Q/7z+wf9z/6/4r/////7U////0iwRKB+16NPpWBjSw1eu9v3gVoBpCrSue1gpBqdY8lDCD5SoYDopxQipVf6DmeuFHlcScuD0rQX+7MyfqewG9p42ZSpB7Q5tmcOCwS5Tz7liiGUNA0xtnzm9lDFvLMhARxufUB8DuH5wKGqRw0GSdjT19WOnVpwKGqRw0GSdjT19WOnVpwKGqRw0GSdjT5JG3JiLpyFmvuLlfonK4VV3mxzvK96fsx1VrlcEiCST+YepZel8PgZzYwf2uoL1s5G/Lw5nGZG4LkMeNHl7vBJitYe+GDN5KSafPa7hGWyHlj2H8KqAnNXs9B2UeWdsO2Q3nDJ3oraRMG1yrNxr+er6mBMw5LIcf+Q32GFdkumc5xq+cYi9272ZACNamYVVhavkmChDhmUfpyUVXLz3nyuKvPpkbjOYqfjnNvomTbWRROx4YIqo7mB3etcvEhrw/4PpjzBS9WhpN6mXYzCf5CqveKFzy+9PgMWGWTEjWYGY3L9KrryfHKWS9FxNMCJIiSmSdUuVz26uY2SSoBqA7FY3Z2B/J9p4VgJGY2qTdj084qn5dNthCn/9T9NovWdRUnYQiznWK03QKa2HVi/h4XN41VTeDSB/fYzQiz46iS+UfNbvEycovdPqrFk8q3uFhyhHUhpZjMVeGjuNR/gfLCwD78MY8nWdXytFIrOgZn6+NkEhVazie5FwZd9VC650gpgedaMDLgl99sUC4oeJ2kJNqgoQe6klRbVy637OKAFGkMvZsMlHMFTitRgAGopA9YD5FU7giGCExMw3XXfG+53BoYfLItscFcGsvn+rx3m7svYJflddLqr1dj5VfHJN1/7K7eoTWTHKZNlEHevsh9YxIrWD0I3n5lbk/nETW5gG2Kz4z9UZLbqWYvucK9vnAUCXdDLszaX5TLGm3gILt/4NrmbEUhz9qmCS+neKpdRfEz8+/nife3Iiv9nSrkWCEy1u4eDDIcn1VZaSP/qub80CvfvV+ReEK6+iV48ynIvp+aEoSqt4FuEY4rZ67LUek5nDBsWfXhiawInw3aiz9KPvEOPzTPZHaKshIYWrpjZmd0vdBlJua5/jFJqGVrbMjB4ryOqOiMVdR5V/9TWC5hMWByqVYn+Phxo0nsRlQKEIHCKB6IsKljURPpxx1RDH/Hyaixo+b/LEP5IuvRi+XEJdL0zvwcHQ+0ZgGrVllZcgsNiL8rVmQEtedmcSmopPQYRzgeevqTotc3h+cfZTB9h2GQN/oymuoaR1/3pGegK7tAJ/GSymTcP9B0Y+7E5sJmV+6tUSf8CvDgiFqpZvtz0kOz44DVnbmewYcRKBODodIs5CKuQGgt089lr+NhVOkQEW1XtfDWCqsDjvHMFc/b1Yxy3efxe6FIhZi/rYVToQK4TZPXLWrTES6YvEIS20JaiHJj4vANbURG5hsgLgxzBZxGVzOdv0wTFJfT3JMkZJHRnzS67zG0uXmHKuVkQwrJXGABMKdX42RMjEDsB0XW8j7tAPnS3jbDxSSHykdSalWWTMFMkJMFlUSeGu7XMvajeW0TgPW4spoIiT5cvCatEK7VZJ7DkJHUBlAhf2/hpx8VVRlJosUdXFSMwoyIpatSi0clFoYo2GeL5Zk/75OhO1Lvw68jiVEUAAD6zjWwgAQTW1I/m4Ctc4La00bYW/W27iQ7UoUuvqptzmXixYhdeFe2gf0XdAvBZW+IWarqhDUpz+WrYNBEdCjARf7mBP7N3zOb8GB3KQMk06EJ7KtN+KifKzhdz1TT+AF7Cv7Hd2Lke6QycsHF30wDU/uq7WdFYiQvM9mcPzNIvpjp9CpqdOVUMU4iJA03rR2NI2AqSMm2c87qfhLXGxSmwwnX27hYSsIASNU17HcrdtwL5gVBmx56Asc9CIw12KK7CtKqXUEmmnxc3Ip184Bjh0a3f6BkVHibpzQ5h8lz5s0qIhi+LGxuo6A5MyNzwI/hhs6t/t/NqDtf+8WwJJg+rsE1NLnh3MrtZTLD7kB8BBJsQvtb8mSKEJhQv0RisJpdqKwJhWEdgY7Y0kjbyUh3s2XzOQMpcYEPRWVke6dkG+zzhp7TccYo4deg7k1GU5Y9tnKxcbyV180aS4YXZgS92aQ72bL5nIGUuL1QWbihbjlpyVNJDeMCEsDF/V9FEwb9g/dul8UHS8xekh8w5trLEgAXDgVRxDKjif5XJXUsyxLjTtSrmkdM7lPOHn0C8vYnGYEvHU6Hb/0a2Lff4srs7IC73meGKk3OZSKqLzIxMivE5VLj2cnEi7LzBGBeHi/EH0sHemD0u+ulxC8PzxvciE/iyuzsgLveZ4YqTc5lIqovMjEyK8TlUuPZycSLsvMEYF4eL8QfSwd6YPS766XELw/PG9yIT+LK7OyAu95nhipNzmUiqi8yMTIrxOVS49nJxIuy8wRgXh4vxB9LB3qPaqqqXh6Q4Fczd5BgsDKbRM4JlGI+Y1WOiLFfXsVfJcO1lnSVAgV2pcf2C12+d+tJqc1heIRMsxnNHrZHc7iQTJhAmPptRkhUtsFYOLpJ8BBqEzY1pluX7//5gQ6cEAvY6fxsITiHS9DNdLXcyQaPUfRr+oSldQj3PX1EpjJf9/uXCNtyp6Zu71sIDCL/CaTXsSkbaAPkwJFbV0c/fXc7mPe51xwPOyZnZPeMpyClblQbMeqzmBcoZqWAZ1FhAFYCRgcS/ujLdlAysH3Ke80WEtxOkMneVgWHbO/QOPxjynm38mQSeZJ4cdqkv347YZjHRt08QFB2PxtAYL/TsCjwpATVCZwO+/iiIFriXkyMIwG3W0fySd4d0HlvgNvmR2zCaHkhU8YNo2Y4u7btnj6JMLa/s8Ijs+CGQOKJwc6Usf0kEt8RJppwI/G9DQj3Wcg1ul5oyt1G1Vf3wD8cfaAH3LQKMYRwAigIBiaJQ0TyQV3vaZ4+ydLkJOGV++Gv3sTyfrTehZXPfLe0Li2gmgTJljUZAtbPNeVWiBwiipy/8tKQUFY/W5pSE/sYlVcHp7tCinIqkARdV6hkABpGTm9ZLCbw7WQzUjhTZZ5qJwhdXEhmZCsmJMP7TPUN2NrlFpe0+aBkn91CK7v4yBWvRAH7Uzp+ps2/ltYhM38imgBP3MBY2c0DwARpLEjHtpXBmXCTs4AqL83IMZutI/6VuoNcS/6gIwlAXqaUc34LMyIwTyO1dKc9fOCGIgyj5PGPxQVSZN3BPqdpZkaLMJhbsSUf8GVzurnd5UZMAbRFrm4qRULibNSdXqjs/NdVWQcTeHWu2LPJ/D9/4oT1pXCLOj1z+kAKjocp5ZU4xZ0VSHpEKkr9AIroJN/IxeceaRsApLkDouSzvVl1AShlsjh9o7o6xUi+Ccc+RB+xyyQakTvb1UVFNQcV+Yvy2vANfTAUGRMfNWamRhXn7+wYojYqZEVRLEcJl1+9d69f9DQWc6JZDRnhR/j9uOWJF9Ytpg0CWJywmZKztjXcECd5QBSggBBw2d9s/z39/a4hulE96J8Jsa9uWspMDK6l8ptHzllvWBHGHzPlRqPmbs3yaoUCfD5840VLAi8zuMRLylkJX9kbxzxVZvJmSF6MpgXtNT2j/Qd+AyohhdOXWfwaWL5Czhg4/YgqTNqtqDP/mK+4H9WoxowOfQBBfg92j83/WZLh4PfVzm8vfu/zfJBAXZZD8BgyXnMqtFz9iq0c0EztoDiyUx+1DHI3Vxx/WSXZI+gPNjXBooqRGwH+PS38sd7E5sC4Ja2d/1zWOhgZZXiYYgphw1Pxsgk5NhDwxt3v9jXt75wmHbfphwISNkri8yc5SGaeTP0WjyvfGFmOm2G94N1y1A6GDWEIPCs02Asmxr28mZK0NA8UXX8ZNKRokpOd7VRviex/X8U0W1jE5RMhkzhK3QMD9hUIjmYHtQx0kw+wGry5u8HKIYb/zhDT02InOEBhxpKKkUETIgtT6nMcGrOkPV/0BUA1GI10RMUpgUvm3A/c+Ef2Oln6LfEXF3JUfcH0S/vqTmJBx76tunMwdu/wPbOBW4nUyte54RDPqgbKJGNTvkBjs581WcwKVe5JcHGRn76JZgaV9Nek5qx2iSPzolkNbidTK3yFnKx7dpt5/34HYQClZMHiHAcitMvqKhEqEQV8m+fK3ZVrQ+4LhhGeN5E0lpLyAyjtDGXpkIyEfGIxCFzIZ9fBdDv34HYQClZKu+FoCaqnPsxsNIcF26FDBwKEmjA5HY9b3HtQx0kw+sUXR8bdIocnOUiiF/NVofxMYw9ghNEcnrn8gz4byQnSYFyqv7TldQ93X23vfbHy5W/hjZX2jyz9OcPKivHcglPi0FfE14RCrU916PAaYM4b5yH1nuZBibg1ZROreosgFBFiz/I5MHue0v95G03W0ciUCWQX0HIrpZLS5Noevw9WxlQ0s2baXcWkW//KMcnckMVKUpR7fJzPBRsK1Khi1oikAB5Gr+Zeosz0O/6Xbek3n0D26GFWP9PfWqzMi8/jqpyi2OtDgbfFvLFMJH/1Wa9GVZsGXbEYA7uNeT2Fq8BNsBxqcNixJsp2MCcAQXmB3IsYNy4oAztMCeImWg4WjrP0TSfWmw05HQiUlfwGbN5jA45N+kBA0cXGnR2FPJx4mGZW1DXjAcZiVtBc3jCUBjk7qTmUhXYh9PkuLOFEWTjZKoHK4NcBqDTx775Z95x1dMnfjytRcvF8zGAZU4Gu+FwkFJ/l+TC4pflU0l7fjd0RoBi270Rj4igfFAAf86Wmq8Jpgblt99na18lpTs7aYTdM+qlPPEWhyys7m41GNoUo4uHbn5RL4oH8uED8YQY4Hk2xfQeXO7lU0l7eulOgWzkYZf3mDNFOSFCHkeBKD6aCE+5iEnFzOztqmBl7b2r3UC+x+Vuh6w2dl1QzZe7djGZZHp+QIyfu3NK0d1EX3541AXxknIGFbgp8k4qRPLxhzzLnkDuvPxosH8HoB5WV5JUMDTx9VbQRtpMM7W4pYm772ujFlN/EWOsEGUWm8L7iYqKkZ+hinMEpFAIm7mVv0A8rK8kl8jmiBt0ShMr1AYD8Lb6P5q5RQPi4U5gTcuc9scCpE+dscg1XpJWokVVCY+ASTylWs14e9++ZJwWfxtUubV18KUB6QQQS9MhEOZU3XnblaB5GHNx1B/6tJB8eMIYyU3z1OuY5jjtytA8jDlzCZffaH/RB2mrIIikG2CCg4JVdR5ioEjI1jIxjmptbqFTKdY9zksg6dZvm8h/Au814E96Jr5eyb0801iCkrymbmVKvHLyHioEjUxsOeYBlHTbV96M3SvSXozqQuzll++1S/gZqZUTu7T60GP3FXZ/xtXXJX1fbi9TCbQBIzSU2Yu84RmBDIUdpk57ilB25cfAy5IkQJI8C2jVey082qFXlD228PUWAyXSEcJXZJ4loY148o6XBzoZAB/VmSelzX/0WIwg8kTPHD/+Zfhap4O6S0aarNiy3NCT0PS+3I9Jb1ogrfEimE05OHjBY3i8te/4AFcRTzduCrTMZG+6MY6fuoFm5neH7vBWogigFkVZ6fCwLPZNiRlH6B2v5aNm8sY09lU3kCYLhbmi6Z4TlWg9kwt17ljrGXrcHajk/rkEVj/7whtDyr+zD2EoyGuWMlezBJEa1PxqezvIQQXs1MVrpfwlvPYVoxXbDYuOX94GEenkxbaMubXe6PFWDPSl7TZWnDygfAEjwWQsG5Wp/4lMeTosjzaXnMlhKIxEw/bRKQXGTwu9AhwmwqZmVNFo7V5f0OTYJvaU/bOf5fGjeZ+U9/RfsjM6bqzzJ3zwWM5wZZuTM+LoufeOB+xrjAfg/S6jrG2bP9zkYOgizYujdF6/ZYdwhVYVkKhAC8I5/4M4/k+wPI2L+m3gQLbCZgMP+hkXtyH++CxcHkZWOiEv99CDVPQ3gIyaTtq7COUEtlHZLpxXvsUdIfK0z3Y0jbJ3LiyxhYPP1dFskbnWkl13v5izZAoBCwXVrZVIqcxX8hYPBPZIu0BytRaspwYilCY4ar0j38eStx+frQ2jXviU4P6WZhZRrKOKLDq84rEowcljgvaL32rn6+uaKgmA+aXgvUxxLgJRnmZkRdbdt6FLMkAhAkVpcHgggZarIDFoyoiVJXLUlpunlUjhngu4jlggcQCd6wQQfP/CZwmppuAQQbMyh+CF/w0tfQI7eDvrMyRELiESvofxUCIvud8vSm91IpwPcHbqk8cdgl5BjEI4H0JKucYtlMUXvQcrTHo1kHvCMYh6ls9d45UbdLokL3EUUyra0ooiia0hqhJTndkP/jIg0K7ADb0J5Zp7H4IX+WosapQBAgs9qg8EDoEcfgW0apUUyFTDDxBh39rw3XQpaLBjO/7DDBnAe9TZcrry3VtgC7GP6eNKVTlaY9GA9ZqGkPc7+HlSpU7LE1n46m8GX2FHUfAwR+fclLGiHioEaracvvf+oAdRuwvDWmF8gmWQg3f4EyMxXlb3NWdkxrK8kqJzK3hrCgOWDfXeazDVXvfWR50/DS/B4QRqyoPj4fv/gv8zJEfFh5AyTYmt4l2EGKVJQEqoHf+oaTiwq85l17JmVy5deqq2TWJnrvHKjbEiomlt9y84cFqtiw8XNACKcHzleqEcA3nR+PaEGMk1rJNN1pWHpONR1zCkspXA4OhqVfYiEa8kdOG+Pwvi8yuSUumhtbhqs55Air+zS1IVVHhKWNEPFQI1NLTxzu3uvdcISgtSc77H2H4FjYx+sSi2u5G8342ZoMa3N3EI6EKVU+GsxBBkYw5O+EnsqbANiYWsrFUiEZWeRl+QiDheT0YBzu/oi7xsj67GzDRkIQ8x5JEuDrhMZu08LzuDSfKit6Kq9yxqy7AyX3Hc1KFZMEmd0AdLG4srLT21fZntZJ72+QP5w31/UyrflCjudbHgdo4ueHWxmlPmd+MuLCJo4cWN270jNyXHe/t1qrRP4Q5cBzIIXeX3nPn5ma0w6bP3blpblS0Ey0Fu28Ivf4x9nWjIYhfYqdiIRp9Re7fdV/P4azcPpG6bb+V3HjHGImQ7vLENhLChY0+I79aXxXpmhSWDVEZJc0GwW2bGJeMsYGukizIVrySFQayuGcskCzL1Zv4FXmJR8fyBN3oZkqwiACULJebSGwoByJ1aoOsJVLBzzS8cx/A9QMh9fAsMVOfxCPneZphlPx2eZ9zNA7Y2/Q5Ga8nfhbwcLQBP2Wmi9HNhEBKDqVi/baXt0LVfgmzxHSi99YpVSG3z37ZdT8Bd7Y582b7QaXcjHa/5YQDYUqet3g66OqvkHlc/tGGtNuj5rYBochPn/oXtzrRSi1o8zU33hx7d9XdV/P36xL+BSGXTaOSSdlgm6V65qGyoTJityyGwSdjSQGlkW6hTMND7Toy4V2e7Co1J7pb8KBqzAbAYvxdfNGkc1AF/WqJ91P6egrs0Mxl9gRZrbt54Rud51WRH9hm2HQvGZ8oQft5ca2tjw9y7x/hZVYYeFrnqua+1CfgvW+m6HDr0HcmorUcWBWJ77IC73meGKk47rDfcQOxYStf7II8KZBQZK7OyAu95n37hQxiU/Dp6CuzQzDi6LiHEV+1w0ydPL63AAux/Ga2nQL9CvY1MS2/563pXPVc19ugIMxkWMWJca2tjwUHLEo6iv2uGmTp5gCc384xP0PqCuzQzFRUoZD0TIrrjQHvW5iy4wA/6egrs0MnLcZcKEYDBok0PX9O70HPRxPZ2nRkenUwMv7K2i4twHWfjrjQHvXZC37HSfEzQaBy/IcOvQdyaiDB5YAE+hG+JD8jQjwCghrI76r6KJg37B++JHWakS7CvSMuvmjSXCcAvXCNzLxfpv8wmRg7CmJJOdhhwgFSC3xzeIz9D3/66PmZ+YdxJXVk4Tf+VSfsLtNITKsbrZxRJ910fjmPh4NhYH6fiTTWqjgEbPyeXK6wgoFYqNa4BkUWLMwksEUIjxiTd1rAFyzHNg3eFSs5N+EvBfd8MQVxzAUowCrvR2XBHWxJY4SmT2iE0GP3E+DA6WNJKqcda+0ljCEHpVp6bscWCEZlHoXNnFO6NufuV1hpdKeVPT6yO9i6PULHr0bJTtVfDK4CG5N/GbsCb7fJVUgYbSxbZorsvuo6OG4r5qfX3DnUZoo0bWH4MyNTuCwG6iycScQ0jXCDTQdd9c/aPwkSo2o+OYyf9qVVWJENRw10bY6SkuKice5DzgFrMByr3jMKq3lsgAAma0OechrYmvCL8tPn0xLO27rWcWSQbgzw0F1/DR3EesChOxPuR2PPiliS2NliKQ+AzCSouosKg+pOyVwpzuCqtAw8rhzUkUcYMalGzj/oW31NLmzcqQ/72ttHMRqt5101iLh9dsLWtLoJN/IyY53GKKWKIMxtq+gxNtLyenVy/kHjedoKGC6A4Lz5wTU4ItLPAmGAV+quBtN2BkCALBTEkRcfz39/Pxct3mhpEz+yv9Ve0D7ofIlJOczTY/HgvBuWglViB3bJ4qmJW241kjrZpPBklJqjrtlMovCpUG0fwAzcPVpImbGq9zY7D6lUJrvclZV2dsk6mVnEbLda5vvNIW8ofsybDpGmdc/HI7PAPwqJeQN+CvV0z408rm4Nr8rU2EtHEbFu24u2CGVeArAyC0SWr2A4ypMwxJHMytIaNFnZFDZaJy37vKAN+JG4Q1+8bzAOW7+ZYKb5tSyYNO9qUCKIRchyI+/fMlzXXk7dGLFIIGY0YnpaOZKB14bQoTy7dy6HfvwOwmiMuTnSuYByoW2/yBmEafJSPT+LUQRhhGeN5E0lpLyopkKU6iaKzeTMkL0ntQGSmOEntM6ZGlBHOJhDtSRpceqQ6Ela0BNVP93/LmaINLMO1V+stXmLfOjk8iByEDlnAgWP/oWJ4QQW84bNZvKH7MmPArYy0VCIYcc8H24Y6ULT5dl14fvDGnVbG1KgjtAWb2YnRLN2L+Qt6JQKsFKHsX3HtQxyNzgMkjrwBNsygVkIncX/jgdO3KH4fXDR0hfJ4K5XpjqECYUwjT5KR6fxZubSu7sCLzO4h3eubLWJhsRKNEBIZNZh9AO7GygVkIm+lDgdO6IkV+PECTFDpkoWBbKDsKx5Z75991ulKrPQArow0YIskCmUxbmtYEvdMY0djfE+7lonYZJo4C5kpjhJ7TOmRtXZOF9js8HtQOT6y4mnajOJgwtbg2vytTYS0BL+2ezwX3EjzruxzZPeGKZV+U3OVtGPTgxLF2NoN2psof0yBBygDp6QMIMiK0+QxyBzFFNTd9zh5odXXlWTotU6IHAdXsSygKF8EoyG6vc+gCC+6CuPDC05GRthnKsVLP/lor+TuqmBmPuZdIjX76Um7l1898e7t9/ou3P+TMBHiZeG+4eaPUFJCgYK74ERS+WcndxmmzWbyh+zJjwWsDNGj/Qi6k1UWZB4b5ZBn1im2z/Di4QfaEPEc+cyZ4kB4yttGXdrOA7nnTEoxolOm1X1WCZqmz7agrjETfSz/ayV1exUlOtV1ajubSk9pJbpJzc++tCGsDCbYLyYhrISabHHgxsdN6/8fLUdq8LMSQPqnp2S71i2hqwESxO2JvaBn8ggUD2qJJ1t2jLHoLNC5MeSTl//nstL9a6/Bw81vr9/rQPHkNpzYCQPvSaNKXmIUcM9XY+xy5EhIV3WUPueIF3wTb8yd94PCStKcNWaluyAJu42K46pGWJjz+MM8iF5Gtx1ajATYFbEUfWIG/q8uOt764/q/BS3SvleQeYLqednc4aK+KSr3yLbZ6g5KglsimkVPUl1OB0OfUd71k7Oaet6gP0kyn3xvjNCk53bjmHTEhHfXu3IUfwOWijrCt/8t/ipH9n0CFIo5nwsF1w+e5hej+UGamrRFDUGe1d9FvxmvZ0e7X4WRwzx3tQdBRV2H1/1T6fJvWOuoYuDzLvwTzroqZ4ayeBgXQDPmolI/OSfuekm+1X+8dtlWYHhz1dwtP0yOpPPyHJ99+4llwhJss7+YQ4s048hixYuOU2P24AU3/4An+clax4PZP4WZuLN3JHm7xhvB/H1KBa4em5q4ki0G+n3F68ZLNXzZBnzzz29uKHE0RKZNq/Ao1caZTAeIvfTr1SBkL7qjbs8crYw59cWNAWKApbC8SqYb1LZ0HCEnDWuiaK4H9fc8sXEpM1eos4fV7kgxQNtfjV2pevkUnphrZgBU8IH91ccyjB8EuKorgf19z6wQr+gobJqr76bDR4rjLhw3ZONoLbGfeILpcGC+0lvaQrWQwqCYL7PC+1H/tDd7Jr79JCB/dXHXyeDnd1DC9hKhBjESToIQPCB/dXGjEXu7gkVq6Oog8K/FDfS5dqv7wUiK+kNfyOWro6iDwr8UBomOAUlvaQrWQwIWZVculXzIBxLkW5ot41dqv7wUiHYXj+IgTqd7MCK84WJo43x9pLe0hWshkOhB5UML2EqEGMRqBvud1DHFfracQcsA6PYgX1RUySVWQym09avvpsNHiuMtVDdk42gtsaAql5CPqw2+LsF3aondgOH+GfYu1nbgTnJddIyxGlfLpUViUofOsJSHhyD38/xU+3PlR+Ym7ZkWChRdpzKFX+ihHXCRG2fWbW5UU4QAtVsyRIFEdiRCXEUWnzI1m2xvqLohKH/AWx3lGrSwtmi2j6N1HR0iVZDueJx7ERZLJ4ug5H+G3XhEuOdvb/7KIFN5fi7gMNyGdbob6FTnuTSWdNAUTDs+TzdIKvcgcTKd679uDdn40BhUePQ8mgF6kemEV7K+X5ZHwUuhcGYUgNmKRHhEImof75iDBOzWjiD4vGQ2lHh9pqF3DS+0vxF4nr/94hLyN/YRxQjtxJHgQWEixC7HnTZ45x4WOy3AmxfyMxJe8545wG583VxQ7jT1GjR970PHrx1gBk/5qawBU8av88YArEsQmFvWj3w5sWSXf/iV3LVCdwvpOBA+DQ1RXJ4LDbBAz/17vtTj32cJyR59AUUFNwFp2RRx1tWdH/BuLEdXdAkBbyG3rUS/Fw8c5LXhBqij0aBV/TTTrU8SgQ/KhVjlHxvyZXaeQy9SA27+H3KjY0KB5Aw9upMllHabwDDqlKVzwhKlvV73FmHlHjrNG7pzWKMHkLhhriZezDteAFX3RBkYvkOXs7bDy+w+3+cp2B0Cq4n8zeqB0I3WY9ElH16hWm/LAIlu4p1diGMn08sSSJVL5Ydk6IQGWHdf3X1IhYhoJil0css1Ahl/xyofkiJ0PCCghVdSm3ks7npGWGsTsiLwBHXkl0oiru8v+MkXt/WFnrW3lRfSbwZAlzoHy2yhumtagDDp0talMTk9hTV1q2/nZcIMKQBC9ZN5ohQxYToeEFBJNGLn+A7FdtVgAVDtEj2vaO3x63dBjUrlsXz8I3HdoFEFNKRLDxKpYVea5P/YQfbHxHR9e+SGNsQpPVIFbfGeyTwT6t3a8XvdqLq+nFdP6QNIBYHSi6clKIAAAAA== After: data:image/webp;base64,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
12 months ago
/// Set User-Agent
/// Default: empty
#[serde(default = "true_val", alias = "insert_user_agent")]
pub insert_user_agent: bool,
/// Set default header values for new drafts
/// Default: empty
#[serde(default, alias = "default-header-values")]
pub default_header_values: HashMap<HeaderName, String>,
1 year ago
/// Wrap header preample when editing a draft in an editor. This allows you
/// to write non-plain text email without the preamble creating syntax
/// errors. They are stripped when you return from the editor. The
/// values should be a two element array of strings, a prefix and suffix.
/// Default: None
#[serde(default, alias = "wrap-header-preample")]
pub wrap_header_preamble: Option<(String, String)>,
1 year ago
/// Store sent mail after successful submission. This setting is meant to be
/// disabled for non-standard behaviour in gmail, which auto-saves sent
/// mail on its own. Default: true
#[serde(default = "true_val")]
pub store_sent_mail: bool,
/// The attribution line appears above the quoted reply text.
/// The format specifiers for the replied address are:
/// - `%+f` — the sender's name and email address.
/// - `%+n` — the sender's name (or email address, if no name is included).
/// - `%+a` — the sender's email address.
1 year ago
/// The format string is passed to strftime(3) with the replied envelope's
/// date. Default: "On %a, %0e %b %Y %H:%M, %+f wrote:%n"
#[serde(default = "none")]
pub attribution_format_string: Option<String>,
1 year ago
/// Whether the strftime call for the attribution string uses the POSIX
/// locale instead of the user's active locale
/// Default: true
#[serde(default = "true_val")]
pub attribution_use_posix_locale: bool,
/// Forward emails as attachment? (Alternative is inline)
/// Default: ask
#[serde(default = "ask", alias = "forward-as-attachment")]
pub forward_as_attachment: ToggleFlag,
/// Alternative lists of reply prefixes (etc. ["Re:", "RE:", ...]) to strip
1 year ago
/// Default: `["Re:", "RE:", "Fwd:", "Fw:", "回复:", "回覆:", "SV:", "Sv:",
/// "VS:", "Antw:", "Doorst:", "VS:", "VL:", "REF:", "TR:", "TR:", "AW:",
/// "WG:", "ΑΠ:", "Απ:", "απ:", "ΠΡΘ:", "Πρθ:", "πρθ:", "ΣΧΕΤ:", "Σχετ:",
/// "σχετ:", "ΠΡΘ:", "Πρθ:", "πρθ:", "Vá:", "Továbbítás:", "R:", "I:",
/// "RIF:", "FS:", "BLS:", "TRS:", "VS:", "VB:", "RV:", "RES:", "Res",
/// "ENC:", "Odp:", "PD:", "YNT:", "İLT:", "ATB:", "YML:"]`
#[serde(default, alias = "reply-prefix-list-to-strip")]
pub reply_prefix_list_to_strip: Option<Vec<String>>,
/// The prefix to use in reply subjects. The de facto prefix is "Re:".
#[serde(default = "res", alias = "reply-prefix")]
pub reply_prefix: String,
/// Custom `compose-hooks`.
#[serde(default, alias = "custom-compose-hooks")]
pub custom_compose_hooks: Vec<ComposeHook>,
/// Disabled `compose-hooks`.
#[serde(default, alias = "disabled-compose-hooks")]
pub disabled_compose_hooks: Vec<String>,
}
impl Default for ComposingSettings {
fn default() -> Self {
ComposingSettings {
send_mail: SendMail::ShellCommand("false".into()),
editor_command: None,
embedded_pty: false,
format_flowed: true,
insert_user_agent: true,
default_header_values: HashMap::default(),
store_sent_mail: true,
wrap_header_preamble: None,
attribution_format_string: None,
attribution_use_posix_locale: true,
forward_as_attachment: ToggleFlag::Ask,
reply_prefix_list_to_strip: None,
reply_prefix: res(),
custom_compose_hooks: vec![],
disabled_compose_hooks: vec![],
}
}
}
fn res() -> String {
"Re:".to_string()
}
macro_rules! named_unit_variant {
($variant:ident) => {
pub mod $variant {
pub fn serialize<S>(serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(stringify!($variant))
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<(), D::Error>
where
D: serde::Deserializer<'de>,
{
struct V;
impl<'de> serde::de::Visitor<'de> for V {
type Value = ();
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str(concat!("\"", stringify!($variant), "\""))
}
fn visit_str<E: serde::de::Error>(self, value: &str) -> Result<Self::Value, E> {
if value == stringify!($variant) {
Ok(())
} else {
Err(E::invalid_value(serde::de::Unexpected::Str(value), &self))
}
}
}
deserializer.deserialize_str(V)
}
}
};
}
pub mod strings {
named_unit_variant!(server_submission);
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum SendMail {
#[cfg(feature = "smtp")]
Smtp(melib::smtp::SmtpServerConf),
#[serde(with = "strings::server_submission")]
ServerSubmission,
ShellCommand(String),
}
/// Shell command compose hooks (See
/// [`crate::mail::compose::hooks::Hook`])
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct ComposeHook {
#[serde(deserialize_with = "non_empty_string")]
name: String,
#[serde(deserialize_with = "non_empty_string")]
command: String,
}
impl From<ComposeHook> for crate::mail::hooks::Hook {
fn from(c: ComposeHook) -> Self {
Self::new_shell_command(c.name.into(), c.command)
}
}