2024年1月

备注:需要保证outlook是打开且登录状态

using Microsoft.Office.Interop.Outlook;

    // 核心代码
    Application app = new Application();
    NameSpace ns = app.GetNamespace("MAPI");

    // 查看有哪些Folder
    foreach (MAPIFolder folder in ns.Folders)
    {
        Console.WriteLine(folder.Name); 
    }

    // 获取指定文件夹
    MAPIFolder folder = ns.Folders["一级目录"];
    folder = folder.Folders["二级目录"];

    // 对邮件列表进行排序,按接收时间降序排列
    Items items = folder.Items;
    items.Sort("[ReceivedTime]", true);

    Console.WriteLine($@"邮件总数: {items.Count}");

    // 遍历邮件
    foreach (object item in items)
    {
        if (item is MailItem)
        {
            MailItem mailItem = item as MailItem;

            Console.WriteLine($@"
                创建时间: {mailItem.CreationTime}
                接收时间: {mailItem.ReceivedTime}
                主    题: {mailItem.Subject}
                正    文: {mailItem.Body}"
            );

            // 将邮件设置为已读(设置未读状态)
            if (mailItem.UnRead == true)
            {
                // 已读
                mailItem.UnRead = false;
                mailItem.Save();
            }
        }
    }

接收(同步)最新邮件,这段代码好像没什么用

            #region 接收邮件
            // 创建Outlook应用程序对象
            Application outlookApp = new Application();

            for (int i = 1; i < outlookApp.Session.SyncObjects.Count + 1; i++)
            {
                var syncObject = outlookApp.Session.SyncObjects[i];

                #region 绑定事件
                syncObject.SyncStart += () =>
                {
                    Console.WriteLine("SyncStart");
                };
                syncObject.Progress += (OlSyncState State, string Description, int Value, int Max) =>
                {
                    Console.WriteLine($@"
Progress
State: {State}
Description: {Description}
Value: {Value}
Max: {Max}");
                };
                syncObject.OnError += (int Code, string Description) =>
                {
                    Console.WriteLine($@"
OnError
Code: {Code}
Description: {Description}");
                };
                syncObject.SyncEnd += () =>
                {
                    Console.WriteLine("SyncEnd");
                };
                #endregion

                syncObject.Start();
            }

            Console.WriteLine("【接收完成】");
            #endregion

定义一个转换器,继承自:System.Text.Json.Serialization.JsonConverter<DateTime>

    public class CustomDateTimeConverter : JsonConverter<DateTime>
    {
        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.Number)
            {
                // Assume Unix timestamp (seconds since 1970-01-01T00:00:00Z)
                return DateTimeOffset.FromUnixTimeSeconds(reader.GetInt64()).LocalDateTime;
            }

            return reader.GetDateTime().ToLocalTime();
        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToUniversalTime());
        }
    }

在Flurl中设置上述的转换器

            // 设置 Flurl 的全局 JSON 序列化器
            FlurlHttp.Clients.WithDefaults(settings =>
            {
                settings.Settings.JsonSerializer = new DefaultJsonSerializer(new JsonSerializerOptions
                {
                    //PropertyNameCaseInsensitive = true,
                    //IgnoreReadOnlyProperties = true,
                    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
                    Converters = { new CustomDateTimeConverter() },
                });
            });

    var StringUtils = {
        strLen: function (str) {
            var len = 0;
            for (var i = 0; i < str.length; i++) {
                if (str.charCodeAt(i) > 255 || str.charCodeAt(i) < 0) len += 2;
                else len++;
            }
            return len;
        },

        strToChars: function (str) {
            var chars = new Array();
            for (var i = 0; i < str.length; i++) {
                chars[i] = [str.substr(i, 1), this.isCHS(str, i)];
            }
            return chars;
        },

        isCHS: function (str, i) {
            if (str.charCodeAt(i) > 255 || str.charCodeAt(i) < 0) return true;
            else return false;
        },

        subCHString: function (str, start, end) {
            var len = 0;
            var result = "";
            var charsArray = this.strToChars(str);
            for (var i = 0; i < str.length; i++) {
                if (charsArray[i][1]) len += 2;
                else len++;
                if (end < len) return result;
                else if (start < len) result += charsArray[i][0];
            }
            return result;
        },

        subCHStr: function (str, start, length) {
            return this.subCHString(str, start, start + length);
        }
    };
// Usage example:
var str = "你好,世界!Hello, World!";
console.log(StringUtils.strLen(str)); // Output: 27
console.log(StringUtils.subCHStr(str, 0, 5)); // Output: "你好,"

参考:
JavaScript截取中英文字符串