web-dev-qa-db-ja.com

C#System.Net.Mail.MailMessageで複数行の本文を作成する方法

Bodyプロパティを次のように作成する場合

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

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

私も試しました

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

(Outlookを使用して)メッセージを受信したとき、これらは両方とも無視されました。

複数のラインを取得する方法に関するアイデアはありますか?電子メールがスパムフィルターでより適切に再生されるように、HTMLエンコードを回避しようとしています。

ありがとう

40
Maestro1024

Drrisのコメントによると、IsBodyHtmlがtrueに設定されている場合、標準の改行は設計によって無視される可能性があります。HTMLを避けることを言及しているが、<br />代わりに、これが問題を「解決」するかどうかを確認するだけでも-知っていることで除外できます。

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

IsBodyHtmlfalseに設定して、そのインスタンスで改行が機能するかどうかを確認することもできますが、trueに明示的に設定しない限り、デフォルトはとにかくfalse

また、副次的な注意として、電子メールでHTMLを回避することは、スパムフィルターを介してメッセージを取得するのに必ずしも助けとはなりません。スパムフィルターで「ナイス」をプレイするには、他にも多くのことを考慮する必要があります。メールの件名と内容、メールの送信元と送信先、および送信者が一致する場所など。電子メールは単にbecauseで区別されません。HTMLでマークアップされています。

48
Grant Thomas

2つの空白で新しい行を開始すると、Outlookによって実行される自動削除が回避されます。

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

正しく表示されます:

line 1
line 2

使用するのは少し不器用な感じですが、多くの余分な労力を費やすことなく仕事をします。

14
Ron Thacker

HTMLのメッセージ本文が必要ない場合は、オフにします。

message.IsBodyHtml = false;

次に使用します:

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

ただし、何らかの理由でHTMLに含める必要がある場合は、htmlタグを使用します。

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

MailMessageで作業しているとき、私は通常StringBuilderが好きです。新しい行の追加は簡単で(AppendLineメソッドを使用)、メッセージの本文をStringBuilder.ToString()に設定するだけで済みます(StringBuilderのインスタンスの場合)。

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

IsBodyHTMLを有効にする必要があります

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

これの鍵は、あなたが言ったときです

outlookを使用します。

完全にフォーマットされたテキスト本文の電子メールでも同じ問題が発生しました。ゴミを出すのはOutlookです。時折、「余分な改行が削除された」と言っても十分に親切です。通常は、必要なことを実行するだけで、バカに見えます。

それで、私は簡潔な本文を入れ、素敵なフォーマットのテキストを添付ファイルに入れました。それを行うか、本文をHTMLでフォーマットできます。

2
Charles Kincaid

逐語演算子「@ "メッセージの前:

message.Body = 
@"
FirstLine
SecondLine
"

左マージンからのテキストの距離も、メール本文の左マージンからの実際の距離に影響することを考慮してください。

1
Ciro Corvino

私のために働いたのは、単にデータを:

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

これが役立つことを願っています

0
PoopaSaurasRex

これを試して

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

\ r\nの使用に固執する場合

私は1日丸ごと試してみた後、なんとか仕事に取り掛かりました!

0
s k

StringBuilderオブジェクトを使用して、appendlineメソッドを使用してください。それはうまくいくかもしれません。

0
dotNet Zombie

これは以前に回答された可能性があることを理解しています。しかし、私は今朝、Environment.Newlineメール本文に保存されません。以下は完全です(現在Environment.NewLine保存されている)私のプログラムを介して電子メールを送信するために使用するメソッド。(Modules.MessageUpdateの部分はスキップできます。これは、所有しているログファイルに書き込むだけです。これは、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();
        }
    }

複数の受信者を追加するには、電子メールアドレス間に手動で「;」を含めるか、他の方法の1つでTxtファイルから辞書に入力し、次のスニペットを使用して受信者の電子メールアドレスを作成します。

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

これの少なくとも一部が誰かを助けることを願っています。

0
DDuffy

今日、エラー報告アプリで同じ問題を見つけました。 Outlookが必要なメッセージを表示できるようにするために、HTMLに頼りたくありません(StringBuilder sbを想定)。

sb.Append(" \r\n\r\n").Append("Exception Time:" + DateTime.UtcNow.ToString());

0
Gilberto

.の前に\r\nを追加すると、\r\nの前の元の文字列に.がない場合に機能します

他のキャラクターが動作する場合があります。私は試しませんでした。

IsBodyHtmlを含む3行の有無にかかわらず、問題ではありません。

0
Bob