/// <summary> /// 发送邮件 /// </summary> /// <param name="mail"></param> /// <returns></returns> public async Task<ResponseData<dynamic>> SendMailAsync(SendCloudMail mail) { if (mail == null) throw new ArgumentNullException(nameof(mail)); if (string.IsNullOrWhiteSpace(this.Configuration.ApiUser)) throw new ArgumentNullException(nameof(this.Configuration.ApiUser)); if (string.IsNullOrWhiteSpace(this.Configuration.ApiKey)) throw new ArgumentNullException(nameof(this.Configuration.ApiKey)); Contract.EndContractBlock(); mail.Validate(); var credential = new Credential(this.Configuration.ApiUser, this.Configuration.ApiKey); if (mail?.Body?.Attachments?.Count == 0) { return await this.SendEmailAsync(credential, mail); } else { return await this.SendMultipartEmailAsync(credential, mail); } }
/// <summary> /// multipart方式发送 /// </summary> /// <param name="credential"></param> /// <param name="mail"></param> /// <returns></returns> protected virtual async Task<ResponseData<dynamic>> SendMultipartEmailAsync(Credential credential, SendCloudMail mail) { using (var multiPartContent = new MultipartFormDataContent()) { multiPartContent.Add(new StringContent(credential.ApiUser), "apiUser"); multiPartContent.Add(new StringContent(credential.ApiKey), "apiKey"); multiPartContent.Add(new StringContent(mail.Body.From), "from"); if (!string.IsNullOrWhiteSpace(mail.Body.FromName)) { multiPartContent.Add(new StringContent(mail.Body.FromName), "from"); } multiPartContent.Add(new StringContent(mail.Body.Subject), "subject"); if (!string.IsNullOrWhiteSpace(mail.Body.ReplyTo)) { multiPartContent.Add(new StringContent(mail.Body.ReplyTo), "replyTo"); } if (mail.Body.LabelId != null) { multiPartContent.Add(new StringContent(mail.Body.LabelId.Value.ToString()), "labelId"); } // 是否使用模版发送 if (mail.Content.UseTemplate) { var content = (TemplateContent)mail.Content; multiPartContent.Add(new StringContent(content.TemplateInvokeName), "templateInvokeName"); } else { var content = (TextContent)mail.Content; if (content.ContentType == TextContent.ScContentType.Html) { multiPartContent.Add(new StringContent(content.Text), "html"); } else { multiPartContent.Add(new StringContent(content.Text), "plain"); } } // 是否使用地址列表 if (mail.To != null) { if (mail.To.UseAddressList) { multiPartContent.Add(new StringContent("true"), "useAddressList"); multiPartContent.Add(new StringContent(mail.To.ToString()), "useAddressList"); } else { var receiver = (MailAddressReceiver)mail.To; if (!mail.Content.UseTemplate && receiver.IsBroadcastSend) { multiPartContent.Add(new StringContent(receiver.ToString()), "to"); var ccString = receiver.GetCcString(); if (!string.IsNullOrWhiteSpace(ccString)) { multiPartContent.Add(new StringContent(ccString), "cc"); } var bccString = receiver.GetBccString(); if (!string.IsNullOrWhiteSpace(bccString)) { multiPartContent.Add(new StringContent(bccString), "bcc"); } } else { if (mail.Body.XSmtpApi?.Count == 0 || !mail.Body.XSmtpApi.ContainsKey("to")) { mail.Body.AddXSmtpapi("to", receiver.To.ToJson()); } } } } if (mail.Body.Headers?.Count > 0) { multiPartContent.Add(new StringContent(mail.Body.Headers.ToJson()), "headers"); } if (mail.Body.XSmtpApi?.Count > 0) { multiPartContent.Add(new StringContent(mail.Body.XSmtpApi.ToJson()), "xsmtpapi"); } multiPartContent.Add(new StringContent("true"), "respEmailId"); multiPartContent.Add(new StringContent("false"), "useNotification"); foreach (var item in mail.Body.Attachments) { // application/octet-stream multiPartContent.Add(new StreamContent(item.Content), item.Name); } var url = mail.Content.UseTemplate ? this.Configuration.SendTemplateApi : this.Configuration.SendEmailApi; using (var client = new HttpClient()) { var response = await client.PostAsync(url, multiPartContent); return await this.ValidateAsync(response); } } }
/// <summary> /// 普通方式发送 /// </summary> /// <param name="credential"></param> /// <param name="mail"></param> /// <returns></returns> protected virtual async Task<ResponseData<dynamic>> SendEmailAsync(Credential credential, SendCloudMail mail) { using (var client = new HttpClient()) { var @params = new Dictionary<string, string>(); @params.Add("apiUser", credential.ApiUser); @params.Add("apiKey", credential.ApiKey); @params.Add("from", mail.Body.From); @params.Add("fromName", mail.Body.FromName); @params.Add("subject", mail.Body.Subject); @params.Add("replyTo", mail.Body.ReplyTo); if (mail.Body.LabelId != null) { @params.Add("replyTo", mail.Body.LabelId.Value.ToString()); } if (mail.Content.UseTemplate) { var content = (TemplateContent)mail.Content; @params.Add("templateInvokeName", content.TemplateInvokeName); } else { var content = (TextContent)mail.Content; @params.Add(content.ContentType == TextContent.ScContentType.Html ? "html" : "plain", content.Text); } if (mail.To != null) { if (mail.To.UseAddressList) { @params.Add("useAddressList", "true"); @params.Add("to", mail.To.ToString()); } else { var receiver = (MailAddressReceiver)mail.To; if (!mail.Content.UseTemplate && receiver.IsBroadcastSend) { @params.Add("to", receiver.ToString()); @params.Add("cc", receiver.GetCcString()); @params.Add("bcc", receiver.GetBccString()); } else { if (mail.Body.XSmtpApi != null && !mail.Body.XSmtpApi.ContainsKey("to")) { mail.Body.AddXSmtpapi("to", receiver.To.ToJson()); } } } } if (mail.Body.Headers?.Count > 0) { @params.Add("headers", mail.Body.Headers.ToJson()); } if (mail.Body.XSmtpApi?.Count > 0) { @params.Add("xsmtpapi", mail.Body.XSmtpApi.ToJson()); } @params.Add("respEmailId", "true"); @params.Add("useNotification", "false"); var url = mail.Content.UseTemplate ? this.Configuration.SendTemplateApi : this.Configuration.SendEmailApi; var response = await client.PostAsync(url, new FormUrlEncodedContent(@params)); return await this.ValidateAsync(response); } }