Как преобразовать альтернативные представления EmailMessage в SendGrid Html и Text
У меня есть интерфейс для отправки почты
public interface IMailSender
{
void SendMail(MailMessage message);
}
Когда я создаю почту, я использую AlternateView для этого (простой текст и HTML)
И теперь я хотел бы создать класс SendGridMailSender, который реализует этот интерфейс, но моя проблема в том, что я не знаю, как заполнить SendGrid.Html и SendGrid.Text на основе MailMessage. Единственное решение, которое я смог найти, - это использование StreamReader и доступ к AlternateViewsCollection по индексу. Я хотел бы отметить, что есть лучшее решение, которое я не могу найти.
public void SendMail(MailMessage message)
{
var sendGridMessage = CreateSendGridMessage(message);
// Create network credentials to access your SendGrid account.
var user = "userCredential";
var pswd = "userPaswd";
var credentials = new NetworkCredential(user, pswd);
// Create an SMTP transport for sending email.
var transportSMTP = SMTP.GetInstance(credentials);
// Send the email.
transportSMTP.Deliver(sendGridMessage);
}
private SendGrid CreateSendGridMessage(MailMessage mail)
{
var sendGridMessage = SendGrid.GetInstance();
sendGridMessage.From = mail.From;
var recipients = mail.To;
foreach (var recipient in recipients)
{
sendGridMessage.AddTo(recipient.ToString());
}
var stream = mail.AlternateViews[0].ContentStream;
using (var reader = new StreamReader(stream))
{
sendGridMessage.Text = reader.ReadToEnd();
}
stream = mail.AlternateViews[1].ContentStream;
using (var reader = new StreamReader(stream))
{
sendGridMessage.Html = reader.ReadToEnd();
}
return sendGridMessage;
}
Спасибо
2 ответа
Единственный способ получить доступ к содержимому AlternateView - через поток, поэтому ваше решение верное, хотя вам также следует проверить ContentType, чтобы убедиться, что mail.AlternateViews[0]
на самом деле ваша текстовая часть и так далее.
Вы думали об использовании официальной библиотеки C# вместо? Это делает очень просто делать то, что вы пытаетесь сделать
// Create the email object first, then add the properties.
var myMessage = SendGrid.GetInstance();
// Add the message properties.
myMessage.From = new MailAddress("john@example.com");
// Add multiple addresses to the To field.
List<String> recipients = new List<String>
{
@"Jeff Smith <jeff@example.com>",
@"Anna Lidman <anna@example.com>",
@"Peter Saddow <peter@example.com>"
};
myMessage.AddTo(recipients);
myMessage.Subject = "Testing the SendGrid Library";
//Add the HTML and Text bodies
myMessage.Html = "<p>Hello World!</p>";
myMessage.Text = "Hello World plain text!";