gpt4 book ai didi

c# - 无需写入磁盘即可将多个文件以编程方式附加到电子邮件

转载 作者:太空狗 更新时间:2023-10-29 20:12:04 25 4
gpt4 key购买 nike

我们的项目将文件作为 blob 存储在 sql server 数据库中。我想从数据库中获取文件并将多个文件附加到电子邮件而不写入磁盘。

这是我目前所拥有的(一切正常,没有附件):

// snip

List<System.Net.Mail.Attachment> attachments = null;
// Attachments is a child list of Messagebody object holding Attachment ids
MessageBody.Attachments = MessageBodyAttachmentList.GetMessageBodyAttachmentList(this.MessageBody.ID);

if (MessageBody.Attachments != null && MessageBody.Attachments.Count > 0)
{
attachments = new List<Attachment>();

foreach (Library.Entity.Messaging.MessageBodyAttachment att in MessageBody.Attachments)
{
using (MemoryStream memoryStream = new MemoryStream())
{
// create a new attachment
Library.Attachments.Attachment attachment = Library.Attachments.Attachment.GetAttachment(att.AttachmentID);

byte[] contentAsBytes = attachment.FileData;// FileData holds byte[] that is the contents of the file
memoryStream.Write(contentAsBytes, 0, contentAsBytes.Length);
memoryStream.Seek(0, SeekOrigin.Begin);

// content type for file info
ContentType contentType = new ContentType();
contentType.MediaType = MediaTypeNames.Application.Octet;
contentType.Name = attachment.FileName;

// create the .Net specific attachment
Attachment netAttachment = new Attachment(memoryStream, contentType);
attachments.Add(netAttachment);

memoryStream.Position = 0;
}
}
}

response = message.SendMessage(_recipient, _sender, _cc, _bcc, MessageBody.Subject, MessageBody.Body, true, attachments);
// snip

public string SendMessage(string to, string from, string cc, string bcc, string subject, string body, bool IsHtml, List<Attachment> attachments)
{
string response = String.Empty;
System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(from, to, subject, body);

// Add the attachments
if (attachments != null)
{
foreach (Attachment a in attachments)
message.Attachments.Add(a);
}

message.IsBodyHtml = IsHtml;

if (IsHtml)
{
// snip
}

try
{
_client.Timeout = 500000;
_client.Send(message);
}
catch (SmtpException smtpex)
{
response = smtpex.Message;
}
catch (System.Exception ex)
{
response = ex.Message;
}
return response;
}

我收到以下错误:

exception message: Failure sending mail.
source: System
stack trace:
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at MyCompany.Shared.Email.SMTPMessage.SendMessage(String to, String from, String cc, String bcc, String subject, String body, Boolean IsHtml, List`1 attachments) in C:\svn_repos\branches\2010.02.28\Net\Common\Shared\Email\SMTPMessage.cs:line 116

inner exception msg: Cannot access a closed Stream.
inner source: mscorlib
inner targetsite: {Void StreamIsClosed()}
inner stack trace:
at System.IO.__Error.StreamIsClosed()
at System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.Mime.MimePart.Send(BaseWriter writer)
at System.Net.Mime.MimeMultiPart.Send(BaseWriter writer)
at System.Net.Mail.Message.Send(BaseWriter writer, Boolean sendEnvelope)
at System.Net.Mail.MailMessage.Send(BaseWriter writer, Boolean sendEnvelope)
at System.Net.Mail.SmtpClient.Send(MailMessage message)

我从网上找到的示例中复制了大部分流代码。

最佳答案

您找到了不实现 using block 的原因:当您在 block 退出后仍要使用该对象时。从 using block 中取出 MemoryStream

关于c# - 无需写入磁盘即可将多个文件以编程方式附加到电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com