web-dev-qa-db-fra.com

Comment créer un corps multiligne dans C # System.Net.Mail.MailMessage

Si créer la propriété body comme 

System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();

message.Body ="First Line \n second line";

J'ai aussi essayé

message.Body ="First Line" + system.environment + "second line";

Ces deux éléments ont été ignorés lorsque j'ai reçu le message (à l'aide d'Outlook).

Des idées sur la façon d'obtenir des lignes multiples? J'essaie d'éviter l'encodage HTML afin que l'email joue mieux avec les filtres anti-spam. 

merci

34
Maestro1024

Selon le commentaire de drris, si IsBodyHtml est défini sur true, une nouvelle ligne standard pourrait potentiellement être ignorée par la conception. Je sais que vous évitez d'utiliser HTML, mais essayez plutôt d'utiliser <br />, même si vous voulez voir si cela résout le problème. vous pouvez exclure par ce que vous savez:

var message = new System.Net.Mail.MailMessage();
message.Body = "First Line <br /> second line";

Vous pouvez également simplement essayer de définir IsBodyHtml sur false et de déterminer si les nouvelles lignes fonctionnent dans ce cas. Cependant, sauf si vous définissez explicitement sur true, je suis sûr que sa valeur par défaut est false de toute façon.

De plus, éviter le HTML dans les e-mails n’est pas nécessairement une aide pour filtrer le message, mais autant que je sache, le plus que vous fassiez est de garantir la compatibilité inter-client-client en termes de présentation. Pour "jouer à Nice" avec les filtres anti-spams, il convient de prendre en compte un certain nombre d'autres éléments. même autant que le sujet et le contenu du courrier, à qui le courrier est envoyé et où et ils correspondent et cetera. Un email ne sera tout simplement pas discriminé car il est marqué avec HTML.

44
Grant Thomas

En commençant chaque nouvelle ligne par deux espaces blancs, vous éviterez la suppression automatique effectuée par Outlook.

var lineString = "  line 1\r\n";
linestring += "  line 2";

Affiche correctement:

line 1
line 2

C'est un peu maladroit à utiliser, mais il fait le travail sans trop d'effort supplémentaire.

14
Ron Thacker

Si vous n'avez pas besoin du corps du message en HTML, désactivez-le:

message.IsBodyHtml = false;

puis utilisez par exemple:

message.Body = "First line" + Environment.NewLine + 
               "Second line";

mais si vous avez besoin de l'avoir en HTML pour une raison quelconque, utilisez le tag html:

message.Body = "First line <br /> Second line";
11
Mikael Puusaari

