log4net 在Azure WebJob中不生效问题
解决步骤:
- log4net.config 设置为: “复制到输出目录” -> “始终复制”
- 清理解决方案
- 关闭Visual Studio片刻后,并重新打开
解决步骤:
备注:需要保证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: "你好,"