-
システムを使用する;
System.Collections.Generic を使用します。
System.Net.Sockets を使用します。
System.IO を使用します。
System.Text を使用します。
System.Collections を使用します。
パブリック クラス MailSender
{
/// <概要>
/// SMTPサービス务器ドメイン名
/// </概要>
パブリック文字列サーバー
{
get { サーバーを返す; }
set { if (値 != サーバー) サーバー = 値; }
プライベート文字列サーバー = "";
/// <概要>
/// SMTP サービス端末口 [默认範囲 25]
/// </概要>
パブリック INT ポート
{
get { 戻りポート; }
set { if (値 != ポート) ポート = 値; }
プライベート int ポート = 25;
/// <概要>
/// 用户名 [如果必要身份验证的话]
/// </概要>
パブリック文字列ユーザー名
{
get { ユーザー名を返します; }
set { if (値 != ユーザー名) ユーザー名 = 値; }
プライベート文字列 userName = "";
/// <概要>
/// 秘密 [必要な場合は身份验证の话]
/// </概要>
パブリック文字列パスワード
{
get { パスワードを返す; }
set { if (値 != パスワード) パスワード = 値; }
プライベート文字列パスワード = "";
/// <概要>
/// 発信者地址
/// </概要>
パブリック文字列 From
{
get { からの戻り値; }
set { if (値 != from) from = 値; }
= "" からのプライベート文字列;
/// <概要>
/// 收件人地址
/// </概要>
パブリック文字列宛先
{
取得 { に戻る; }
set { if (value != to) to = value; }
プライベート文字列を = "";
/// <概要>
/// 発行者名
/// </概要>
パブリック文字列FromName
{
get { return fromName; }
set { if (値 != fromName) fromName = 値; }
プライベート文字列 fromName = "";
/// <概要>
/// 收件人姓名
/// </概要>
パブリック文字列ToName
{
get {名前に戻る; }
set { if (value != toName) toName = value; }
プライベート文字列 toName = "";
/// <概要>
/// 邮件の主题
/// </概要>
パブリック文字列 件名
{
get { 件名を返す; }
set { if (値 != 件名) 件名 = 値; }
プライベート文字列サブジェクト = "";
/// <概要>
/// 邮件正文
/// </概要>
パブリック文字列本体
{
get { 本文を返す; }
set { if (値 != 本体) 本体 = 値; }
プライベート文字列本体 = "";
/// <概要>
/// 超文本格式的邮件正文
/// </概要>
パブリック文字列 HtmlBody
{
get { return htmlBody; }
set { if (値 != htmlBody) htmlBody = 値; }
プライベート文字列 htmlBody = "";
/// <概要>
/// HTML形式のファイルかどうか
/// </概要>
パブリックブールIsHtml
{
get { return isHtml; }
set { if (値 != isHtml) isHtml = 値; }
プライベートブール isHtml = false;
/// <概要>
/// 语言编码 [默认はGB2312]
/// </概要>
パブリック文字列 LanguageEncoding
{
get { 戻り言語エンコーディング; }
set { if (値 != languageEncoding) languageEncoding = 値; }
プライベート文字列 languageEncoding = "GB2312";
/// <概要>
/// 邮件编码 [默认は8bit]
/// </概要>
パブリック文字列 MailEncoding
{
get { エンコーディングを返す; }
set { if (値 != エンコーディング) エンコーディング = 値; }
プライベート文字列エンコーディング = "8ビット";
/// <概要>
/// 邮件优先级 [默认範囲3]
/// </概要>
public int 優先度
{
get { 優先順位を返す; }
set { if (値 != 優先度) 優先度 = 値; }
プライベート int 優先度 = 3;
/// <概要>
/// 添付ファイル [AttachmentInfo]
/// </概要>
パブリック IList 添付ファイル
{
get { 添付ファイルを返す; }
// set { if (値 != 添付ファイル) 添付ファイル = 値; }
プライベート ArrayList 添付ファイル = new ArrayList();
/// <概要>
/// 送信ファイル
/// </概要>
public void SendMail()
{
// TcpClient オブジェクトを確立し、接続を確立します
TcpClient tcp = null;
試す
{
tcp = 新しい TcpClient(サーバー, ポート);
}
catch (例外例)
{
文字列エラー = ex.メッセージ;
throw new Exception("無法连接服务器");
}
ReadString(tcp.GetStream());//获取接続情報
// サービス開始開始
// 結果ステータスコードが 250 であれば、操作が成功したことを示します
if (!Command(tcp.GetStream(), "EHLO Localhost", "250"))
throw new Exception("登陆阶段失败");
if (ユーザー名 != "")
{
// 必要身份验证
if (!Command(tcp.GetStream(), "AUTH LOGIN", "334"))
throw new Exception("身份验证阶段失败");
文字列名B64 = ToBase64(ユーザー名); // ここではユーザー名を Base64 にします
if (!Command(tcp.GetStream(), nameB64, "334"))
throw new Exception("身份验证阶段失败");
文字列 passB64 = ToBase64(パスワード); // ここではパスワードを Base64 に変更します
if (!Command(tcp.GetStream(), passB64, "235"))
throw new Exception("身份验证阶段失败");
}
// 準備送信
WriteString(tcp.GetStream(), "メール From: " + from);
WriteString(tcp.GetStream(), "rcpt to: " + to);
WriteString(tcp.GetStream(), "データ");
// 送信邮件头
WriteString(tcp.GetStream(), "Date: " + DateTime.Now); // 時間
WriteString(tcp.GetStream(), "From: " + fromName + "<" + from + ">"); // 発行者
WriteString(tcp.GetStream(), "件名: " + 件名); // 主题
WriteString(tcp.GetStream(), "To:" + toName + "<" + to + ">"); // 收件人
//邮件格式
WriteString(tcp.GetStream(), "Content-Type: multipart/mixed; border="unique-boundary-1"");
WriteString(tcp.GetStream(), "返信先:" + from); // 回帰地址
WriteString(tcp.GetStream(), "X-Priority:" + 優先順位); // 优先级
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");
// ここで定義されている第二分間隔
WriteString(tcp.GetStream(), "Content-Type: multipart/alternative;Boundary="unique-boundary-2"");
WriteString(tcp.GetStream(), "");
if (!isHTML)
{
// 文本情報
WriteString(tcp.GetStream(), "--unique-boundary-2");
WriteString(tcp.GetStream(), "Content-Type: text/plain;charset=" + languageEncoding);
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=" + languageEncoding);
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(), "Content-Type: application/octet-stream;name="" + ((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(), "");
}
コマンド(tcp.GetStream(), ".", "250"); // 最後に写完了、输入"."
// 关闭接続
tcp.Close();
}
/// <概要>
/// 向流中書記文字
/// </概要>
/// <param name="netStream">TcpClient からのストリーム</param>
/// <param name="str">書き込み対象文字</param>
protected void WriteString(NetworkStream netStream, string str)
{
str = str + " "; // 换行符を追加
// コマンド行转化をbyte[]
byte[] bWrite = Encoding.GetEncoding( languageEncoding).GetBytes(str.ToCharArray());
// 毎回の書き込みのデータサイズは制限されているため、毎回の書き込みのデータ長は 75 文字に設定されており、コマンド長が 75 を超えると分割して書き込まれます。
int 開始 = 0;
int 長 = bWrite.Length;
int ページ = 0;
int サイズ = 75;
int カウント = サイズ;
試す
{
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);
}
キャッチ (例外)
{
// 忽略错误
}
}
/// <概要>
/// 从流中读取字符
/// </概要>
/// <param name="netStream">TcpClient からのストリーム</param>
/// <returns>读取的文字</returns>
保護された文字列 ReadString(NetworkStream netStream)
{
文字列sp = null;
byte[] by = 新しいバイト[1024];
int size = netStream.Read(by, 0, by.Length);// 读取データストリーム
if (サイズ > 0)
{
sp = Encoding.Default.GetString(by);// 转化化してString
}
spを返します。
}
/// <概要>
/// コマンドを発行し、返された情報が正确であるかどうかを判断します
/// </概要>
/// <param name="netStream">TcpClient からのストリーム</param>
/// <param name="command"> コマンド</param>
/// <param name="state">正确的状態</param>
/// <returns> 否か正确</returns>
protected bool コマンド(NetworkStream netStream、文字列コマンド、文字列状態)
{
文字列 sp = null;
ブール値の成功 = false;
試す
{
WriteString(netStream, command);// 書き込みコマンド
sp = ReadString(netStream);// 返された情報を受信
if (sp.IndexOf(state) != -1)// 判断状態态码有無正确
成功 = true;
}
キャッチ (例外)
{
// 忽略错误
}
成功を返します。
}
/// <概要>
/// 文字列番号はBase64です
/// </概要>
/// <param name="str">文字列</param>
/// <returns>Base64 の文字列</returns>
保護された文字列 ToBase64(文字列 str)
{
試す
{
byte[] by = Encoding.Default.GetBytes(str.ToCharArray());
str = Convert.ToBase64String(by);
}
キャッチ (例外)
{
// 忽略错误
}
文字列を返します。
}
/// <概要>
/// 付属品情報
/// </概要>
パブリック構造体AttachmentInfo
{
/// <概要>
/// 添付ファイルのファイル名 [如果入路径,自自转换はファイル名]
/// </概要>
パブリック文字列ファイル名
{
get { ファイル名を返します; }
set { fileName = Path.GetFileName(value); }
プライベート文字列ファイル名;
/// <概要>
/// 付属品の内容 [Base64 コードによる文字構成]
/// </概要>
パブリック文字列バイト
{
get { バイトを返す; }
set { if (値 != バイト) バイト = 値; }
プライベート文字列バイト;
/// <概要>
/// ストリーム中から添付ファイルの内容を取得して構築
/// </概要>
/// <param name="ifileName">付属品のファイル名</param>
/// <param name="stream">流れ</param>
public AttachmentInfo(string ifileName, Stream stream)
{
ファイル名 = パス.GetFileName(ifileName);
byte[] by = 新しいバイト[stream.Length];
stream.Read(by, 0, (int)stream.Length); // 文の内容を读取
//格式转换
バイト = Convert.ToBase64String(by); // 转化はbase64コードです
}
/// <概要>
/// 按照定の文字構造アクセサリ
/// </概要>
/// <param name="ifileName">付属品のファイル名</param>
/// <param name="ibytes">付属品の内容 [字节]</param>
public AttachmentInfo(string ifileName, byte[] ibytes)
{
ファイル名 = パス.GetFileName(ifileName);
バイト = Convert.ToBase64String(ibytes); // 转化はbase64コードです
}
/// <概要>
/// 文件ダウンロード入并构造
/// </概要>
/// <param name="パス"></param>
public AttachmentInfo(文字列パス)
{
ファイル名 = パス.Getファイル名(パス);
FileStream ファイル = 新しい FileStream(パス, FileMode.Open);
byte[] by = 新しいバイト[file.Length];
file.Read(by, 0, (int)file.Length); // 读取文の内容
//格式转换
バイト = Convert.ToBase64String(by); // 转化はbase64コードです
file.Close();
}
}