-
ใช้ระบบ;
ใช้ System.Collections.Generic;
ใช้ System.Net.Sockets;
ใช้ System.IO;
ใช้ System.Text;
ใช้ System.Collections;
MailSender คลาสสาธารณะ
-
/// <สรุป>
/// SMTP 服务器域名
/// </สรุป>
เซิร์ฟเวอร์สตริงสาธารณะ
-
รับ { เซิร์ฟเวอร์ส่งคืน; -
ตั้งค่า { ถ้า (ค่า != เซิร์ฟเวอร์) เซิร์ฟเวอร์ = ค่า; -
} เซิร์ฟเวอร์สตริงส่วนตัว = "";
/// <สรุป>
/// SMTP 服务器端口 [默认为25]
/// </สรุป>
ท่าเรืออินท์สาธารณะ
-
รับ { พอร์ตส่งคืน; -
ตั้งค่า { ถ้า (ค่า != พอร์ต) พอร์ต = ค่า; -
} พอร์ต int ส่วนตัว = 25;
/// <สรุป>
/// 用户名 [如果需要身份验证的话]
/// </สรุป>
ชื่อผู้ใช้สตริงสาธารณะ
-
รับ { ส่งคืนชื่อผู้ใช้; -
ตั้งค่า { ถ้า (ค่า != ชื่อผู้ใช้) ชื่อผู้ใช้ = ค่า; -
} } ชื่อผู้ใช้สตริงส่วนตัว = "";
/// <สรุป>
/// 密码 [如果需要身份验证的话]
/// </สรุป>
รหัสผ่านสตริงสาธารณะ
-
รับ { ส่งคืนรหัสผ่าน; -
ตั้งค่า { ถ้า (ค่า != รหัสผ่าน) รหัสผ่าน = ค่า; -
} รหัสผ่านสตริงส่วนตัว = "";
/// <สรุป>
/// 发件人地址
/// </สรุป>
สตริงสาธารณะจาก
-
รับ { กลับจาก; -
ตั้งค่า { ถ้า (ค่า != จาก) จาก = ค่า; -
} สตริงส่วนตัวจาก = "";
/// <สรุป>
/// 收件人地址
/// </สรุป>
สตริงสาธารณะถึง
-
รับ { กลับไปที่; -
ตั้งค่า { ถ้า (ค่า != ถึง) เป็น = ค่า; -
} สตริงส่วนตัวถึง = "";
/// <สรุป>
/// 发件人姓名
/// </สรุป>
สตริงสาธารณะ FromName
-
รับ { กลับจากชื่อ; -
ตั้งค่า { ถ้า (ค่า != fromName) fromName = ค่า; -
} สตริงส่วนตัว fromName = "";
/// <สรุป>
/// 收件人姓名
/// </สรุป>
สตริงสาธารณะ ToName
-
รับ { กลับไปที่ชื่อ; -
ตั้งค่า { ถ้า (ค่า != toName) toName = value; -
} } สตริงส่วนตัว toName = "";
/// <สรุป>
/// 邮件的主题
/// </สรุป>
เรื่องสตริงสาธารณะ
-
รับ { คืนหัวเรื่อง; -
ตั้ง { ถ้า (ค่า != เรื่อง) เรื่อง = ค่า; -
} หัวข้อสตริงส่วนตัว = "";
/// <สรุป>
/// 邮件正文
/// </สรุป>
เนื้อความสตริงสาธารณะ
-
รับ { คืนเนื้อหา; -
ตั้งค่า { ถ้า (ค่า != body) body = value; -
} เนื้อความสตริงส่วนตัว = "";
/// <สรุป>
/// 超文本格式的邮件正文
/// </สรุป>
สตริงสาธารณะ HtmlBody
-
รับ { กลับ htmlBody; -
set { if (value != htmlBody) htmlBody = value; -
} สตริงส่วนตัว htmlBody = "";
/// <สรุป>
/// 是否是html格式的邮件
/// </สรุป>
บูลสาธารณะ IsHtml
-
รับ { กลับ isHtml; -
ตั้ง { ถ้า (ค่า != isHtml) isHtml = ค่า; -
} บูลส่วนตัว isHtml = false;
/// <สรุป>
/// 语言编码 [默认为GB2312]
/// </สรุป>
LanguageEncoding สตริงสาธารณะ
-
รับ { กลับภาษาการเข้ารหัส; -
ตั้งค่า { ถ้า (ค่า != languageEncoding) languageEncoding = ค่า; -
} } languageEncoding สตริงส่วนตัว = "GB2312";
/// <สรุป>
/// 邮件编码 [默认为8bit]
/// </สรุป>
MailEncoding สตริงสาธารณะ
-
รับ { ส่งคืนการเข้ารหัส; -
ตั้งค่า { ถ้า (ค่า != การเข้ารหัส) การเข้ารหัส = ค่า; -
} การเข้ารหัสสตริงส่วนตัว = "8bit";
/// <สรุป>
/// 邮件优先级 [默认为3]
/// </สรุป>
ลำดับความสำคัญ int สาธารณะ
-
รับ { ลำดับความสำคัญในการส่งคืน; -
ตั้งค่า { ถ้า (ค่า != ลำดับความสำคัญ) ลำดับความสำคัญ = ค่า; -
} ลำดับความสำคัญ int ส่วนตัว = 3;
/// <สรุป>
/// 附件 [ข้อมูลเอกสารแนบ]
/// </สรุป>
ไฟล์แนบ IList สาธารณะ
-
รับ { ส่งคืนไฟล์แนบ; -
// set { ถ้า (ค่า != ไฟล์แนบ) ไฟล์แนบ = ค่า; -
} ไฟล์แนบ ArrayList ส่วนตัว = new ArrayList();
/// <สรุป>
/// 发送邮件
/// </สรุป>
โมฆะสาธารณะ SendMail()
-
// 创建TcpClient对象, 并建立连接
TcpClient tcp = null;
พยายาม
-
tcp = TcpClient ใหม่ (เซิร์ฟเวอร์, พอร์ต);
-
catch (ข้อยกเว้น เช่น)
-
สตริงผิดพลาด = อดีตข้อความ;
โยนข้อยกเว้นใหม่ ("无法连接服务器");
-
ReadString(tcp.GetStream());//获取连接信息
// ขยาย始进行服务器认证
// 如果状态码是250则表示操作成功
ถ้า (!Command(tcp.GetStream(), "EHLO Localhost", "250"))
โยนข้อยกเว้นใหม่ ("登陆阶段失败");
ถ้า (ชื่อผู้ใช้ != "")
-
// 需要身份验证
ถ้า (!Command(tcp.GetStream(), "เข้าสู่ระบบอัตโนมัติ", "334"))
โยนข้อยกเว้นใหม่ ("身份验证阶段失败");
สตริง nameB64 = ToBase64 (ชื่อผู้ใช้); // 此处将ชื่อผู้ใช้转换为Base64码
ถ้า (!Command(tcp.GetStream(), nameB64, "334"))
โยนข้อยกเว้นใหม่ ("身份验证阶段失败");
สตริง passB64 = ToBase64 (รหัสผ่าน); // 此处将รหัสผ่าน转换为Base64码
ถ้า (!Command(tcp.GetStream(), passB64, "235"))
โยนข้อยกเว้นใหม่ ("身份验证阶段失败");
-
// 准备发送
WriteString(tcp.GetStream(), "เมลจาก: " + จาก);
WriteString(tcp.GetStream(), "rcpt ถึง: " + ถึง);
WriteString(tcp.GetStream(), "ข้อมูล");
// 发送邮件头
WriteString(tcp.GetStream(), "วันที่: " + DateTime.Now); // 时间
WriteString(tcp.GetStream(), "จาก: " + fromName + "<" + จาก + ">"); // 发件人
WriteString(tcp.GetStream(), "เรื่อง: " + หัวเรื่อง); // 主题
WriteString(tcp.GetStream(), "ถึง:" + toName + "<" + ถึง + ">"); // 收件人
//邮件格式
WriteString(tcp.GetStream(), "ประเภทเนื้อหา: หลายส่วน/ผสม; boundary="unique-boundary-1"");
WriteString(tcp.GetStream(), "ตอบกลับ:" + จาก); // 回复地址
WriteString(tcp.GetStream(), "X-ลำดับความสำคัญ:" + ลำดับความสำคัญ); // 优先级
WriteString(tcp.GetStream(), "MIME-เวอร์ชัน:1.0"); // MIME 版本
// 数据ID,随意
// WriteString (tcp.GetStream(), "รหัสข้อความ: " + DateTime.Now.ToFileTime() + "@security.com ");
WriteString(tcp.GetStream(), "การเข้ารหัสการถ่ายโอนเนื้อหา:" + การเข้ารหัส); // 内容编码
WriteString(tcp.GetStream(), "X-Mailer:JcPersonal.Utility.MailSender"); // 邮件发送者
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), ToBase64("นี่คือข้อความหลายส่วนในรูปแบบ MIME"));
WriteString(tcp.GetStream(), "");
// 从此处เปิด始进行分隔输入
WriteString(tcp.GetStream(), "--unique-boundary-1");
// 在此处定义第二个分隔符
WriteString(tcp.GetStream(), "ประเภทเนื้อหา: หลายส่วน/ทางเลือก;ขอบเขต="unique-boundary-2"");
WriteString(tcp.GetStream(), "");
ถ้า (!isHtml)
-
// 文本信息
WriteString(tcp.GetStream(), "--unique-boundary-2");
WriteString(tcp.GetStream(), "ประเภทเนื้อหา: text/plain;charset=" + languageEncoding);
WriteString(tcp.GetStream(), "การเข้ารหัสการถ่ายโอนเนื้อหา:" + การเข้ารหัส);
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), เนื้อความ);
WriteString(tcp.GetStream(), "");//หนึ่งรายการ
WriteString(tcp.GetStream(), "--unique-boundary-2--");//分隔符的结束符号,尾巴后的多了--
WriteString(tcp.GetStream(), "");
-
อื่น
-
//html 信息
WriteString(tcp.GetStream(), "--unique-boundary-2");
WriteString(tcp.GetStream(), "ประเภทเนื้อหา: text/html;charset=" + languageEncoding);
WriteString(tcp.GetStream(), "การเข้ารหัสการถ่ายโอนเนื้อหา:" + การเข้ารหัส);
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), htmlBody);
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), "--unique-boundary-2--");//分隔符的结束符号,尾巴后的多了--
WriteString(tcp.GetStream(), "");
-
// 发送附件
// 对文件列表做循环
สำหรับ (int i = 0; i < attachments.Count; i++)
-
WriteString(tcp.GetStream(), "--unique-boundary-1"); // 邮件内容分隔符
WriteString(tcp.GetStream(), "ประเภทเนื้อหา: application/octet-stream;name="" + ((AttachmentInfo)ไฟล์แนบ[i]).FileName + """); // 文件格式
WriteString(tcp.GetStream(), "การเข้ารหัสการถ่ายโอนเนื้อหา: base64"); // 内容的编码
WriteString(tcp.GetStream(), "การจัดการเนื้อหา:ไฟล์แนบ;ชื่อไฟล์="" + ((AttachmentInfo)ไฟล์แนบ[i]).ชื่อไฟล์ + """); // 文件名
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), ((AttachmentInfo)สิ่งที่แนบมา[i]).Bytes); // 写入文件的内容
WriteString(tcp.GetStream(), "");
-
คำสั่ง(tcp.GetStream(), ".", "250"); // 最后写完了,输入"."
// 关闭连接
tcp.ปิด();
-
/// <สรุป>
/// 向流中写入字符
/// </สรุป>
/// <param name="netStream">ชื่อ TcpClient </param>
/// <param name="str">写入的字符</param>
โมฆะที่ได้รับการป้องกัน WriteString (NetworkStream netStream, สตริง str)
-
STR = STR + " "; // 加入换行符
// 将命令行转化为ไบต์[]
ไบต์[] bWrite = Encoding.GetEncoding(ภาษาการเข้ารหัส).GetBytes(str.ToCharArray());
// 由于每次写入的数据大度定在75个字节,一旦命令长度超过了75,就分步写入。
int เริ่มต้น = 0;
int length = bWrite.Length;
หน้า int = 0;
ขนาด int = 75;
จำนวน int = ขนาด;
พยายาม
-
ถ้า (ความยาว > 75)
-
// 数据分页
ถ้า ((ความยาว / ขนาด) * ขนาด < ความยาว)
หน้า = ความยาว / ขนาด + 1;
อื่น
หน้า = ความยาว / ขนาด;
สำหรับ (int i = 0; i < หน้า; i++)
-
เริ่มต้น = i * ขนาด;
ถ้า (i == หน้า - 1)
นับ = ความยาว - (i * ขนาด);
netStream.Write(bWrite, เริ่ม, นับ);// 将数据写入到服务器上
-
-
อื่น
netStream.Write (bWrite, 0, bWrite.Length);
-
จับ (ข้อยกเว้น)
-
// 忽略错误
-
-
/// <สรุป>
/// 从流中读取字符
/// </สรุป>
/// <param name="netStream">ชื่อ TcpClient </param>
/// <returns>读取的字符</returns>
สตริงที่ได้รับการป้องกัน ReadString (NetworkStream netStream)
-
สตริง sp = null;
ไบต์ [] โดย = ไบต์ใหม่ [1024];
int size = netStream.Read(by, 0, by.Length);// 读取数据流
ถ้า (ขนาด > 0)
-
sp = Encoding.Default.GetString(by);// สตริงสตริง
-
กลับ sp;
-
/// <สรุป>
/// 发出命令并判断返回信息是否正确
/// </สรุป>
/// <param name="netStream">ชื่อ TcpClient </param>
/// <param name="command">命令</param>
/// <param name="state">正确的状态码</param>
/// <returns>是否正确</returns>
คำสั่งบูลที่ได้รับการป้องกัน (NetworkStream netStream, คำสั่งสตริง, สถานะสตริง)
-
สตริง sp = null;
บูลสำเร็จ = เท็จ;
พยายาม
-
WriteString(netStream, command);// 写入命令
sp = ReadString(netStream);// 接受返回信息
if (sp.IndexOf(state) != -1)// 判断状态码是否正确
ความสำเร็จ = จริง;
-
จับ (ข้อยกเว้น)
-
// 忽略错误
-
คืนความสำเร็จ;
-
/// <สรุป>
/// 字符串编码为Base64
/// </สรุป>
/// <param name="str">字符串</param>
/// <returns>Base64编码的字符串</returns>
สตริงที่ได้รับการป้องกัน ToBase64 (สตริง str)
-
พยายาม
-
ไบต์ [] โดย = Encoding.Default.GetBytes(str.ToCharArray());
str = Convert.ToBase64String (โดย);
-
จับ (ข้อยกเว้น)
-
// 忽略错误
-
กลับ STR;
-
/// <สรุป>
/// 附件信息
/// </สรุป>
เอกสารแนบโครงสร้างสาธารณะ
-
/// <สรุป>
/// 附件的文件名 [如果输入路径,则自动转换为文件名]
/// </สรุป>
ชื่อไฟล์สตริงสาธารณะ
-
รับ { ชื่อไฟล์ส่งคืน; -
ตั้ง { ชื่อไฟล์ = Path.GetFileName (ค่า); -
} ชื่อไฟล์สตริงส่วนตัว;
/// <สรุป>
/// 附件的内容 [由经Base64编码的字节组成]
/// </สรุป>
ไบต์สตริงสาธารณะ
-
รับ { ไบต์ส่งคืน; -
ตั้งค่า { ถ้า (ค่า != ไบต์) ไบต์ = ค่า; -
} ไบต์สตริงส่วนตัว;
/// <สรุป>
/// 从流中读取附件内容并构造
/// </สรุป>
/// <param name="ifileName">附件的文件名</param>
/// <param name="stream">流</param>
AttachmentInfo สาธารณะ (สตริง ifileName, สตรีมสตรีม)
-
fileName = Path.GetFileName(ifileName);
ไบต์ [] โดย = ไบต์ใหม่ [stream.Length];
stream.Read (โดย, 0, (int) stream.Length); // 读取文件内容
//格式转换
ไบต์ = Convert.ToBase64String (โดย); // 转化为base64编码
-
/// <สรุป>
/// 按foto给定的字节构造附件
/// </สรุป>
/// <param name="ifileName">附件的文件名</param>
/// <param name="ibytes">附件的内容 [字节]</param>
เอกสารแนบสาธารณะ (สตริง ifileName, ไบต์ [] ibytes)
-
fileName = Path.GetFileName(ifileName);
ไบต์ = Convert.ToBase64String (ibytes); // 转化为base64编码
-
/// <สรุป>
/// 从文件载入并构造
/// </สรุป>
/// <ชื่อพารามิเตอร์ = "เส้นทาง" ></ พารามิเตอร์>
เอกสารแนบสาธารณะ (เส้นทางสตริง)
-
ชื่อไฟล์ = Path.GetFileName (เส้นทาง);
ไฟล์ FileStream = FileStream ใหม่ (เส้นทาง, FileMode.Open);
ไบต์ [] โดย = ไบต์ใหม่ [file.Length];
file.Read (โดย, 0, (int) file.Length); // 读取文件内容
//格式转换
ไบต์ = Convert.ToBase64String (โดย); // 转化为base64编码
ไฟล์.ปิด();
-
-