summaryrefslogtreecommitdiff
path: root/backend/api/src/mail.zig
diff options
context:
space:
mode:
Diffstat (limited to 'backend/api/src/mail.zig')
-rw-r--r--backend/api/src/mail.zig60
1 files changed, 60 insertions, 0 deletions
diff --git a/backend/api/src/mail.zig b/backend/api/src/mail.zig
new file mode 100644
index 0000000..2489a48
--- /dev/null
+++ b/backend/api/src/mail.zig
@@ -0,0 +1,60 @@
+const z = @import( "std" );
+const u = @import( "util.zig" );
+const smtp = @import( "smtp_client" );
+
+const bufPrint = z.fmt.bufPrint;
+const alloc = u.alloc;
+
+pub var smtp_host = "smtppro.zoho.com";
+pub var smtp_alias = "Axonbox Support";
+pub var smtp_username = "support@axonbox.net";
+pub var smtp_port: u16 = 465;
+
+const Config = smtp.Config;
+
+fn getPassword() ![]const u8 {
+ return try u.readFile( "../data/mail_password.txt" );
+}
+
+fn getConfig() !Config {
+ const pass = try getPassword();
+
+ return Config {
+ .host = smtp_host,
+ .username = smtp_username,
+ .password = pass,
+ .port = smtp_port,
+ .encryption = .tls,
+ .allocator = alloc,
+ };
+}
+
+fn formatEmail( to: []const u8, subject: []const u8, body: []const u8 ) []const u8 {
+ const escaped_newl = z.mem.replaceOwned( u8, alloc, body, "\n", "\r\n" ) catch return "";
+ const escaped_dots = z.mem.replaceOwned( u8, alloc, escaped_newl, "\n.", "\n.." ) catch return "";
+ defer alloc.free( escaped_dots );
+ alloc.free( escaped_newl );
+
+ const fmt = "From: {s} <{s}>\r\nTo: {s}\r\nSubject: {s}\r\n\r\n{s}\r\n.\r\n";
+ const slice = z.fmt.allocPrint( alloc, fmt, .{
+ smtp_alias, smtp_username, to, subject, escaped_dots
+ } ) catch return "";
+
+ return slice;
+}
+
+pub fn send( to: []const u8, subject: []const u8, body: []const u8 ) !void {
+ const config = getConfig() catch {
+ z.debug.print( "error creating mail config", .{} );
+ return;
+ };
+ defer alloc.free( config.password.? );
+
+ const data = formatEmail( to, subject, body );
+ defer alloc.free( data );
+
+ smtp.send( .{ .to = &.{to}, .from = smtp_username, .data = data }, config ) catch |e| {
+ z.debug.print( "error sending mail {any} {any}", .{ e, @errorReturnTrace() } );
+ return e;
+ };
+}