shaprpuff Ответов: 1

Как я могу отправить шаблон сообщения outlook программно?


Я использую .HTML-код для отправки по электронной почте шаблоны для пользователей. но это связано с проблемой, мой код не работает успешно, если шаблон изменен специально, если в шаблон добавлено больше изображений, поэтому мне нужно каждый раз менять код.

может ли кто-нибудь предложить мне лучший способ отправить электронное письмо в качестве общего метода, не заботясь о том, сколько изображений содержит шаблон, мне нужен общий метод для выполнения этой работы. только прохождение шаблона любого рода.

Что я уже пробовал:

public class E_Mail
   {

       public void sendEmail(string To,string sender ,string StrContent)
       {

           MailMessage message = new MailMessage();
           MailAddress Sender = new MailAddress(sender );
           MailAddress receiver = new MailAddress(To);

           LinkedResource aa = new LinkedResource(logo =System.AppDomain.CurrentDomain.BaseDirectory + @"Images/a.png");
           LinkedResource bb= new LinkedResource(logo =System.AppDomain.CurrentDomain.BaseDirectory + @"Images/b.png");

           logo.ContentId = "a";
           blueImg.ContentId = "b";

           AlternateView av1 = AlternateView.CreateAlternateViewFromString("" + StrContent, null, MediaTypeNames.Text.Html);

           av1.LinkedResources.Add(aa);
           av1.LinkedResources.Add(bb);

           message.AlternateViews.Add(av1);

           message.Subject = "This is subject";

           message.From = Sender;

           message.To.Add(To);

           message.IsBodyHtml = true;

           try
           {
               SmtpClient client = new SmtpClient(ConfigurationManager.AppSettings["smtpServer"].ToString());
               client.UseDefaultCredentials = true;
               client.Send(message);
           }

           catch (Exception ex)
           {
               throw new System.ArgumentException("There was an error when trying to send the email", ex);
           }


       }
   }

1 Ответов

Рейтинг:
1

Richard Deeming

Вам понадобится какой-то способ идентифицировать связанные ресурсы.

Если ваши шаблоны структурированы таким образом, что ресурсы всегда будут храниться в images/{ContentID}.png, то вы могли бы использовать регулярное выражение[^] чтобы извлечь их:

public static class Email
{
    private static readonly Regex ContentIDPattern = new Regex(@"cid:(?<id>[A-Za-z0-9\-_]+)", RegexOptions.ExplicitCapture);
    
    private static ISet<string> ExtractContentIDs(string content)
    {
        var result = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
        foreach (Match match in ContentIDPattern.Matches(content))
        {
            string id = match.Groups["id"].Value;
            result.Add(id);
        }
        
        return result;
    }
    
    private static AlternateView CreateHtmlView(string content)
    {
        AlternateView result = AlternateView.CreateAlternateViewFromString(content, null, MediaTypeNames.Text.Html);
        
        string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
        basePath = Path.Combine(basePath, "Images");
        
        foreach (string id in ExtractContentIDs(content))
        {
            string path = Path.Combine(basePath, id + ".png");
            result.LinkedResources.Add(new LinkedResource(path)
            {
                ContentId = id,
            });
        }
        
        return result;
    }
    
    public static void SendEmail(string to, string sender, string content)
    {
        using (var message = new MailMessage())
        {
            message.From = new MailAddress(sender);
            message.To.Add(new MailAddress(to));
            message.Subject = "This is subject";
            
            AlternateView body = CreateHtmlView(content);
            message.AlternateViews.Add(body);
            
            try
            {
                // TODO: Switch to using the proper configuration element:
                var client = new SmtpClient(ConfigurationManager.AppSettings["smtpServer"]);
                client.UseDefaultCredentials = true;
                client.Send(message);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("There was an error when trying to send the email", ex); 
            }
        }
    }
}

Если ваши ресурсы не следуют этому соглашению, то вам придется передать список идентификаторов контента и соответствующие им пути в систему. SendEmail функция.

NB: Вместо того чтобы использовать appSettings чтобы настроить параметры SMTP, вы должны использовать посвященный system.net/mailSettings/smtp элемент[^Это даст вам гораздо больший контроль над конфигурацией, и вам просто нужно будет использовать new SmtpClient(), без каких-либо параметров, чтобы подобрать настроенные параметры.