自己用c#写的一个用TcpClient和NetworkStream来发送邮件的程序,附件在30k左右没有问题,附件在50k或更多的时候就会发送不出去.
我用 smtp.163.com作为发件箱服务器 错误提示:远程主机强迫关闭了一个现有的连接。
我用iis的smtp虚拟服务器作为发信服务器,程序没有出错提示,但都在iis中变成了死信,根本没有发送出去。iis日志中错误提示是:554 Too long line was received. Transmission aborted.想了两天都找不到问题所在,网上也没有找到解决方法,求邮件高手们帮帮忙。。附件发送代码:
private void Attachment()
{//对文件列表做循环
if (filelist == null)
{
return;
}
for (int i = 0; i < filelist.Rows.Count; i++)
{
DataRow dr = filelist.Rows[i];
WriteStream("--unique-boundary-1");
WriteStream("Content-Type: application/octet-stream;name=\"" + dr[0].ToString() + "\"");//文件格式
WriteStream("Content-Transfer-Encoding: base64");//内容编码
WriteStream("Content-Disposition:attachment;filename=\"" + dr[0].ToString() + "\"");//文件名
WriteStream("");
string fileinfo = dr[1].ToString();
WriteStream(fileinfo);
WriteStream("");
}
}
private void WriteStream(string strCmd, string charset)
{
NetworkStream TcpStream;//定义操作对象
strCmd = strCmd + "\r\n";//加入换行符
TcpStream = this.GetStream();//获取数据流
TcpStream.WriteTimeout = 1000;
//将命令行转化为byte[]
byte[] bWrite = Encoding.GetEncoding(charset).GetBytes(strCmd.ToCharArray());
//由于每次写入的数据大小是有限的,那么我们将每次写入的数据长度定在75个字节,一旦长度超过75就分步写入。
int start = 0;
int length = bWrite.Length;
int page = 0;
int size = 76;
int count = size;
if (length > size)
{
if ((length / size) * size < length)
{
page = length / size + 1;
}
else
{
page = length / size;
}
for (int i = 0; i < page; i++) //根据页数循环写入
{
start = i * size;
if (i == page - 1)
{
count = length - (i * size);
}
TcpStream.Write(bWrite, start, count);
TcpStream.Flush();
WriteLog(Encoding.GetEncoding(charset).GetString(bWrite, start, count));
}
}
else
{
TcpStream.Write(bWrite, 0, length);
TcpStream.Flush();
WriteLog(Encoding.GetEncoding(charset).GetString(bWrite, 0, length));
}
}
我用 smtp.163.com作为发件箱服务器 错误提示:远程主机强迫关闭了一个现有的连接。
我用iis的smtp虚拟服务器作为发信服务器,程序没有出错提示,但都在iis中变成了死信,根本没有发送出去。iis日志中错误提示是:554 Too long line was received. Transmission aborted.想了两天都找不到问题所在,网上也没有找到解决方法,求邮件高手们帮帮忙。。附件发送代码:
private void Attachment()
{//对文件列表做循环
if (filelist == null)
{
return;
}
for (int i = 0; i < filelist.Rows.Count; i++)
{
DataRow dr = filelist.Rows[i];
WriteStream("--unique-boundary-1");
WriteStream("Content-Type: application/octet-stream;name=\"" + dr[0].ToString() + "\"");//文件格式
WriteStream("Content-Transfer-Encoding: base64");//内容编码
WriteStream("Content-Disposition:attachment;filename=\"" + dr[0].ToString() + "\"");//文件名
WriteStream("");
string fileinfo = dr[1].ToString();
WriteStream(fileinfo);
WriteStream("");
}
}
private void WriteStream(string strCmd, string charset)
{
NetworkStream TcpStream;//定义操作对象
strCmd = strCmd + "\r\n";//加入换行符
TcpStream = this.GetStream();//获取数据流
TcpStream.WriteTimeout = 1000;
//将命令行转化为byte[]
byte[] bWrite = Encoding.GetEncoding(charset).GetBytes(strCmd.ToCharArray());
//由于每次写入的数据大小是有限的,那么我们将每次写入的数据长度定在75个字节,一旦长度超过75就分步写入。
int start = 0;
int length = bWrite.Length;
int page = 0;
int size = 76;
int count = size;
if (length > size)
{
if ((length / size) * size < length)
{
page = length / size + 1;
}
else
{
page = length / size;
}
for (int i = 0; i < page; i++) //根据页数循环写入
{
start = i * size;
if (i == page - 1)
{
count = length - (i * size);
}
TcpStream.Write(bWrite, start, count);
TcpStream.Flush();
WriteLog(Encoding.GetEncoding(charset).GetString(bWrite, start, count));
}
}
else
{
TcpStream.Write(bWrite, 0, length);
TcpStream.Flush();
WriteLog(Encoding.GetEncoding(charset).GetString(bWrite, 0, length));
}
}
推荐楼主采用OpenSMTP组件,这个不错。