/// <summary> /// Creates the SparkPost instance /// </summary> public SparkPost() { LoaderContext.RegisterSingletonInstance(this); var secrets = LoaderContext.EnsureSingletonInstance <SecretsHandler>(); EndpointUrl = SecretsHandler.GetSecret("SPARKPOST_URL") ?? "https://api.sparkpost.com/api/v1/transmissions"; APIKey = SecretsHandler.GetSecret("SPARKPOST_KEY"); }
/// <summary> /// Gets the named secret, or returns null. /// Note that this method will clear the value, so it can only be obtained ONCE /// </summary> /// <param name="name">The name of the secret to get</param> /// <returns>The value or null</returns> public static string GetSecret(string name) { var self = LoaderContext.EnsureSingletonInstance <SecretsHandler>(); lock (self.m_lock) { if (self.m_secrets == null) { var secrets = new Dictionary <string, string>(); if (File.Exists(self.Filename)) { foreach (var n in File.ReadAllLines(self.Filename)) { if (string.IsNullOrWhiteSpace(n)) { continue; } var parts = n.Split(new char[] { '=' }, 2); if (parts.Length != 2) { continue; } var key = parts[0].Trim(); var value = parts[1].Trim(); if (key.StartsWith("#")) { continue; } if (string.IsNullOrWhiteSpace(key) || string.IsNullOrWhiteSpace(value)) { continue; } secrets[key] = value; } } self.m_secrets = secrets; } self.m_secrets.TryGetValue(name, out var v); self.m_secrets.Remove(name); return(string.IsNullOrWhiteSpace(v) ? null : v); } }
/// <summary> /// Sends the transmission message as provided /// </summary> /// <param name="transmission">The transmission to send</param> /// <returns>An awaitable task</returns> public static async Task SendEmailAsync(Transmission transmission) { var inst = LoaderContext.EnsureSingletonInstance <SparkPost>(); using (var client = new HttpClient()) using (var request = new HttpRequestMessage(HttpMethod.Post, inst.EndpointUrl)) { request.Headers.Add("Authorization", inst.APIKey); var json = JsonConvert.SerializeObject(transmission); using (var stringContent = new StringContent(json, Encoding.UTF8, "application/json")) { request.Content = stringContent; using (var response = await client .SendAsync(request, HttpCompletionOption.ResponseContentRead) .ConfigureAwait(false)) { var cnt = await response.Content.ReadAsStringAsync(); try { var resp = JsonConvert.DeserializeObject <Response>(cnt); if (resp.Results == null || resp.Results.Accepted != 1) { throw new Exception("Bad response from SparkPost"); } response.EnsureSuccessStatusCode(); } catch (Exception sendex) { await Log.ErrorAsync($"Got error from SparkPost: {cnt}", sendex); throw; } } } } }
/// <summary> /// Creates a new queue module instance /// </summary> /// <param name="name">The name of the module</param> public QueueModule(string name) { Name = name; m_manager = LoaderContext.EnsureSingletonInstance <QueueManager>(); }