最近、仕事の関係で ASP.NET 1.1 プログラムをメンテナンスする必要があります。以前は C# 2.0 System.Net.Mail 名前空間を使用して電子メールを送信していましたが、ASP.NET の System.Web.Mail には多くの問題があります。 1.1 だったので、別のものを選択しました。この戦略は、メール送信用のインターフェイスをカプセル化し、別の方法でメール送信を実装するため、次のような文言があります。
すべての実装をカプセル化するための抽象インターフェイスを定義します
。
System.Web.Mail
名前空間
を使用します。
{
パブリック抽象クラス MySmtpMail
{
Fields#region フィールド
プライベート文字列 _defaultCharset = "GB2312";
プライベート int _defaultSmtpPort = 25
;
Properties#region プロパティ
protected string DefaultCharset
{
get { return this._defaultCharset }
protected
int DefaultSmtpPort
{
get { return this._defaultSmtpPort;}
#endregion
メソッド
#region メソッド
/**//// <概要>
/// デフォルトのインスタンスを取得します
/// </概要>
/// <戻り値></戻り値>
パブリック静的 MySmtpMail GetDefaultInstance()
{
// ここでは、外部構成ファイルを通じて特定の実装タイプを定義できます。
// Activator.CreateInstance() を通じて型インスタンスを取得します
}
/**//// <概要>
/// 初期化作業を行います
/// </概要>
public abstract void Open();
/**//// <概要>
/// オブジェクトを破棄します
/// </概要>
public abstract void Close();
/**//// <概要>
/// メールを送信する
/// </概要>
/// <param name="メッセージ"></param>
/// <param name="smtpServer"></param>
/// <param name="サーバーユーザー名"></param>
/// <param name="サーバーパスワード"></param>
/// <戻り値></戻り値>
public bool Send(MailMessage メッセージ、文字列 smtpServer、文字列サーバーユーザー名、文字列サーバーパスワード)
{
return Send(メッセージ、smtpServer、serverUsername、serverPassword、this._defaultSmtpPort);
public
abstract bool Send(MailMessage message, string smtpServer, string serverUsername, string serverPassword, int smtpPort)
;
{
if (メッセージ == null)
throw new ArgumentNullException("message");
if (Globals.IsNullorEmpty(message.To))
null を返します。
メッセージを返します。Split(';');
}
public static string[] GetCc(MailMessage メッセージ)
{
if (メッセージ == null)
throw new ArgumentNullException("message");
if (Globals.IsNullorEmpty(message.Cc))
null を返す;
message.Cc.Split(';');
}
public static string[] GetBcc(MailMessage メッセージ)
{
if (メッセージ == null)
throw new ArgumentNullException("message");
if (Globals.IsNullorEmpty(message.Bcc))
null を返します。
メッセージを返します。Bcc.Split(';');
#エンド
リージョン
}
注
: 常識によれば、使用前に Open() し、使用後に Close() を忘れないでください。
実装計画 1 (Jmail コンポーネント):
.NET で Jmail を使用するには、次の設定が必要です。
1. jmailをインストールします。
2. jmail.dllを見つけます。
3. コンポーネント Jmail.dll を登録するには、jmail.dll ファイルを system32 ディレクトリにコピーし、コマンド「regsvr32 jmail.dll」を実行します (引用符は除く)。アンインストールするには、「regsvr32 /u jmail.dll」を実行します。 ;
4. Program FilesMicrosoft Visual Studio .NETFrameworkSDKBinildasm.exe を実行します (Visual Studio .Net 2003 コマンド プロンプトを使用できます)。
形式は次のとおりです: tlbimp c:Program FilesDimacw3JMail4jmail.dll /out:MyJmail.dll /namespace:MyJmail
MyJmail.dll を生成したら、それをプロジェクト内で参照します。
コンポーネントをダウンロードした
後の次のステップは、実装クラスを作成することです
。
System.Web.Mail
名前空間
を使用します。
{
パブリック クラス JMailSmtpMail : MySmtpMail
{
Fields#region フィールド
MyJmail.Message jmail = null;
#endregion
メソッド#region メソッド
public override void Open()
{
jmail = 新しいMyJmail.Message();
public override bool Send(MailMessage message, string smtpServer, string serverUsername, string serverPassword, int smtpPort
)
{
if (jmail == null)
throw new Exception("smtp は閉じています!");
if (メッセージ == null)
throw new ArgumentNullException("message");
DateTime t = DateTime.Now;
//Silent 属性: true に設定すると、JMail.Send() は操作の結果に応じて true または false を返します。
jmail.Silent = false;
//ログ属性が true に設定されている場合、jmail によってログが作成されます。
jmail.Logging = true;
//文字セット、デフォルトは「US-ASCII」です。
jmail.Charset =base.DefaultCharset;
//レターのコンテンツタイプ。デフォルトは「text/plain」です): String HTML 形式でメールを送信する場合は、「text/html」に変更します。
if (message.BodyFormat == MailFormat.Html)
jmail.ContentType = "テキスト/html";
jmail.Priority = GetJmailPriority(message.Priority);
//受信者を追加
string[] toArray = MySmtpMail.GetTo(メッセージ);
if (toArray != null && toArray.Length > 0)
{
bool isAddedRecipient = false
for (int i = 0; i < toArray.Length; i++)
{
if (Globals.IsNullorEmpty(toArray[i]))
続行;
if (!isAddedRecipient)
{
jmail.AddRecipient(toArray[i], String.Empty, String.Empty);
isAddedRecipient = true;
}
それ以外
{
jmail.AddRecipientCC(toArray[i], String.Empty, String.Empty);
}
}
]
ccArray = MySmtpMail.GetCc(メッセージ);
if (ccArray != null)
{
foreach (ccArray 内の文字列 cc)
{
if (!Globals.IsNullorEmpty(cc))
jmail.AddRecipientCC(cc, String.Empty, String.Empty);
}
]
bccArray = MySmtpMail.GetBcc(メッセージ);
if (ccArray != null)
{
foreach (bccArray 内の文字列 bcc)
{
if (!Globals.IsNullorEmpty(bcc))
jmail.AddRecipientBCC(bcc, String.Empty);
}
}
jmail.From = message.From
;
jmail.MailServerUserName = サーバーユーザー名;
//送信者のメールパスワード
jmail.MailServerPassWord = サーバーパスワード;
//メールのタイトルを設定する
jmail.Subject = メッセージ.件名;
//メールに添付ファイルを追加します(複数の添付ファイルがある場合は、 jmail.AddAttachment("c:\test.jpg",true,null); を追加できます)。 [注意]: 添付ファイルを追加した後、上記の jmail.ContentType="text/html"; を削除してください。そうしないと、メールが文字化けしてしまいます。
//jmail.AddAttachment("c:\test.jpg", true, null);
//メールの内容
jmail.Body = message.Body
if (message.BodyFormat == MailFormat.Html)
jmail.Body += "<br><br>";
それ以外
jmail.Body += "rnrn";
jmail.Body += DateTime.Now.ToString()
= String.Format("{0}:{1}", smtpServer, smtpPort);
//Jmailの送信方法
bool result = jmail.Send(smtpServer, false)
;
オーバーライド
void Close()
{
jmail.Close();
}
プライベート静的バイト GetJmailPriority(System.Web.Mail.MailPriority 優先度)
{
// メール レベル、1 は緊急、3 は通常、5 は低レベル
if (priority == System.Web.Mail.MailPriority.High)
1 を返す;
if (優先度 == System.Web.Mail.MailPriority.Low)
5 を返します
。
#エンド
リージョン
}
実装計画 2 (OpenSmtp.Net コンポーネント):
OpenSmtp.Net に慣れていない人は、まず Google で調べ
てください。ここでは概念を紹介しませんが、同時に、双子の OpenPop もあります。 .Net OpenSmtp.Net については、 http://sourceforge.net/projects/opensmtp-net/からダウンロードできます。最新バージョンは 1.11 です。
次に、システムの使用というトピックに入りましょう
。
System.Web.Mail を使用します。
OpenSmtp.Mail
名前空間 YywMail
を使用します。
{
パブリック クラス OpenSmtpMail : MySmtpMail
{
Files#region ファイル
OpenSmtp.Mail.MailMessage msg = null;
Smtp smtp = null;
#endregion
Methods#region メソッド
public オーバーライド void Open()
{
msg = 新しい OpenSmtp.Mail.MailMessage();
smtp = 新しい Smtp();
public override bool Send(System.Web.Mail.MailMessage message, string smtpServer, string serverUsername, string serverPassword, int smtpPort
)
{
if (msg == null || smtp == null)
throw new Exception("smtp is Closed!");
if (message == null)
新しい ArgumentNullException("メッセージ") をスローします
。
送信元メールアドレス = 新しいメールアドレス(message.From, message.From);
msg.Charset = ベース.DefaultCharset;
msg.From = から;
msg.Priority = GetOpenSmtpPriority(message.Priority);
//受信者を追加
string[] toArray = MySmtpMail.GetTo(メッセージ);
if (toArray != null)
{
foreach (toArray への文字列)
{
if (!Globals.IsNullorEmpty(to))
msg.AddRecipient(to, AddressType.To);
}
]
ccArray = MySmtpMail.GetCc(メッセージ);
if (ccArray != null)
{
foreach (ccArray 内の文字列 cc)
{
if (!Globals.IsNullorEmpty(cc))
msg.AddRecipient(cc, AddressType.Cc);
}
]
bccArray = MySmtpMail.GetBcc(メッセージ);
if (ccArray != null)
{
foreach (bccArray 内の文字列 bcc)
{
if (!Globals.IsNullorEmpty(bcc))
msg.AddRecipient(bcc, AddressType.Bcc);
}
msg.Subject
= message.Subject;
if (message.BodyFormat == System.Web.Mail.MailFormat.Html)
{
msg.HtmlBody = message.Body + "<br><br>" + DateTime.Now.ToString();
}
それ以外
{
msg.Body = message.Body + "rnrn" + DateTime.Now.ToString();;
文字
列str1 = msg.HtmlBody;
文字列 str2 = msg.Body;
smtp.Host = smtpServer;
smtp.ユーザー名 = サーバーユーザー名;
smtp.Password = サーバーパスワード;
smtp.Port =
smtp.SendMail(msg);
を返します。
}
パブリックオーバーライド void Close()
{
メッセージ = null;
smtp = null;
プライベート
静的文字列 GetOpenSmtpPriority(System.Web.Mail.MailPriority 優先度)
{
// メール レベル、1 は緊急、3 は通常、5 は低レベル
if (priority == System.Web.Mail.MailPriority.High)
return OpenSmtp.Mail.MailPriority.High
if (優先度 == System.Web.Mail.MailPriority.Low)
OpenSmtp.Mail.MailPriority.Low を返す;
OpenSmtp.Mail.MailPriority.Normal を返す;
#エンド
リージョン
}
}
実装計画 3:
(上記の 2 つの実装計画は現在のニーズを満たすのに十分であり、必要に応じて拡張できます)