21

byte[] として表される Excel ドキュメントがあり、それを電子メールの添付ファイルとして送信したいと考えています。

添付ファイルを作成するのに少し問題があります。

次のコンストラクタを持つ Attachment を作成できます。

(Stream contentStream, ContentType contentType)
(Stream contentStream, string name)
(Stream contentStream, string name, string mediaType)

現時点での私の考えは、byte[] から MemoryStream を作成し、添付ファイルを作成するメソッドに渡すことです。

残念ながら、MemoryStream から目的のファイル名とコンテンツ タイプを取得する方法がわかりません。また、正しいコンテンツ タイプを提供する方法もわかりません。プレーンテキスト、Pdf、Rtf などのオプションがありますが、Excel ドキュメントに使用する必要があるものとしてすぐに思いつくものはありません。

私が見つけることができる最も近いのはMediaTypeNames.Application.Octetで、次のように述べています。

Octet メンバーは、添付ファイルに一般的なバイナリ データが含まれていることを指定します。

ただし、これを使用する場合でも、ストリームのプロパティとして渡すことができない限り、電子メールを送信するための私の方法は、Excel ドキュメントとしてバイト [] しか送信できません...

おそらく他の種類のストリームを使用できますか? または、必要な詳細を含む独自のタイプのストリームを作成する必要がありますか。

確かに誰かが以前にこのことをしたことがあり、Microsoft はこれをこのレベルまで考え抜いていたに違いありません....

どんな助けでも大歓迎です。

更新: ファイル名を文字列として受け取るコンストラクターを使用する回答には投票しないでください。ストリームを使用するものを使用して本当に助けが必要です...ファイルをディスクに書き込んで電子メールで送信し、すぐに削除する必要がないようにしたいです。それを可能にする方法があるので、できればそれを使いたいです。

ソリューションの更新

コンラッドは私が探していたものを見つけることができました! ありがとう山盛り!

提供されたリンクのコンテンツに何かが起こった場合に備えて、提案された解決策を文書化します.

このソリューションの功績はwww.systemnetmail.comにあります

static void AttachmentFromStream()
{

//create the mail message
MailMessage mail = new MailMessage();

//set the addresses
mail.From = new MailAddress("me@mycompany.com");
mail.To.Add("you@yourcompany.com");

//set the content
mail.Subject = "This is an email";
mail.Body = "this content is in the body";

//Get some binary data
byte[] data = GetData();

//save the data to a memory stream
MemoryStream ms = new MemoryStream(data);

//create the attachment from a stream. Be sure to name the data 
//with a file and 
//media type that is respective of the data
mail.Attachments.Add( new Attachment( ms, "example.txt", "text/plain" ));

SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(mail);
}

私の場合、ファイル名とファイル形式を文字列として取得するようにメソッドを変更する必要があることを意味します。Octet を使用してみます...しかし、失敗した場合は、公式の MIME タイプを渡します。

すべてを考慮すると、これは非常に明白な解決策です...しかし、私はそれを解決する助けに感謝しています...そして良いことは、この解決策が同じ問題を抱えている将来のプログラマーのために文書化されることです.

助けてくれてありがとう!

4

5 に答える 5

14

アタッチメントコンストラクターには、実際に必要なことを行うコンストラクターがあります。.NET Framework 2 の System.Net.MailMessage クラスを使用していると仮定しています。その場合は、このリンクを読んで、必要なもののサンプル コードを確認してください。

于 2009-02-09T07:01:36.613 に答える
1

Microsoft docs からこの回答を得ました:

public static void CreateMessageWithAttachment(string server)
{
    // Specify the file to be attached and sent.
    // This example assumes that a file named Data.xls exists in the
    // current working directory.
    string file = "data.xls";
    // Create a message and set up the recipients.
    MailMessage message = new MailMessage(
        "jane@contoso.com",
        "ben@contoso.com",
        "Quarterly data report.",
        "See the attached spreadsheet.");

    // Create  the file attachment for this email message.
    Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
    // Add time stamp information for the file.
    ContentDisposition disposition = data.ContentDisposition;
    disposition.CreationDate = System.IO.File.GetCreationTime(file);
    disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
    disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
    // Add the file attachment to this email message.
    message.Attachments.Add(data);

    //Send the message.
    SmtpClient client = new SmtpClient(server);
    // Add credentials if the SMTP server requires them.
    client.Credentials = CredentialCache.DefaultNetworkCredentials;

    try
    {
        client.Send(message);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception caught in CreateMessageWithAttachment(): {0}",
            ex.ToString());
    }
    // Display the values in the ContentDisposition for the attachment.
    ContentDisposition cd = data.ContentDisposition;
    Console.WriteLine("Content disposition");
    Console.WriteLine(cd.ToString());
    Console.WriteLine("File {0}", cd.FileName);
    Console.WriteLine("Size {0}", cd.Size);
    Console.WriteLine("Creation {0}", cd.CreationDate);
    Console.WriteLine("Modification {0}", cd.ModificationDate);
    Console.WriteLine("Read {0}", cd.ReadDate);
    Console.WriteLine("Inline {0}", cd.Inline);
    Console.WriteLine("Parameters: {0}", cd.Parameters.Count);
    foreach (DictionaryEntry d in cd.Parameters)
    {
        Console.WriteLine("{0} = {1}", d.Key, d.Value);
    }
    data.Dispose();
}
于 2020-12-03T15:07:05.923 に答える
0

--------------- 間違っていると思います。これは、添付したいファイルがある場合です ---------------

ここに添付ファイル付きのメールを送信する例があるようです:

http://www.aspnettutorials.com/tutorials/email/email-attach-aspnet2-csharp.aspx

これがあなたが探しているものであることを願っています。

于 2009-02-09T06:05:06.890 に答える