我需要能够从silverlight客户端应用程序发送电子邮件。 我通过实现应用程序使用的Web服务来实现这一点。 问题是,现在我需要能够为正在发送的电子邮件添加附件。
我已经阅读了各种帖子,试了十几次自己搞清楚,但没有取得胜利。
所以现在我发现自己想知道这是否可能?
主要问题是附件集合需要可序列化。所以,通过这个,ObservableCollection - 类型(FileInfo)不工作,ObservableCollection - 类型(对象)不起作用...我尝试使用List - 类型(Stream),序列化,但后来我做不知道如何在Web服务端创建文件,因为stream-object没有名称(这是我尝试分配给Attachment对象的第一件事,然后将其添加到message.attachments中)...我有点陷入困境。
有人可以对此有所了解吗?
答案 0 :(得分:1)
我想出了如何做到这一点,并不像看上去那么困难。 在webservice-namespace中创建以下内容: `
[Serializable]
public class MyAttachment
{
[DataMember]
public string Name { get; set; }
[DataMember]
public byte[] Bytes { get; set; }
}`
然后将以下内容添加到您的网络方法参数中:
MyAttachment[] attachment
在网络方法的执行块中添加以下内容:`
foreach (var item in attachment)
{
Stream attachmentStream = new MemoryStream(item.Bytes);
Attachment at = new Attachment(attachmentStream, item.Name);
msg.Attachments.Add(at);
}`
在客户端创建以下属性(或类似的东西): `
private ObservableCollection<ServiceProxy.MyAttachment> _attachmentCollection;
public ObservableCollection<ServiceProxy.MyAttachment> AttachmentCollection
{
get { return _attachmentCollection; }
set { _attachmentCollection = value; NotifyOfPropertyChange(() => AttachmentCollection); }
}`
在构造函数中新建公共属性(AttachmentCollection)。 在OpenFileDialog应该返回文件的位置添加以下内容:`
if(openFileDialog.File!= null)
{
foreach (FileInfo fi in openFileDialog.Files)
{
var tempItem = new ServiceProxy.MyAttachment();
tempItem.Name = fi.Name;
var source = fi.OpenRead();
byte[] byteArray = new byte[source.Length];
fi.OpenRead().Read(byteArray, 0, (int)source.Length);
tempItem.Bytes = byteArray;
source.Close();
AttachmentCollection.Add(tempItem);
}
}`
然后最后在您调用您的网络方法发送电子邮件的地方,添加以下内容(或类似内容):
MailSvr.SendMailAsync(FromAddress, ToAddress, Subject, MessageBody, AttachmentCollection);
这适用于我,附件随邮件一起发送,其所有数据与原始文件完全相同。