web-dev-qa-db-ja.com

System.Net.Mailを使用して電子メールに添付ファイルを追加するにはどうすればよいですか?

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

アタッチメントの作成に少し問題があります。

次のコンストラクターを持つアタッチメントを作成できます。

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

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

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

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

オクテットメンバーは、添付ファイルに汎用バイナリデータが含まれていることを指定します。

ただし、これを使用する場合でも、Streamのプロパティとして渡すことができない限り、電子メールを送信するための私のメソッドは、Excelドキュメントとしてbyte []のみを送信できます...

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

確かに、そこにいる誰かが以前にこのことをしたことがあり、確かにマイクロソフトはこれをこのレベルまで考え抜いたでしょう。

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

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

ソリューションの更新

コンラッドは私が探していたものをなんとか見つけました!ヒープマンありがとう!

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

このソリューションのクレジットは www.systemnetmail.com

static void AttachmentFromStream()
{

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

//set the addresses
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");

//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タイプを渡すだけです。

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

皆さん、助けてくれてありがとう!

17
mezoid

添付ファイルコンストラクターには、実際に必要なことを実行するコンストラクターがあります。 .NET Framework 2のSystem.Net.MailMessageクラスを使用していると想定しています。使用している場合 このリンクを読んでください 必要なもののサンプルコード

13
Rad

link from accepted answer がなくなったので、ここでは Wayback Machine からです。

TL; DR:mail.Attachments.Add(new Attachment(contentStream, "yourfilename.txt", "text/plain"));

フル:

static void AttachmentFromStream()
{

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

    //set the addresses
    mail.From = new MailAddress("[email protected]");
    mail.To.Add("[email protected]");

    //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"));

    //send the message
    SmtpClient smtp = new SmtpClient("127.0.0.1");
    smtp.Send(mail);
}
static byte[] GetData()
{
    //this method just returns some binary data.
    //it could come from anywhere, such as Sql Server
    string s = "this is some text";
    byte[] data = Encoding.ASCII.GetBytes(s);
    return data;
}
4
drzaus

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

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

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

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

0
John Boker

添付ファイルコンストラクターのnameパラメーターは、受信者の電子メールの添付ファイルに表示される名前です。

したがって、nameパラメーター(拡張子.xlsを推奨)を自由に選択し、mediaTypeパラメーターを「application/vnd.ms-Excel」に設定できます。これは、Excelファイルに対して定義された MIMEタイプ です。

0
devio