-
시스템 사용;
System.Collections.Generic을 사용합니다.
System.Net.Sockets 사용;
System.IO 사용;
System.Text 사용;
System.Collections 사용;
공개 클래스 MailSender
{
/// <요약>
/// SMTP 서비스 이름
/// </summary>
공개 문자열 서버
{
get {반환 서버; }
set { if (값 != 서버) 서버 = 값; }
} 개인 문자열 서버 = "";
/// <요약>
/// SMTP服务器端口 [默认为25]
/// </summary>
공개 int 포트
{
get {반환 포트; }
set { if (값 != 포트) 포트 = 값; }
} 개인 int 포트 = 25;
/// <요약>
/// 사용 이름 [如果需要身份验证的话]
/// </summary>
공개 문자열 사용자 이름
{
get { 반환 사용자 이름; }
set { if (value != userName) userName = value; }
} 개인 문자열 userName = "";
/// <요약>
/// 密码 [如果需要身份验证的话]
/// </summary>
공개 문자열 비밀번호
{
{ 비밀번호 반환; }
set { if (값 != 비밀번호) 비밀번호 = 값; }
} 개인 문자열 비밀번호 = "";
/// <요약>
/// 发件人地址
/// </summary>
공개 문자열 보낸 사람
{
{에서 돌아오다; }
set { if (value != from) from = value; }
} = ""의 개인 문자열;
/// <요약>
/// 收件人地址
/// </summary>
공개 문자열 받는 사람
{
get {돌아가다; }
set { if (value != to) to = 값; }
} 개인 문자열 = "";
/// <요약>
/// 发件人姓명
/// </summary>
공개 문자열 FromName
{
get { return fromName; }
set { if (value != fromName) fromName = value; }
} 개인 문자열 fromName = "";
/// <요약>
/// 收件人姓이름
/// </summary>
공개 문자열 ToName
{
get {이름으로 돌아가기; }
set { if (value != toName) toName = value; }
} 개인 문자열 toName = "";
/// <요약>
/// 당신의 주인님
/// </summary>
공개 문자열 제목
{
get { 반환 제목; }
set { if (값 != 주제) 주제 = 값; }
} 비공개 문자열 제목 = "";
/// <요약>
/// 邮件정문
/// </summary>
공개 문자열 본문
{
get { 반환 본문; }
set { if (value != body) body = 값; }
} 개인 문자열 본문 = "";
/// <요약>
/// 超文本格式的邮件正文
/// </summary>
공개 문자열 HtmlBody
{
get { return htmlBody; }
set { if (값 != htmlBody) htmlBody = 값; }
} 비공개 문자열 htmlBody = "";
/// <요약>
/// 是否是html格式的邮件
/// </summary>
공개 부울 IsHtml
{
get { return isHtml; }
set { if (값 != isHtml) isHtml = 값; }
} 개인 bool isHtml = false;
/// <요약>
/// 语言编码 [默认为GB2312]
/// </summary>
공개 문자열 LanguageEncoding
{
get { 반환 언어 인코딩; }
set { if (값 != 언어Encoding) 언어Encoding = 값; }
} 개인 문자열 언어Encoding = "GB2312";
/// <요약>
/// 邮件编码 [默认为8bit]
/// </summary>
공개 문자열 MailEncoding
{
get { 반환 인코딩; }
set { if (값 != 인코딩) 인코딩 = 값; }
} 비공개 문자열 인코딩 = "8비트";
/// <요약>
/// 邮件优先级 [默认为3]
/// </summary>
공개 정수 우선순위
{
get { 우선순위 반환; }
set { if (값 != 우선순위) 우선순위 = 값; }
} 비공개 int 우선순위 = 3;
/// <요약>
/// 附件 [첨부정보]
/// </summary>
공개 IList 첨부 파일
{
{첨부 파일 반환; }
// 설정 { if (value != attachments) attachments = value; }
} 개인 ArrayList 첨부 파일 = new ArrayList();
/// <요약>
/// 发送邮件
/// </summary>
공개 무효 SendMail()
{
// 创建TcpClient对象, 并建立连接
TcpClient tcp = null;
노력하다
{
tcp = new TcpClient(서버, 포트);
}
잡기 (예외예외)
{
문자열 오류 = ex.메시지;
새로운 예외를 발생시킵니다("无法连接服务器");
}
ReadString(tcp.GetStream());//获取连接信息
// 开始进行服务器认证
// 如果状态码是250则表示操작성功
if (!Command(tcp.GetStream(), "EHLO Localhost", "250"))
새로운 예외를 발생시킵니다("登陆阶段失败");
if (사용자 이름 != "")
{
// 需要身份验证
if (!Command(tcp.GetStream(), "인증 로그인", "334"))
새로운 예외를 발생시킵니다("身份验证阶段失败");
문자열 이름B64 = ToBase64(사용자 이름); // 此处将사용자 이름转换为Base64码
if (!Command(tcp.GetStream(), nameB64, "334"))
새로운 예외를 발생시킵니다("身份验证阶段失败");
string passB64 = ToBase64(비밀번호); // 此处将password转换为Base64码
if (!Command(tcp.GetStream(), passB64, "235"))
새로운 예외를 발생시킵니다("身份验证阶段失败");
}
//准备发送
WriteString(tcp.GetStream(), "메일 보낸 사람: " + from);
WriteString(tcp.GetStream(), "rcpt to: " + to);
WriteString(tcp.GetStream(), "데이터");
// 发送邮件头
WriteString(tcp.GetStream(), "날짜: " + DateTime.Now); // 时间
WriteString(tcp.GetStream(), "From: " + fromName + "<" + from + ">"); // 发件人
WriteString(tcp.GetStream(), "제목: " + 제목); //주님
WriteString(tcp.GetStream(), "받는 사람:" + toName + "<" + to + ">"); // 收件人
//邮件格式
WriteString(tcp.GetStream(), "Content-Type: 다중 부분/혼합; 경계="unique-boundary-1"");
WriteString(tcp.GetStream(), "회신 대상:" + from); //回复地址
WriteString(tcp.GetStream(), "X 우선순위:" + 우선순위); // 优先级
WriteString(tcp.GetStream(), "MIME 버전:1.0"); // MIME 종류
// 数据ID,随의
// WriteString (tcp.GetStream(), "Message-Id: " + 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");
// 현재 此处定义第 2个分隔符
WriteString(tcp.GetStream(), "Content-Type: multipart/alternative;Boundary="unique-boundary-2"");
WriteString(tcp.GetStream(), "");
만약 (!isHtml)
{
// 文本信息
WriteString(tcp.GetStream(), "--unique-boundary-2");
WriteString(tcp.GetStream(), "Content-Type: text/plain;charset=" + 언어Encoding);
WriteString(tcp.GetStream(), "콘텐츠 전송 인코딩:" + 인코딩);
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), body);
WriteString(tcp.GetStream(), "");//일부분할
WriteString(tcp.GetStream(), "--unique-boundary-2--");//분할하기
WriteString(tcp.GetStream(), "");
}
또 다른
{
//html信息
WriteString(tcp.GetStream(), "--unique-boundary-2");
WriteString(tcp.GetStream(), "Content-Type: text/html;charset=" + 언어Encoding);
WriteString(tcp.GetStream(), "콘텐츠 전송 인코딩:" + 인코딩);
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), htmlBody);
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), "--unique-boundary-2--");//분할하기
WriteString(tcp.GetStream(), "");
}
// 发送附件
// 对文件列表做循环
for (int i = 0; i < attachments.Count; i++)
{
WriteString(tcp.GetStream(), "--unique-boundary-1"); // 邮件内容分隔符
WriteString(tcp.GetStream(), "콘텐츠 유형: 애플리케이션/옥텟-스트림;이름="" + ((AttachmentInfo)attachments[i]).FileName + """); // 文件格式
WriteString(tcp.GetStream(), "콘텐츠 전송 인코딩: base64"); // 内容的编码
WriteString(tcp.GetStream(), "Content-Disposition:attachment;filename="" + ((AttachmentInfo)attachments[i]).FileName + """); // 문명
WriteString(tcp.GetStream(), "");
WriteString(tcp.GetStream(), ((AttachmentInfo)attachments[i]).Bytes); // 写入文件의 内容
WriteString(tcp.GetStream(), "");
}
Command(tcp.GetStream(), ".", "250"); // 最后写完了,输入"."
// 关闭连接
tcp.닫기();
}
/// <요약>
/// 向流中写入字符
/// </summary>
/// <param name="netStream">来自TcpClient의 흐름</param>
/// <param name="str">다른 이름</param>
protected void WriteString(NetworkStream netStream, 문자열 str)
{
str = str + " "; // 加入换行符
// 将命令行转化为byte[]
byte[] bWrite = Encoding.GetEncoding(언어Encoding).GetBytes(str.ToCharArray());
// 由于每次写入的数据大小是는 매우 다양하고, 우리는 7五个字节, 一旦命令长德超过了7五,就分步写入。
int 시작 = 0;
정수 길이 = bWrite.Length;
정수 페이지 = 0;
정수 크기 = 75;
정수 개수 = 크기;
노력하다
{
if (길이 > 75)
{
// 数据分页
if ((길이 / 크기) * 크기 < 길이)
페이지 = 길이 / 크기 + 1;
또 다른
페이지 = 길이 / 크기;
for (int i = 0; i < 페이지; i++)
{
시작 = i * 크기;
if (i == 페이지 - 1)
개수 = 길이 - (i * 크기);
netStream.Write(bWrite, start, count);// 将数据写入到服务器上
}
}
또 다른
netStream.Write(bWrite, 0, bWrite.Length);
}
잡기 (예외)
{
// 忽略错误
}
}
/// <요약>
/// 从流中读取字符
/// </summary>
/// <param name="netStream">来自TcpClient의 흐름</param>
/// <returns>설명의 문자</returns>
보호된 문자열 ReadString(NetworkStream netStream)
{
문자열 sp = null;
바이트[] by = 새 바이트[1024];
int size = netStream.Read(by, 0, by.Length);// 读取数据流
만약 (크기 > 0)
{
sp = Encoding.Default.GetString(by);// 문자열화
}
sp를 반환;
}
/// <요약>
/// 发出命令并判断返回信息是否正确
/// </summary>
/// <param name="netStream">来自TcpClient의 흐름</param>
/// <param name="command">명령어</param>
/// <param name="state">정확한 정보</param>
/// <returns>是否정류</returns>
protected bool Command(NetworkStream netStream, 문자열 명령, 문자열 상태)
{
문자열 sp = null;
부울 성공 = 거짓;
노력하다
{
WriteString(netStream, command);// 写入命令
sp = ReadString(netStream);// 接受返回信息
if (sp.IndexOf(state) != -1)// 判断状态码是否正确
성공 = 사실;
}
잡기 (예외)
{
// 忽略错误
}
성공을 반환합니다.
}
/// <요약>
/// 字符串编码为Base64
/// </summary>
/// <param name="str">문자열</param>
/// <returns>Base64 유형의 문자</returns>
보호된 문자열 ToBase64(문자열 str)
{
노력하다
{
byte[] by = Encoding.Default.GetBytes(str.ToCharArray());
str = Convert.ToBase64String(by);
}
잡기 (예외)
{
// 忽略错误
}
str을 반환;
}
/// <요약>
/// 附件信息
/// </summary>
공개 구조체 첨부 정보
{
/// <요약>
/// 附件文件name [如果输入路径,则自动转换为文件name]
/// </summary>
공개 문자열 파일 이름
{
get { 반환 파일 이름; }
set { fileName = Path.GetFileName(값); }
} 비공개 문자열 파일명;
/// <요약>
/// 附件的内容 [由经Base64编码的字节组成]
/// </summary>
공개 문자열 바이트
{
get { 반환 바이트; }
set { if (값 != 바이트) 바이트 = 값; }
} 비공개 문자열 바이트;
/// <요약>
/// 从流中读取附件内容并构造
/// </summary>
/// <param name="ifileName">문자의 이름</param>
/// <param name="stream">흐름</param>
공개 AttachmentInfo(문자열 ifileName, 스트림 스트림)
{
fileName = Path.GetFileName(ifileName);
byte[] by = new byte[stream.Length];
stream.Read(by, 0, (int)stream.Length); // 读取文件内容
//格式转换
bytes = Convert.ToBase64String(by); // 변환 기반 base64编码
}
/// <요약>
/// 사진 맞춤 문자 설명
/// </summary>
/// <param name="ifileName">문자의 이름</param>
/// <param name="ibytes">附件的内容 [字节 ]</param>
공개 첨부 정보(문자열 ifileName, byte[] ibytes)
{
fileName = Path.GetFileName(ifileName);
bytes = Convert.ToBase64String(ibytes); // 변환 기반 base64编码
}
/// <요약>
/// 从文件载入并构造
/// </summary>
/// <param name="경로"></param>
공개 첨부 정보(문자열 경로)
{
fileName = Path.GetFileName(경로);
FileStream 파일 = new FileStream(경로, FileMode.Open);
byte[] by = new byte[file.Length];
file.Read(by, 0, (int)file.Length); // 读取文件内容
//格式转换
bytes = Convert.ToBase64String(by); // 변환 기반 base64编码
파일.닫기();
}
}