Mvc .Net.Mail: Как отправить письмо с изображением (логотипом)

Я использую три класса для отправки электронной почты, но я не могу объединить текстовую электронную почту с изображением или просто отправить изображение. Когда я получаю электронную почту, я вижу пустое изображение. Помогите мне изменить мой код, чтобы я мог отправить электронное письмо с:

  1. текст
  2. образ
  3. и стиль

       public class SendService : IDistributionProvider
     {
       public int Send(System.Xml.Linq.XDocument recipientsData, string subject, string fromName, string fromAccount)
    {
        foreach (XElement element in recipientsData.Root.Elements())
        {
            string email = element.Element("email").Value;
            string name = element.Element("name").Value;
            string message = element.Element("message").Value;
    
            bool result = EmailUtils.SendEmail(fromAccount, fromName, email, name, subject, message.Replace("\n", "<br/>"));
        }
    
        return 1;
    }
    
    
    public interface IDistributionProvider
    {
    int Send(XDocument recipientsData, string subject, string fromName, 
     string fromAccount);
    }
    
    
    public static class EmailUtils
    {
     private static string sendHostName;
     private static int sendPort;
     private static string userName;
     private static string password;
     private static string defaultFromEmail;
     private static string defaultFromName;
    
     static EmailUtils()
     {
        sendHostName = ConfigurationManager.AppSettings["sendHostName"];
        sendPort = int.Parse(ConfigurationManager.AppSettings["sendPort"]);
        defaultFromEmail = ConfigurationManager.AppSettings["fromEmail"];
        defaultFromName = ConfigurationManager.AppSettings["fromName"];
    
        string credential = Utils.DecryptString(ConfigurationManager.AppSettings["credential"]);
        if (!string.IsNullOrEmpty(credential) && credential.Split(";".ToCharArray()).Length > 1)
        {
            userName = credential.Split(";".ToCharArray())[0];
            password = credential.Split(";".ToCharArray())[1];
        }
    }
    
    public static bool SendEmail(string toEmail, string toName, string subject, string body)
    {
        return SendEmail(defaultFromEmail, defaultFromName, toEmail, toName, subject, body);
    }
    
    public static bool SendEmail(string fromEmail, string fromName, string toEmail, string toName, string subject, string body)
    {
        try
        {
            if (string.IsNullOrEmpty(toEmail))
            {
                return false;
            }
    
            if (string.IsNullOrEmpty(toName))
            {
                toName = toEmail.Substring(0, toEmail.IndexOf("@"));
            }
    
            if (string.IsNullOrEmpty(fromEmail))
            {
                fromEmail = defaultFromEmail;
            }
    
            if (string.IsNullOrEmpty(fromName))
            {
                fromName = defaultFromName;
            }
    
            Message message = new Message();
            message.Charset = "UTF-8";
            message.Subject = Codec.RFC2047Encode(subject, "UTF-8");
            message.From = new Address(fromEmail, fromName);
            message.To.Add(toEmail, toName);
            message.BodyHtml.Format = BodyFormat.Html;
            message.BodyHtml.Charset = "UTF-8";
            message.BodyHtml.Text = body;
    
            return ActiveUp.Net.Mail.SmtpClient.SendSsl(message, sendHostName, sendPort, userName, password, SaslMechanism.Login);
        }
        catch
        {
            return false;
        }
    }
    

    }

Таким образом, я отправляю письмо - просто текст:

 string bodyEmail = "<h2>Welcome to website</h2></br><div><p>Thank for using website</p></div>";

        EmailUtils.SendEmail("xxx@gmail.com","xxxx","Contact",bodyEmail);

2 ответа

Самый простой способ сделать это - встроить ваши изображения с помощью Data URI.

По сути, вы вставляете изображение в HTML-код вашего сообщения. Просто следуйте формату

data:[<MIME-type>][;charset=<encoding>][;base64]

где mime-type может быть image/jpeg, charset должен быть ASCII, а байты изображения преобразованы в base64. Вы можете получить это, прочитав байты файла образа с диска

byte[] imaeg = File.ReadAllBytes("nekkedladies.jpg");

затем преобразовать байтовый массив в строку base 64

var base64Imaeg = System.Convert.ToBase64String(imaeg);

соедините это и вставьте в свой HTML (украденный из вики)

неккед дамы
извиняюсь

Я действительно столкнулся с этой же проблемой, и что мне действительно помогло, так это. В моем случае у меня был HTML, и я должен был разобрать его с помощью HtmlUtilityPack. Я бы не рекомендовал использовать закодированную строку, так как она не полностью поддерживается, и это делает ваше сообщение раздутым. Путь cid также заключается в том, как outlook добавляет изображения в электронное письмо. Я бы добавил код, но я думаю, что пример был достаточно хорош в моем случае.

Другие вопросы по тегам