2 votes

Intercepter les e-mails avant de les envoyer (SmtpClient)

J'utilise le code suivant pour envoyer un e-mail :

using (var mailMessage = new MailMessage("from@example.com", "to@example.com"))
{
    mailMessage.Subject = "My topic";
    mailMessage.IsBodyHtml = true;
    mailMessage.Body = "My content";
    using (var smtpClient = new SmtpClient())
    {
        smtpClient.Send(mailMessage);
    }
}

J'aimerais pouvoir intercepter l'e-mail, et changer l'objet ainsi que le destinataire, lorsque j'utilise ce code dans mon environnement de test. Je veux pouvoir configurer quelque chose comme ceci dans mon fichier web.config :

<appSettings>
  [...]
  <add key="RedirectAllEmailsTo" value="someone.else@example.com" />
</appSettings>

Lorsque la valeur de "RedirectAllEmailsTo" n'est pas vide, j'aimerais que tous les courriels de mon application soient envoyés à l'adresse électronique spécifiée, au lieu du destinataire assigné dans ma base de données. MailMessage instance.

Je voudrais également changer le sujet de la MailMessage pour indiquer qui est censé recevoir l'e-mail à quelque chose comme ça : "Mon sujet (destinataire : to@example.com)".

Est-il possible d'intercepter des e-mails, et de changer le destinataire ainsi que le sujet, ou dois-je écrire ma propre classe, au lieu d'utiliser directement SmtpClient ?

Voici mon code. J'espère qu'il y a une meilleure façon de le faire.

public static void SendEmail(MailMessage mailMessage)
{
    var redirectAllEmailsTo = ConfigurationManager.AppSettings["RedirectAllEmailsTo"];
    if (string.IsNullOrEmpty(redirectAllEmailsTo) == false)
    {
        mailMessage.Subject += string.Format(" (to: {0}, cc: {1}, bcc: {2})",
            string.Join(", ", mailMessage.To.Select(m => m.Address)),
            string.Join(", ", mailMessage.CC.Select(m => m.Address)),
            string.Join(", ", mailMessage.Bcc.Select(m => m.Address)));

        mailMessage.To.Clear();
        mailMessage.CC.Clear();
        mailMessage.Bcc.Clear();
        mailMessage.To.Add(redirectAllEmailsTo);
    }
    using (var smtpClient = new SmtpClient())
    {
        smtpClient.Send(mailMessage);
    }
}

2voto

hotkey Points 119

Vous devriez peut-être créer une simple classe d'enveloppe pour SmtpClient con BeforeSend et/ou les opérations souhaitées sur le thème, comme ceci ?

class SmtpClientWrapper
{
    SmtpClient _client = new SmtpClient();

    public event EventHandler BeforeSend;

    private void PreprocessMesage(MailMessage message)
    {
        //do something with the message topic, as you desire
    }

    public void Send(MailMessage message)
    {
        BeforeSend(this, EventArgs.Empty);
        PreprocessMessage(message);
        _client.Send(message);
    }
}

2voto

Oded Points 271275

La façon standard de traiter ce problème (c'est-à-dire ne pas envoyer de courrier électronique dans un environnement de développement) est la suivante no pour intercepter les emails.

Il s'agit d'avoir un *.config pour votre environnement de développement que celui que vous avez en production - ceci peut être géré à l'aide de la fonction transformations de la configuration (avec ou sans SlowCheetah ), ou toute autre solution maison.

Ce fichier de configuration doit pointer vers un serveur SMTP de développement, qui se contente de recevoir les messages et ne les envoie pas. Il existe de nombreux moyens de faire ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X