1mod address;
62mod attachment;
63mod email;
64mod error;
65mod mailer;
66mod transport;
67
68#[cfg(feature = "handlebars")]
69mod template_handlebars;
70
71#[cfg(feature = "tera")]
72mod template_tera;
73
74#[cfg(feature = "minijinja")]
75mod template_minijinja;
76
77#[cfg(feature = "sendgrid")]
78mod sendgrid;
79
80#[cfg(feature = "ses")]
81mod ses;
82
83#[cfg(feature = "mailgun")]
84mod mailgun;
85
86#[cfg(feature = "queue")]
87mod queue;
88
89pub use address::{Address, IntoAddress, Mailbox};
90pub use attachment::{Attachment, ContentDisposition};
91pub use email::{Email, EmailBuilder};
92pub use error::{MailError, Result};
93pub use mailer::{Mailer, MailerConfig};
94pub use transport::{SmtpConfig, SmtpSecurity, SmtpTransport, Transport};
95
96#[cfg(feature = "handlebars")]
97pub use template_handlebars::HandlebarsEngine;
98
99#[cfg(feature = "tera")]
100pub use template_tera::TeraEngine;
101
102#[cfg(feature = "minijinja")]
103pub use template_minijinja::MiniJinjaEngine;
104
105#[cfg(feature = "sendgrid")]
106pub use sendgrid::{SendGridConfig, SendGridTransport};
107
108#[cfg(feature = "ses")]
109pub use ses::{SesConfig, SesTransport};
110
111#[cfg(feature = "mailgun")]
112pub use mailgun::{MailgunConfig, MailgunTransport};
113
114#[cfg(feature = "queue")]
115pub use queue::{
116 EmailJob, EmailQueue, EmailQueueBackend, EmailQueueConfig, EmailQueueWorker, InMemoryBackend,
117 MailerQueueExt, QueueStats,
118};
119
120#[cfg(feature = "redis")]
121pub use queue::RedisBackend;
122
123pub trait TemplateEngine: Send + Sync {
125 fn render(&self, name: &str, context: &serde_json::Value) -> Result<RenderedTemplate>;
127
128 fn has_template(&self, name: &str) -> bool;
130
131 fn register_template(&mut self, name: &str, content: &str) -> Result<()>;
133}
134
135#[derive(Debug, Clone)]
137pub struct RenderedTemplate {
138 pub html: Option<String>,
140 pub text: Option<String>,
142 pub subject: Option<String>,
144}
145
146impl RenderedTemplate {
147 pub fn html(html: impl Into<String>) -> Self {
149 Self {
150 html: Some(html.into()),
151 text: None,
152 subject: None,
153 }
154 }
155
156 pub fn text(text: impl Into<String>) -> Self {
158 Self {
159 html: None,
160 text: Some(text.into()),
161 subject: None,
162 }
163 }
164
165 pub fn both(html: impl Into<String>, text: impl Into<String>) -> Self {
167 Self {
168 html: Some(html.into()),
169 text: Some(text.into()),
170 subject: None,
171 }
172 }
173
174 pub fn with_subject(mut self, subject: impl Into<String>) -> Self {
176 self.subject = Some(subject.into());
177 self
178 }
179}
180
181pub mod prelude {
187 pub use crate::address::{Address, IntoAddress, Mailbox};
188 pub use crate::attachment::{Attachment, ContentDisposition};
189 pub use crate::email::{Email, EmailBuilder};
190 pub use crate::error::{MailError, Result};
191 pub use crate::mailer::{Mailer, MailerConfig};
192 pub use crate::transport::{SmtpConfig, SmtpSecurity, SmtpTransport, Transport};
193 pub use crate::{RenderedTemplate, TemplateEngine};
194
195 #[cfg(feature = "handlebars")]
196 pub use crate::HandlebarsEngine;
197
198 #[cfg(feature = "sendgrid")]
199 pub use crate::sendgrid::{SendGridConfig, SendGridTransport};
200
201 #[cfg(feature = "ses")]
202 pub use crate::ses::{SesConfig, SesTransport};
203
204 #[cfg(feature = "mailgun")]
205 pub use crate::mailgun::{MailgunConfig, MailgunTransport};
206
207 #[cfg(feature = "queue")]
208 pub use crate::queue::{EmailJob, EmailQueue, EmailQueueBackend, EmailQueueConfig};
209}