トランザクションのどの時点でも、物理ファイルを保存したくないという点で、System.Net.Mail のちょっと変わった使用例があります。
メールのルーターとして機能する wcf Web サービスがあります。メールを送信する簡単なリクエストを行うと、正常に機能します。文字列のファイル パスを送信することもできます。ファイルが取得され、適切に送信されます。
機能していないのは、有効なExcel XML文字列を取得しようとするメソッドです(ファイルライターを使用してファイルに保存すると、期待どおりに開くため、有効であることはわかっています)、それをバイト配列に変換してから添付ファイルを作成して MailMessage に追加する Web サービスに送信します。添付ファイルを取得すると、単純に Excel ワークシートとして開き、各行は XML ドキュメントの行です。
これは現在の出力です:
Row1: <?xml version="1.0"?>
Row2: <?mso-application progid="Excel.Sheet"?>
Row3: <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
Row4: xmlns:o="urn:schemas-microsoft-com:office:office"
Row5: xmlns:x="urn:schemas-microsoft-com:office:excel"
Row6: xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
Row7: xmlns:html="http://www.w3.org/TR/REC-html40">
Row8: <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
Notepad++ でファイルを開くと、行末に LF 要素しかないことがわかります。通常は LF とキャリッジ リターンが期待されます。
クライアント側にあるコードは次のとおりです。
byte[] data = new byte[reportXml.Length * sizeof(char)];
System.Buffer.BlockCopy(reportXml.ToCharArray(), 0, data, 0, data.Length);
var result = emailClient.SendMailfromBinaryData(to, from, cc, subject, body, data, "attachment.xlsx");
以下は、MailMessage に添付ファイルを追加する WCF サービス内のコードです。
if (argFileStream != null && !string.IsNullOrEmpty(argFileName))
{
var stream = new MemoryStream(argFileStream);
var attachment = new Attachment(stream, argFileName, "text/plain");
attachment.NameEncoding = new UTF8Encoding();
message.Attachments.Add(attachment);
}
MIMEタイプをExcelに変更しようとしたわけではありません:
var attachment = new Attachment(stream, argFileName, "application/vnd.ms-excel");
何か案は?エラーは発生しません。XML が実際には XML としての Excel ファイルであることを Excel が認識しないだけです。