J'aime généralement StringBuilder lorsque je travaille avec MailMessage. L'ajout de nouvelles lignes est facile (via la méthode AppendLine) et vous pouvez simplement définir le corps du message sur StringBuilder.ToString () (... pour l'instance de StringBuilder).

StringBuilder result = new StringBuilder("my content here...");
result.AppendLine(); // break line
3
Justin Denton

La clé de ceci est quand vous avez dit 

en utilisant Outlook.

J'ai eu le même problème avec des e-mails avec un corps de texte parfaitement formaté. C'est Outlook qui en fait des déchets. Parfois, il est assez aimable de vous dire que "les sauts de ligne supplémentaires ont été supprimés". Habituellement, il fait ce qu'il veut et vous rend stupide.

Je me suis donc mis dans un corps laconique et j'ai mis mon texte formaté Nice dans une pièce jointe. Vous pouvez le faire ou formater le corps en HTML.

2
Charles Kincaid

Vous devez activer IsBodyHTML

message.IsBodyHtml = true; //This will enable using HTML elements in email body
message.Body ="First Line <br /> second line";
1
levinjay

Essayez d’utiliser l’opérateur "@" avant votre message:

message.Body = 
@"
FirstLine
SecondLine
"

Considérez que la distance entre le texte et la marge gauche affecte également la distance réelle de la marge gauche du corps de l'e-mail.

1
Ciro Corvino

Quelque chose qui a fonctionné pour moi séparait simplement les données avec un :

message.Body = FirstLine + ":" + SecondLine;

J'espère que ça aide

0
PoopaSaurasRex

Essaye ça

IsBodyHtml = false,
BodyEncoding = Encoding.UTF8,
BodyTransferEncoding = System.Net.Mime.TransferEncoding.EightBit

Si vous souhaitez vous en tenir à\r\n

J'ai réussi à faire fonctionner le mien après avoir essayé pendant une journée entière!

0
s k

Essayez d’utiliser un objet StringBuilder et utilisez la méthode appendline. Cela pourrait fonctionner.

0
dotNet Zombie

Je réalise que cela a peut-être déjà été répondu. Cependant, j'ai eu ce problème ce matin avec Environment.Newline n'étant pas conservé dans le corps de l'e-mail. Ce qui suit est une méthode complète (je travaille maintenant avec Environment.NewLine préservée) que j’utilise pour envoyer un courrier électronique via mon programme (la partie Modules.MessageUpdate peut être ignorée car elle est simplement écrite dans un fichier journal que j’ai). la page principale de mon programme WinForms.

    private void MasterMail(string MailContents)
    {
        Modules.MessageUpdate(this, ObjApp, EH, 3, 25, "", "", "", 0, 0, 0, 0, "Master Email - MasterMail Called.", "N", MainTxtDict, MessageResourcesTxtDict);

        Outlook.Application OApp = new Outlook.Application();
        //Location of email template to use. Outlook wont include my Signature through this automation so template contains only that.
        string Temp = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + ResourceDetails.DictionaryResources("SigTempEmail", MainTxtDict);

        Outlook.Folder folder = OApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDrafts) as Outlook.Folder;

        //create the email object.
        Outlook.MailItem TestEmail = OApp.CreateItemFromTemplate(Temp, folder) as Outlook.MailItem;

        //Set subject line.
        TestEmail.Subject = "Automation Results";

        //Create Recipients object.
        Outlook.Recipients oRecips = (Outlook.Recipients)TestEmail.Recipients;

        //Set and check email addresses to send to.
        Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add("EmailAddressToSendTo");
        oRecip.Resolve();

        //Set the body of the email. (.HTMLBody for HTML Emails. .Body will preserve "Environment.NewLine")
        TestEmail.Body = MailContents + TestEmail.Body;
        try
        {
            //If Outlook is not open, Open it.
            Process[] pName = Process.GetProcessesByName("Outlook.EXE");
            if (pName.Length == 0)
            {
                System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\root\Office16\Outlook.EXE");
            }

            //Send email
            TestEmail.Send();

            //Update logfile - Success.
            Modules.MessageUpdate(this, ObjApp, EH, 1, 17, "", "", "", 0, 0, 0, 0, "Master Email sent.", "Y", MainTxtDict, MessageResourcesTxtDict);
        }
        catch (Exception E)
        {
            //Update LogFile - Fail.
            Modules.MessageUpdate(this, ObjApp, EH, 5, 4, "", "", "", 0, 0, 0, 0, "Master Email - Error Occurred. System says: " + E.Message, "Y", MainTxtDict, MessageResourcesTxtDict);
        }
        finally
        {
            if (OApp != null)
            {
                OApp = null;
            }
            if (folder != null)
            {
                folder = null;
            }
            if (TestEmail != null)
            {
                TestEmail = null;
            }
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }

Vous pouvez ajouter plusieurs destinataires en incluant manuellement un ";" entre les adresses e-mail ou l'une des autres méthodes que je remplis d'un fichier txt dans un dictionnaire et que je peux utiliser pour créer les adresses e-mail des destinataires à l'aide du fragment suivant.

        foreach (KeyValuePair<string, string> kvp in EmailDict)
        {
            Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(kvp.Value);
            RecipientList += string.Format("{0}; ", kvp.Value);
            oRecip.Resolve();
        }

J'espère qu'au moins une partie de cela aidera quelqu'un.

0
DDuffy

La réponse se trouve dans le code donné par silvia elena dans cet article .

0
Mark Worsfold