Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

How to create a spam filter or automatic category sort algorithm with your mail application

, 29 Jul 2012
This article describe about automatic category filters in mail applications.
SpamFilterSample-noexe.zip
SpamFilterSample
HigLabo.Mail.SampleApplication
Properties
HigLabo.Mail
Async
Common
HigLabo.Mail.csproj.user
HigLabo.Mail.csproj.vspscc
Imap
Command
Pop3
Command
Properties
Smtp
Command
SendMail
HigLabo.Net
Core
Extensions
HigLabo.Net.csproj.user
HigLabo.Net.csproj.vspscc
HigLabo.Net.Silverlight.csproj.user
HigLabo.Net.Silverlight.csproj.vspscc
HigLabo.Net.WindowsPhone7.csproj.user
HigLabo.Net.WindowsPhone7.csproj.vspscc
Http
OAuth
Properties
Socket
Reference
Properties
Reference.csproj.user
SpamFilterSample
bin
Debug
SpamFilterSample.vshost.exe.manifest
Properties
SpamFilterSample.csproj.user
SpamFilterSample.zip
bin
Debug
Release
HigLabo.Mail.dll
HigLabo.Mail.SampleApplication.exe
HigLabo.Net.dll
Newtonsoft.Json.dll
obj
x86
Debug
TempPE
Release
bin
Debug
Release
HigLabo.Mail.dll
HigLabo.Net.dll
Newtonsoft.Json.dll
HigLabo.Mail.csproj.user
HigLabo.Mail.csproj.vspscc
obj
Debug
TempPE
Release
bin
Debug
de
es
fr
it
ja
ko
ru
zh-Hans
zh-Hant
Release
de
System.Xml.Linq.resources.dll
es
System.Xml.Linq.resources.dll
fr
System.Xml.Linq.resources.dll
HigLabo.Net.dll
HigLabo.Net.Silverlight.dll
HigLabo.Net.WindowsPhone7.dll
it
System.Xml.Linq.resources.dll
ja
System.Xml.Linq.resources.dll
ko
System.Xml.Linq.resources.dll
Newtonsoft.Json.dll
Newtonsoft.Json.Silverlight.dll
Newtonsoft.Json.WindowsPhone7.dll
ru
System.Xml.Linq.resources.dll
System.Xml.Linq.dll
zh-Hans
System.Xml.Linq.resources.dll
zh-Hant
System.Xml.Linq.resources.dll
HigLabo.Net.csproj.user
HigLabo.Net.csproj.vspscc
HigLabo.Net.Silverlight.csproj.user
HigLabo.Net.Silverlight.csproj.vspscc
HigLabo.Net.WindowsPhone7.csproj.user
HigLabo.Net.WindowsPhone7.csproj.vspscc
obj
Debug
TempPE
Release
BayesianFilter.dll
bin
Debug
Reference.dll
Release
HtmlAgilityPack.dll
obj
Debug
TempPE
Reference.csproj.user
BayesianFilter.dll
HigLabo.Mail.dll
HigLabo.Net.dll
HtmlAgilityPack.dll
Lucene.Net.dll
Newtonsoft.Json.dll
SpamData
SpamFilterSample.exe
SpamFilterSample.vshost.exe
SpamFilterSample.vshost.exe.manifest
Release
obj
x86
Debug
TempPE
SpamFilterSample.csproj.user
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Globalization;
using HigLabo.Net.Smtp;

