这个是对于
EMAIL发送系统(C#+基于SMTP认证) 1.0
的改版这个第一版是2002年11月写的,过了一年半了,才有人提意见,就修正了一下,因为后来做的项目一直用不上,也就没有注意到
前段时间有网友反馈了一些问题,这次主要做了一些修正
1,text模式下发往163的邮件内容不见了
2,如果用outlook接收而不是在网上看邮件的话,会发现正文内容,但其后跟着一些乱码.
3,一些新开通的邮箱收到的是乱码,如 *@126.com
4,修正了带附件的邮件,打开附件时内容混乱的问题
感谢 Lion互动网络论坛 的smhy8187和邮箱是 [email protected] 的朋友提供意见
欢迎大家提出修改建议,[注:]最好能把修改稿Mail给我一份,我们共同学习
我的Email:[email protected] [email protected]
------------------------------------------
源码下载: 点击下载
以下是程序源码:
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections;
namespace Lion.Web.Mail
{
/*
Create By lion
2004-04-23 19:00
Copyright (C) 2001,2002 www.LionSky.Net . All rights reserved.
Web: http://www.Lionsky.net ;;
Email: [email protected]
Support .Net Framework Beta 2
*/
#region AspNetPager Server Control
///
1<summary>
2/// 邮件可以通过 Microsoft Windows 2000 中内置的 SMTP 邮件服务或任意 SMTP 服务器来传送
3/// </summary>
public class SmtpMail
{
private string enter="\r\n";
///
1<summary>
2/// 设定语言代码,默认设定为GB2312,如不需要可设置为""
3/// </summary>
private string _charset="GB2312";
///
1<summary>
2/// 发件人地址
3/// </summary>
private string _from="";
///
1<summary>
2/// 发件人姓名
3/// </summary>
private string _fromName="";
///
1<summary>
2/// 回复邮件地址
3/// </summary>
///public string ReplyTo="";
///
1<summary>
2/// 收件人姓名
3/// </summary>
private string _recipientName="";
///
1<summary>
2/// 收件人列表
3/// </summary>
private Hashtable Recipient=new Hashtable();
///
1<summary>
2/// 邮件服务器域名
3/// </summary>
private string mailserver="";
///
1<summary>
2/// 邮件服务器端口号
3/// </summary>
private int mailserverport=25;
///
1<summary>
2/// SMTP认证时使用的用户名
3/// </summary>
private string username="";
///
1<summary>
2/// SMTP认证时使用的密码
3/// </summary>
private string password="";
///
1<summary>
2/// 是否需要SMTP验证
3/// </summary>
private bool ESmtp=false;
///
1<summary>
2/// 是否Html邮件
3/// </summary>
private bool _html=false;
///
1<summary>
2/// 邮件附件列表
3/// </summary>
private IList Attachments;
///
1<summary>
2/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"
3/// </summary>
private string priority="Normal";
///
1<summary>
2/// 邮件主题
3/// </summary>
private string _subject;
///
1<summary>
2/// 邮件正文
3/// </summary>
private string _body;
///
1<summary>
2/// 密送收件人列表
3/// </summary>
///private Hashtable RecipientBCC=new Hashtable();
///
1<summary>
2/// 收件人数量
3/// </summary>
private int RecipientNum=0;
///
1<summary>
2/// 最多收件人数量
3/// </summary>
private int recipientmaxnum=5;
///
1<summary>
2/// 密件收件人数量
3/// </summary>
///private int RecipientBCCNum=0;
///
1<summary>
2/// 错误消息反馈
3/// </summary>
private string errmsg;
///
1<summary>
2/// TcpClient对象,用于连接服务器
3/// </summary>
private TcpClient tc;
///
1<summary>
2/// NetworkStream对象
3/// </summary>
private NetworkStream ns;
///
1<summary>
2/// 服务器交互记录
3/// </summary>
private string logs="";
///
1<summary>
2/// SMTP错误代码哈希表
3/// </summary>
private Hashtable ErrCodeHT = new Hashtable();
///
1<summary>
2/// SMTP正确代码哈希表
3/// </summary>
private Hashtable RightCodeHT = new Hashtable();
///
1<summary>
2/// 初始化 <see cref="Lion.Web.Mail.SmtpMail"></see> 类的新实例
3/// </summary>
public SmtpMail()
{
Attachments = new System.Collections.ArrayList();
}
#region Properties
///
1<summary>
2/// 邮件主题
3/// </summary>
public string Subject
{
get
{
return this._subject;
}
set
{
this._subject = value;
}
}
///
1<summary>
2/// 邮件正文
3/// </summary>
public string Body
{
get
{
return this._body;
}
set
{
this._body = value;
}
}
///
1<summary>
2/// 发件人地址
3/// </summary>
public string From
{
get
{
return _from;
}
set
{
this._from = value;
}
}
///
1<summary>
2/// 设定语言代码,默认设定为GB2312,如不需要可设置为""
3/// </summary>
public string Charset
{
get
{
return this._charset;
}
set
{
this._charset = value;
}
}
///
1<summary>
2/// 发件人姓名
3/// </summary>
public string FromName
{
get
{
return this._fromName;
}
set
{
this._fromName = value;
}
}
///
1<summary>
2/// 收件人姓名
3/// </summary>
public string RecipientName
{
get
{
return this._recipientName;
}
set
{
this._recipientName = value;
}
}
///
1<summary>
2/// 邮件服务器域名和验证信息
3/// 形如:"user:[email protected]:25",也可省略次要信息。如"user:[email protected]"或" www.server.com "
4/// </summary>
public string MailDomain
{
set
{
string maidomain=value.Trim();
int tempint;
if(maidomain!="")
{
tempint=maidomain.IndexOf("@");
if(tempint!=-1)
{
string str=maidomain.Substring(0,tempint);
MailServerUserName=str.Substring(0,str.IndexOf(":"));
MailServerPassWord=str.Substring(str.IndexOf(":")+1,str.Length-str.IndexOf
(":")-1);
maidomain=maidomain.Substring(tempint+1,maidomain.Length-tempint-1);
}
tempint=maidomain.IndexOf(":");
if(tempint!=-1)
{
mailserver=maidomain.Substring(0,tempint);
mailserverport=System.Convert.ToInt32(maidomain.Substring
(tempint+1,maidomain.Length-tempint-1));
}
else
{
mailserver=maidomain;
}
}
}
}
///
1<summary>
2/// 邮件服务器端口号
3/// </summary>
public int MailDomainPort
{
set
{
mailserverport=value;
}
}
///
1<summary>
2/// SMTP认证时使用的用户名
3/// </summary>
public string MailServerUserName
{
set
{
if(value.Trim()!="")
{
username=value.Trim();
ESmtp=true;
}
else
{
username="";
ESmtp=false;
}
}
}
///
1<summary>
2/// SMTP认证时使用的密码
3/// </summary>
public string MailServerPassWord
{
set
{
password=value;
}
}
///
1<summary>
2/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"
3/// </summary>
public string Priority
{
set
{
switch(value.ToLower())
{
case "high":
priority="High";
break;
case "1":
priority="High";
break;
case "normal":
priority="Normal";
break;
case "3":
priority="Normal";
break;
case "low":
priority="Low";
break;
case "5":
priority="Low";
break;
default:
priority="Normal";
break;
}
}
}
///
1<summary>
2/// 是否Html邮件
3/// </summary>
public bool Html
{
get
{
return this._html;
}
set
{
this._html = value;
}
}
///
1<summary>
2/// 错误消息反馈
3/// </summary>
public string ErrorMessage
{
get
{
return errmsg;
}
}
///
1<summary>
2/// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我( [email protected] ),我将尽快查明
3
4原因。
5/// </summary>
public string Logs
{
get
{
return logs;
}
}
///
1<summary>
2/// 最多收件人数量
3/// </summary>
public int RecipientMaxNum
{
set
{
recipientmaxnum = value;
}
}
#endregion
#region Methods
///
1<summary>
2/// 添加邮件附件
3/// </summary>
///
1<param name="FilePath"/>
附件绝对路径
public void AddAttachment(params string[] FilePath)
{
if(FilePath==null)
{
throw(new ArgumentNullException("FilePath"));
}
for(int i=0;i
1<filepath.length;i++) <summary="" attachments.add(filepath[i]);="" {="" }="">
2/// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组
3///
4/// <param name="Recipients"/>保存有收件人地址的字符串数组(不超过recipientmaxnum个)
5public bool AddRecipient(params string[] Recipients)
6{
7if(Recipient==null)
8{
9Dispose();
10throw(new ArgumentNullException("Recipients"));
11}
12for(int i=0;i<recipients.length;i++) "));="" "recipients.indexof(\"@\")='-1","Recipients' +"]"));="" <summary="" argumentexception(="" argumentnullexception("recipients["+="" dispose();="" false;="" i="" if(!addrecipient(recipient))="" if(recipient="String.Empty)" if(recipient.indexof("@")="-1)" recipient="Recipients[i].Trim();" return="" string="" throw(new="" true;="" {="" }="">
13/// 发送邮件方法,所有参数均通过属性设置。
14///
15public bool Send()
16{
17if(mailserver.Trim()=="")
18{
19throw(new ArgumentNullException("Recipient","必须指定SMTP服务器"));
20}
21
22return SendEmail();
23
24}
25
26
27/// <summary>
28/// 发送邮件方法
29/// </summary>
30/// <param name="smtpserver"/>smtp服务器信息,如"username:[email protected]:25",也可去掉部分次要信
31
32息,如" www.smtpserver.com"
33public bool Send(string smtpserver)
34{
35MailDomain=smtpserver;
36return Send();
37}
38
39
40/// <summary>
41/// 发送邮件方法
42/// </summary>
43/// <param name="smtpserver"/>smtp服务器信息,如"username:[email protected]:25",也可去掉部分次要信
44
45息,如" www.smtpserver.com"
46/// <param name="from"/>发件人mail地址
47/// <param name="fromname"/>发件人姓名
48/// <param name="to"/>收件人地址
49/// <param name="toname"/>收件人姓名
50/// <param name="html"/>是否HTML邮件
51/// <param name="subject"/>邮件主题
52/// <param name="body"/>邮件正文
53public bool Send(string smtpserver,string from,string fromname,string to,string toname,bool html,string
54
55subject,string body)
56{
57MailDomain=smtpserver;
58From=from;
59FromName=fromname;
60AddRecipient(to);
61RecipientName=toname;
62Html=html;
63Subject=subject;
64Body=body;
65return Send();
66}
67
68
69#endregion
70
71#region Private Helper Functions
72
73/// <summary>
74/// 添加一个收件人
75/// </summary>
76/// <param name="Recipients"/>收件人地址
77private bool AddRecipient(string Recipients)
78{
79if(RecipientNum<recipientmaxnum) "+="" +"="" <summary="" argumentoutofrangeexception("recipients","收件人过多不可多于="" dispose()="" dispose();="" else="" if(ns!="null)ns.Close();" if(tc!="null)tc.Close();" recipient.add(recipientnum,recipients);="" recipientmaxnum="" recipientnum++;="" return="" throw(new="" true;="" void="" {="" }="" 个"));="">
80/// SMTP回应代码哈希表
81///
82private void SMTPCodeAdd()
83{
84ErrCodeHT.Add("500","邮箱地址错误");
85ErrCodeHT.Add("501","参数格式错误");
86ErrCodeHT.Add("502","命令不可实现");
87ErrCodeHT.Add("503","服务器需要SMTP验证");
88ErrCodeHT.Add("504","命令参数不可实现");
89ErrCodeHT.Add("421","服务未就绪,关闭传输信道");
90ErrCodeHT.Add("450","要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)");
91ErrCodeHT.Add("550","要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)");
92ErrCodeHT.Add("451","放弃要求的操作;处理过程中出错");
93ErrCodeHT.Add("551","用户非本地,请尝试<forward-path>");
94ErrCodeHT.Add("452","系统存储不足,要求的操作未执行");
95ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行");
96ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)");
97ErrCodeHT.Add("432","需要一个密码转换");
98ErrCodeHT.Add("534","认证机制过于简单");
99ErrCodeHT.Add("538","当前请求的认证机制需要加密");
100ErrCodeHT.Add("454","临时认证失败");
101ErrCodeHT.Add("530","需要认证");
102
103RightCodeHT.Add("220","服务就绪");
104RightCodeHT.Add("250","要求的邮件操作完成");
105RightCodeHT.Add("251","用户非本地,将转发向<forward-path>");
106RightCodeHT.Add("354","开始邮件输入,以<enter>.<enter>结束");
107RightCodeHT.Add("221","服务关闭传输信道");
108RightCodeHT.Add("334","服务器响应验证Base64字符串");
109RightCodeHT.Add("235","验证成功");
110}
111
112
113/// <summary>
114/// 将字符串编码为Base64字符串
115/// </summary>
116/// <param name="str"/>要编码的字符串
117private string Base64Encode(string str)
118{
119byte[] barray;
120barray=Encoding.Default.GetBytes(str);
121return Convert.ToBase64String(barray);
122}
123
124
125/// <summary>
126/// 将Base64字符串解码为普通字符串
127/// </summary>
128/// <param name="str"/>要解码的字符串
129private string Base64Decode(string str)
130{
131byte[] barray;
132barray=Convert.FromBase64String(str);
133return Encoding.Default.GetString(barray);
134}
135
136
137/// <summary>
138/// 得到上传附件的文件流
139/// </summary>
140/// <param name="FilePath"/>附件的绝对路径
141private string GetStream(string FilePath)
142{
143//建立文件流对象
144System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open);
145byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)];
146FileStr.Read(by,0,by.Length);
147FileStr.Close();
148return(System.Convert.ToBase64String(by));
149}
150
151/// <summary>
152/// 发送SMTP命令
153/// </summary>
154private bool SendCommand(string str)
155{
156byte[] WriteBuffer;
157if(str==null||str.Trim()==String.Empty)
158{
159return true;
160}
161logs+=str;
162WriteBuffer = Encoding.Default.GetBytes(str);
163try
164{
165ns.Write(WriteBuffer,0,WriteBuffer.Length);
166}
167catch
168{
169errmsg="网络连接错误";
170return false;
171}
172return true;
173}
174
175/// <summary>
176/// 接收SMTP服务器回应
177/// </summary>
178private string RecvResponse()
179{
180int StreamSize;
181string ReturnValue = String.Empty;
182byte[] ReadBuffer = new byte[1024] ;
183try
184{
185StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length);
186}
187catch
188{
189errmsg="网络连接错误";
190return "false";
191}
192
193if (StreamSize==0)
194{
195return ReturnValue ;
196}
197else
198{
199ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);
200logs+=ReturnValue+this.enter;
201return ReturnValue;
202}
203}
204
205/// <summary>
206/// 与服务器交互,发送一条命令并接收回应。
207/// </summary>
208/// <param name="str"/>一个要发送的命令
209/// <param name="errstr"/>如果错误,要反馈的信息
210private bool Dialog(string str,string errstr)
211{
212if(str==null||str.Trim()=="")
213{
214return true;
215}
216if(SendCommand(str))
217{
218string RR=RecvResponse();
219if(RR=="false")
220{
221return false;
222}
223string RRCode=RR.Substring(0,3);
224if(RightCodeHT[RRCode]!=null)
225{
226return true;
227}
228else
229{
230if(ErrCodeHT[RRCode]!=null)
231{
232errmsg+=(RRCode+ErrCodeHT[RRCode].ToString());
233errmsg+=enter;
234}
235else
236{
237errmsg+=RR;
238}
239errmsg+=errstr;
240return false;
241}
242}
243else
244{
245return false;
246}
247
248}
249
250
251/// <summary>
252/// 与服务器交互,发送一组命令并接收回应。
253/// </summary>
254
255private bool Dialog(string[] str,string errstr)
256{
257for(int i=0;i<str.length;i++) <summary="" errmsg+="errstr;" false;="" if(!dialog(str[i],""))="" return="" true;="" {="" }="">
258/// SendEmail
259///
260/// <returns></returns>
261private bool SendEmail()
262{
263//连接网络
264try
265{
266tc=new TcpClient(mailserver,mailserverport);
267}
268catch(Exception e)
269{
270errmsg=e.ToString();
271return false;
272}
273
274ns = tc.GetStream();
275SMTPCodeAdd();
276
277//验证网络连接是否正确
278if(RightCodeHT[RecvResponse().Substring(0,3)]==null)
279{
280errmsg="网络连接失败";
281return false;
282}
283
284
285string[] SendBuffer;
286string SendBufferstr;
287
288//进行SMTP验证
289if(ESmtp)
290{
291SendBuffer=new String[4];
292SendBuffer[0]="EHLO " + mailserver + enter;
293SendBuffer[1]="AUTH LOGIN" + enter;
294SendBuffer[2]=Base64Encode(username) + enter;
295SendBuffer[3]=Base64Encode(password) + enter;
296if(!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。"))
297return false;
298}
299else
300{
301SendBufferstr="HELO " + mailserver + enter;
302if(!Dialog(SendBufferstr,""))
303return false;
304}
305
306//
307SendBufferstr="MAIL FROM:<" + From + ">" + enter;
308if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空"))
309return false;
310
311//
312SendBuffer=new string[recipientmaxnum];
313for(int i=0;i<recipient.count;i++) +="" +"="" recipient[i].tostring()="" sendbuffer[i]="RCPT TO:<" {="">" + enter;
314
315}
316if(!Dialog(SendBuffer,"收件人地址有误"))
317return false;
318
319/*
320SendBuffer=new string[10];
321for(int i=0;i<recipientbcc.count;i++) +="" +"="" recipientbcc[i].tostring()="" sendbuffer[i]="RCPT TO:<" {="">" + enter;
322
323}
324
325if(!Dialog(SendBuffer,"密件收件人地址有误"))
326return false;
327*/
328SendBufferstr="DATA" + enter;
329if(!Dialog(SendBufferstr,""))
330return false;
331
332SendBufferstr="From:" + FromName + "<" + From +">" +enter;
333
334//if(ReplyTo.Trim()!="")
335//{
336// SendBufferstr+="Reply-To: " + ReplyTo + enter;
337//}
338
339//SendBufferstr+="To:" + RecipientName + "<" + Recipient[0] +">" +enter;
340SendBufferstr += "To:=?"+Charset.ToUpper()+"?B?"+Base64Encode(RecipientName)+"?="+"<"+Recipient[0]
341
342+">"+enter;
343
344SendBufferstr+="CC:";
345for(int i=0;i<recipient.count;i++) "<"="" +="" +"="" recipient[i].tostring()="" sendbufferstr+="Recipient[i].ToString()" {="">,";
346}
347SendBufferstr+=enter;
348
349SendBufferstr+=((Subject==String.Empty || Subject==null)?"Subject:":((Charset=="")?("Subject:" +
350
351Subject):("Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) +"?="))) + enter;
352SendBufferstr+="X-Priority:" + priority + enter;
353SendBufferstr+="X-MSMail-Priority:" + priority + enter;
354SendBufferstr+="Importance:" + priority + enter;
355SendBufferstr+="X-Mailer: Lion.Web.Mail.SmtpMail Pubclass [cn]" + enter;
356SendBufferstr+="MIME-Version: 1.0" + enter;
357if(Attachments.Count!=0)
358{
359SendBufferstr+="Content-Type: multipart/mixed;" + enter;
360SendBufferstr += " boundary=\"====="+
361
362(Html?"001_Dragon520636771063_":"001_Dragon303406132050_")+"=====\""+enter+enter;
363}
364
365if(Html)
366{
367if(Attachments.Count==0)
368{
369SendBufferstr += "Content-Type: multipart/alternative;"+enter;//内容格式和分隔符
370SendBufferstr += " boundary=\"=====003_Dragon520636771063_=====\""+enter+enter;
371
372SendBufferstr += "This is a multi-part message in MIME format."+enter+enter;
373}
374else
375{
376SendBufferstr +="This is a multi-part message in MIME format."+enter+enter;
377SendBufferstr += "--=====001_Dragon520636771063_====="+enter;
378SendBufferstr += "Content-Type: multipart/alternative;"+enter;//内容格式和分隔符
379SendBufferstr += " boundary=\"=====003_Dragon520636771063_=====\""+enter+enter;
380
381
382}
383SendBufferstr += "--=====003_Dragon520636771063_====="+enter;
384SendBufferstr += "Content-Type: text/plain;"+ enter;
385SendBufferstr += ((Charset=="")?(" charset=\"iso-8859-1\""):(" charset=\"" +
386
387Charset.ToLower() + "\"")) + enter;
388SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter;
389SendBufferstr+= Base64Encode("邮件内容为HTML格式,请选择HTML方式查看") + enter + enter;
390
391SendBufferstr += "--=====003_Dragon520636771063_====="+enter;
392
393SendBufferstr+="Content-Type: text/html;" + enter;
394SendBufferstr+=((Charset=="")?(" charset=\"iso-8859-1\""):(" charset=\"" +
395
396Charset.ToLower() + "\"")) + enter;
397SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter;
398SendBufferstr+= Base64Encode(Body) + enter + enter;
399SendBufferstr += "--=====003_Dragon520636771063_=====--"+enter;
400}
401else
402{
403if(Attachments.Count!=0)
404{
405SendBufferstr += "--=====001_Dragon303406132050_====="+enter;
406}
407SendBufferstr+="Content-Type: text/plain;" + enter;
408SendBufferstr+=((Charset=="")?(" charset=\"iso-8859-1\""):(" charset=\"" +
409
410Charset.ToLower() + "\"")) + enter;
411SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter;
412SendBufferstr+= Base64Encode(Body) + enter;
413}
414
415//SendBufferstr += "Content-Transfer-Encoding: base64"+enter;
416
417
418if(Attachments.Count!=0)
419{
420for(int i=0;i<attachments.count;i++) "."="" #endregion="" #region="" (filepath.substring(filepath.lastindexof("="" (html?"001_dragon520636771063_":"001_dragon303406132050_")="" *="" +="" +"='--"+enter+enter;' +enter;="" ;="" <summary="" =?"+charset.toupper()+"?b?"+base64encode="" \\\")+1))+"?='\""+enter+enter' application="" content-type:="" enter;="" false;="" filepath="(string)Attachments[i];" if(!dialog(sendbufferstr,"断开连接时错误"))="" if(!dialog(sendbufferstr,"错误信件信息"))="" ns.close();="" octet-stream"+enter;="" return="" sendbufferstr="QUIT" string="" tc.close();="" true;="" {="" }="">
421/// 添加一个密件收件人
422///
423/// <param name="str"/>收件人地址
424public bool AddRecipientBCC(string str)
425{
426if(str==null||str.Trim()=="")
427return true;
428if(RecipientBCCNum<10)
429{
430RecipientBCC.Add(RecipientBCCNum,str);
431RecipientBCCNum++;
432return true;
433}
434else
435{
436errmsg+="收件人过多";
437return false;
438}
439}
440
441
442/// <summary>
443/// 添加一组密件收件人(不超过10个),参数为字符串数组
444/// </summary>
445/// <param name="str"/>保存有收件人地址的字符串数组(不超过10个)
446public bool AddRecipientBCC(string[] str)
447{
448for(int i=0;i<str.Length;i++)
449{
450if(!AddRecipientBCC(str[i]))
451{
452return false;
453}
454}
455return true;
456}
457
458*/
459#endregion
460}
461
462#endregion
463}</attachments.count;i++)></recipient.count;i++)></recipientbcc.count;i++)></recipient.count;i++)></str.length;i++)></enter></enter></forward-path></forward-path></recipientmaxnum)></recipients.length;i++)></filepath.length;i++)>