云呼呼  
行云流水 随意所之
最近写了一个SMTP邮件发送服务,采用开源OpenSmtp,一直都是发送本地文件附件没有问题.最近根据需求,需要从数据库中取出二进制数据进行附件发送,本身以为很简单的事情,代码如下:

.
MemoryStream attStream 
= new MemoryStream();
attStream.Write(mailAttachment,
0,mailAttachment.Length);
Attachment objAttachment = new Attachment(attStream,mailAttachmentName);
.
objSmtp.SendMail(objMail);

结果.....死活附件发送不出去,也没有任何异常产生,跟踪进入OpenSmtp.Mail.MailEncoder.ConvertToBase64()
internal static void ConvertToBase64(Stream inputStream, string outputFilePath)
{        
        ...............
      
//Read from the input file, then encrypt and write to the output file.
        while(rdlen < totlen)
        
{
                len 
= inputStream.Read(bin, 0, (int)inputStream.Length);
                encStream.Write(bin, 
0, len);
                
//inputBlock size(3)
                rdlen = (rdlen + ((len / transformer.InputBlockSize) * transformer.OutputBlockSize));
         }

         encStream.Close();
         fout.Close();
}
发现程序 len 值为0 @_@  为0的话这不就死循环了吗,继续找原因,怎么会为0呢,( bin,(int)inputStream.Length) 长度都正确,奇了怪了,搞来搞去 头晕眼花 忽然想起前几天看到的一篇文章 说MemoryStream.Write()后,流的当前位置是停在结束位置上,如果再Read(),是从结束位开始读.正确的做法应该在Read() 前重新设置流位置MemoryStream.Seek(0,SeekOrigin.Begin),修改后代码如下:

MemoryStream attStream 
= new MemoryStream();
attStream.Write(mailAttachment,
0,mailAttachment.Length);
attStream.Seek(0,SeekOrigin.Begin);
Attachment objAttachment = new Attachment(attStream,mailAttachmentName);
.
objSmtp.SendMail(objMail);

二进制附件正常 ^^
posted on 2005-11-29 12:43  云呼呼  阅读(1063)  评论(2)    收藏  举报