namespace HigLabo.Net.Mail
{
    /// Represent mailaddress when sending by smtp.
    /// <summary>
    /// Represent mailaddress when sending by smtp.
    /// </summary>
    public class MailAddress
    {
		private class RegexList
		{
			public static Regex DisplayName_MailAddress = new Regex("(?<DisplayName>.*)<(?<MailAddress>[^>]*)>");
			public static Regex MailAddressWithBracket = new Regex("<(?<MailAddress>[^>]*)>");
		}
        private String _Value = "";
        private String _DisplayName = "";
		private String _UserName = "";
		private String _DomainName = "";
        private Boolean _IsDoubleQuote = false;
        private Encoding _Encoding = Encoding.ASCII;
        private TransferEncoding _TransferEncoding = TransferEncoding.Base64;
        /// メールアドレスの値を取得または設定します。
        /// <summary>
        /// Get or set mailaddress value.
        /// メールアドレスの値を取得または設定します。
        /// </summary>
        public String Value
        {
            get { return this._Value; }
            set { this._Value = value; }
        }
        /// 表示名を取得または設定します。
        /// <summary>
        /// 表示名を取得または設定します。
        /// </summary>
        public String DisplayName
        {
            get { return this._DisplayName; }
            set { this._DisplayName = value; }
        }
		/// ユーザー名を取得または設定します。
		/// <summary>
		/// ユーザー名を取得または設定します。
		/// </summary>
		public String UserName
		{
			get { return this._UserName; }
			set { this._UserName = value; }
		}
		/// ドメイン名を取得または設定します。
		/// <summary>
		/// ドメイン名を取得または設定します。
		/// </summary>
		public String DomainName
		{
			get { return this._DomainName; }
			set { this._DomainName = value; }
		}
		/// 表示名をダブルコーテーションで囲うどうかを示す値を取得または設定します。
        /// <summary>
        /// 表示名をダブルコーテーションで囲うどうかを示す値を取得または設定します。
        /// </summary>
        public Boolean IsDoubleQuote
        {
            get { return this._IsDoubleQuote; }
            set { this._IsDoubleQuote = value; }
        }
        /// 表示名のエンコードに使われるEncodingを取得または設定します。
        /// <summary>
        /// 表示名のエンコードに使われるEncodingを取得または設定します。
        /// </summary>
        public Encoding Encoding
        {
            get { return this._Encoding; }
            set { this._Encoding = value; }
        }
        /// 表示名のエンコードに使われるTransferEncodingを取得または設定します。
        /// <summary>
        /// 表示名のエンコードに使われるTransferEncodingを取得または設定します。
        /// </summary>
        public TransferEncoding TransferEncoding
        {
            get { return this._TransferEncoding; }
            set { this._TransferEncoding = value; }
        }
		/// <summary>
		/// 
		/// </summary>
		/// <param name="mailAddress"></param>
        public MailAddress(String mailAddress)
        {
            if (String.IsNullOrEmpty(mailAddress) == true)
            { throw new FormatException(); }
			if (mailAddress.Contains("@") == false)
			{ throw new FormatException("Mail address must be contain @ char."); }

			Match m = RegexList.MailAddressWithBracket.Match(mailAddress);
			if (m.Success == true)
			{
				this._Value = m.Groups["MailAddress"].Value;
			}
			else
			{
				this._Value = mailAddress;
			}
			String[] ss = _Value.Split('@');
			this._UserName = ss[0];
			this._DomainName = ss[1];
            this.InitializeProperty();
        }
		/// <summary>
		/// 
		/// </summary>
		/// <param name="mailAddress"></param>
		/// <param name="displayName"></param>
        public MailAddress(String mailAddress, String displayName) : 
			this(mailAddress)
        {
            this._DisplayName = displayName;
        }
        private void InitializeProperty()
        {
            if (CultureInfo.CurrentCulture.Name.StartsWith("ja") == true)
            {
                this.Encoding = Encoding.GetEncoding("iso-2022-jp");
                this.TransferEncoding = TransferEncoding.Base64;
            }
        }
		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
        public override string ToString()
        {
            if (String.IsNullOrEmpty(this._DisplayName) == true)
            {
                return String.Format("<{0}>", this._Value);
            }
            if (this._IsDoubleQuote == true)
            {
                return String.Format("\"{0}\" <{1}>", this._DisplayName, this._Value);
            }
            else
            {
                return String.Format("{0} <{1}>", this._DisplayName, this._Value);
            }
        }
		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
        public String ToEncodeString()
        {
            return MailAddress.ToMailAddressText(this._Encoding, this._TransferEncoding
                , this._Value, this._DisplayName, this._IsDoubleQuote);
        }
        /// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。
        /// <summary>
        /// Get mail address text encoded by specify encoding.
        /// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。
        /// </summary>
        /// <param name="mailAddress"></param>
        /// <param name="displayName"></param>
        /// <param name="doubleQuote"></param>
        /// <returns></returns>
        public static String ToMailAddressText(String mailAddress, String displayName, Boolean doubleQuote)
        {
            if (CultureInfo.CurrentCulture.Name.StartsWith("ja") == true)
            {
                return MailAddress.ToMailAddressText(Encoding.GetEncoding("iso-2022-jp"), TransferEncoding.Base64
                    , mailAddress, displayName, doubleQuote);
            }
            return MailAddress.ToMailAddressText(Encoding.ASCII, TransferEncoding.Base64, mailAddress, displayName, doubleQuote);
        }
        /// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。
        /// <summary>
        /// Get mail address text encoded by specify encoding.
        /// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。
        /// </summary>
        /// <param name="encoding"></param>
        /// <param name="transferEncoding"></param>
        /// <param name="mailAddress"></param>
        /// <param name="displayName"></param>
        /// <param name="doubleQuote"></param>
        /// <returns></returns>
        public static String ToMailAddressText(Encoding encoding, TransferEncoding transferEncoding
            , String mailAddress, String displayName, Boolean doubleQuote)
        {
            if (String.IsNullOrEmpty(displayName) == true)
            {
                return mailAddress;
            }
            else
            {
                if (doubleQuote == true)
                {
                    return String.Format("\"{0}\" <{1}>", displayName, mailAddress);
                }
                else
                {
                    return String.Format("{0} <{1}>"
                        , MailParser.EncodeToMailHeaderLine(displayName, transferEncoding, encoding, MailParser.MaxCharCountPerRow - mailAddress.Length - 3)
                        , mailAddress);
                }
            }
        }
        /// 文字列を元にMailAddressのインスタンスを生成します。
        /// <summary>
        /// Create MailAddress object by mail address text.
        /// 文字列を元にMailAddressのインスタンスを生成します。
        /// 表示名<メールアドレス>の書式の場合、DisplayNameとMailAddressに値をセットしてインスタンスを生成します。
        /// <メールアドレス>の場合、MailAddressにメールアドレスの値をセットしてインスタンスを生成します。
        /// </summary>
        /// <param name="mailAddress"></param>
        /// <returns></returns>
        public static MailAddress Create(String mailAddress)
        {
            Regex rx = RegexList.DisplayName_MailAddress;
            Match m = null;

            m = rx.Match(mailAddress);
            if (String.IsNullOrEmpty(m.Value) == true)
            {
                rx = RegexList.MailAddressWithBracket;
                m = rx.Match(mailAddress);
                if (String.IsNullOrEmpty(m.Value) == true)
                {
                    return new MailAddress(mailAddress);
                }
                else
                {
                    return new MailAddress(m.Groups["MailAddress"].Value);
                }
            }
            else
            {
				if (String.IsNullOrEmpty(m.Groups["DisplayName"].Value) == true)
				{
					return new MailAddress(mailAddress);
				}
				else
				{
					return new MailAddress(m.Groups["MailAddress"].Value, m.Groups["DisplayName"].Value.TrimEnd(' '));
				}
            }
        }
		/// 文字列を元にMailAddressのインスタンスの生成を試みます。
		/// <summary>
		/// Try to create MailAddress object by mail address text.
		/// 文字列を元にMailAddressのインスタンスの生成を試みます。
		/// メールアドレスに変換できない文字列の場合、戻り値はnullになります。
		/// </summary>
		/// <param name="mailAddress"></param>
		/// <returns></returns>
		public static MailAddress TryCreate(String mailAddress)
		{
			try
			{
				if (String.IsNullOrEmpty(mailAddress) == true)
				{ return null; }
				if (mailAddress.Contains("@") == false)
				{ return null; }
				return MailAddress.Create(mailAddress);
			}
			catch { }
			return null;
		}
		/// メールアドレス一覧の文字列からMailAddressの一覧を取得します。
        /// <summary>
        /// Get mailaddress list from mail address list text.
        /// メールアドレス一覧の文字列からMailAddressの一覧を取得します。
        /// </summary>
        /// <param name="mailAddressListText"></param>
        /// <returns></returns>
        public static List<MailAddress> CreateMailAddressList(String mailAddressListText)
        {
            List<MailAddress> l = new List<MailAddress>();
			MailAddress m = null;
            String[] ss = null;

            ss = mailAddressListText.Split(',');
            for (int i = 0; i < ss.Length; i++)
            {
				m = MailAddress.TryCreate(ss[i].Trim());
				if (m == null)
				{ continue; }
                l.Add(m);
            }
            return l;
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The MIT License

Share

About the Author

Higty
Web Developer
Japan Japan
I'm Working at Software Company in Tokyo.

| Advertise | Privacy | Mobile
Web03 | 2.8.140814.1 | Last Updated 30 Jul 2012
Article Copyright 2012 by Higty
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid