Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[refact] 新增 SMTP/IMAP 邮件服务 #104

Open
wants to merge 11 commits into
base: dev
Choose a base branch
from
Open
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,7 @@ MigrationBackup/
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd

# Secrets
MicaApps.Mail.Tests/Secrets.cs
25 changes: 25 additions & 0 deletions Mail.sln
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicaApps.Mail.UWP", "src\Mi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MicaApps.Mail", "src\MicaApps.Mail\MicaApps.Mail.csproj", "{A910A7C5-9F5C-457C-88B6-4CED1725398A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{FDF4ACB0-3370-41FC-B005-221E43AC34D0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicaApps.Mail.Tests", "tests\MicaApps.Mail.Tests\MicaApps.Mail.Tests.csproj", "{C1BE9EEF-C620-455E-A331-E448EB4A4615}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -88,12 +92,33 @@ Global
{A910A7C5-9F5C-457C-88B6-4CED1725398A}.Release|x64.Build.0 = Release|Any CPU
{A910A7C5-9F5C-457C-88B6-4CED1725398A}.Release|x86.ActiveCfg = Release|Any CPU
{A910A7C5-9F5C-457C-88B6-4CED1725398A}.Release|x86.Build.0 = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|ARM.ActiveCfg = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|ARM.Build.0 = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|ARM64.Build.0 = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|x64.ActiveCfg = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|x64.Build.0 = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|x86.ActiveCfg = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Debug|x86.Build.0 = Debug|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|Any CPU.Build.0 = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|ARM.ActiveCfg = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|ARM.Build.0 = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|ARM64.ActiveCfg = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|ARM64.Build.0 = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|x64.ActiveCfg = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|x64.Build.0 = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|x86.ActiveCfg = Release|Any CPU
{C1BE9EEF-C620-455E-A331-E448EB4A4615}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{D232482A-0A17-4F0E-A242-F97C4D503937} = {9AF8B660-344F-4CDC-8EF1-CAEBE2AF4081}
{C1BE9EEF-C620-455E-A331-E448EB4A4615} = {FDF4ACB0-3370-41FC-B005-221E43AC34D0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {93DE7270-2FAA-4FBE-9E2E-418D69D44180}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using MicaApps.Mail.Abstraction.Models;
using MicaApps.Mail.Abstraction.Models.Messages;

namespace MicaApps.Mail.Abstraction.MailService;

public interface IAttachmentGettable
{
public Task<MailAttachmentContent?> GetAttachmentContentAsync(MailAttachment attachment);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using MicaApps.Mail.Abstraction.Models;
using MicaApps.Mail.Abstraction.Models.Messages;

namespace MicaApps.Mail.Abstraction.MailService;

public interface IProgressiveEmailFetchable
{
public Task<List<MailMessage>> GetMailsInFolderAsync(MailFolder mailFolder, int start, int count,
CancellationToken cancellationToken = default);
}
23 changes: 23 additions & 0 deletions src/MicaApps.Mail/Abstraction/MailService/MailServiceBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using MicaApps.Mail.Abstraction.Models;
using MicaApps.Mail.Abstraction.Models.Messages;

namespace MicaApps.Mail.Abstraction.MailService;

public abstract class MailServiceBase
{
public abstract string Id { get; set; }
public abstract string Name { get; set; }

public abstract Task ConnectAsync(CancellationToken cancellationToken = default);
public abstract Task DisconnectAsync(CancellationToken cancellationToken = default);

public abstract Task<List<MailFolder>> GetMailFoldersAsync(CancellationToken cancellationToken = default);

public abstract Task<List<MailMessage>> GetMailsInFolderAsync(
MailFolder mailFolder, CancellationToken cancellationToken = default);

public abstract Task<MailMessage?> GetMailDetailAsync(string id, CancellationToken cancellationToken = default);


public abstract Task SendMailAsync(MailMessage sendingMailMessage, CancellationToken cancellationToken = default);
}
5 changes: 5 additions & 0 deletions src/MicaApps.Mail/Abstraction/Models/EmailAccount.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace MicaApps.Mail.Abstraction.Models;

public record EmailAccount(string Email, string? Name)
{
}
17 changes: 17 additions & 0 deletions src/MicaApps.Mail/Abstraction/Models/MailAttachment.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace MicaApps.Mail.Abstraction.Models;

public class MailAttachment
{
public string Id { get; }
public string? Name { get; }
public string? ContentType { get; }
public long Length { get; }

public MailAttachment(string id,string? name,string? contentType,long length)
{
Id = id;
Name = name;
ContentType = contentType;
Length = length;
}
}
22 changes: 22 additions & 0 deletions src/MicaApps.Mail/Abstraction/Models/MailAttachmentContent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace MicaApps.Mail.Abstraction.Models;

public class MailAttachmentContent
{
public MailAttachmentContent(string id, string? name, string? contentType, long length)
{
Id = id;
Name = name;
ContentType = contentType;
Length = length;
}

public virtual Task WriteToStreamAsync(Stream stream, CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}

public string Id { get; }
public string? Name { get; }
public string? ContentType { get; }
public long Length { get; }
}
7 changes: 7 additions & 0 deletions src/MicaApps.Mail/Abstraction/Models/MailFolder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace MicaApps.Mail.Abstraction.Models;

public class MailFolder
{
public string Id { get; set; } = null!;
public string? Name { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MicaApps.Mail.Abstraction.Models.Messages.Interfaces;

public interface IHasAttachments
{
public List<MailAttachment> Attachments { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MicaApps.Mail.Abstraction.Models.Messages.Interfaces;

public interface IHasBcc
{
public List<EmailAccount> Bcc { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MicaApps.Mail.Abstraction.Models.Messages.Interfaces;

public interface IHasCc
{
public List<EmailAccount> Cc { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MicaApps.Mail.Abstraction.Models.Messages.Interfaces;

public interface IHasHtmlBody
{
public string? HtmlBody { get; set; }
}
11 changes: 11 additions & 0 deletions src/MicaApps.Mail/Abstraction/Models/Messages/MailMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace MicaApps.Mail.Abstraction.Models.Messages;

public class MailMessage
{
public string MailId { get; set; } = null!;
public string? Subject { get; set; }
public string Body { get; set; } = null!;
public DateTimeOffset SendDate { get; set; }
public EmailAccount Sender { get; set; } = null!;
public List<EmailAccount> Recipients { get; set; } = new();
}
5 changes: 0 additions & 5 deletions src/MicaApps.Mail/Class1.cs

This file was deleted.

48 changes: 48 additions & 0 deletions src/MicaApps.Mail/Extensions/Results.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
namespace MicaApps.Mail.Extensions;

public struct Results<TValue, TError>
{
private readonly TValue? _value;
private readonly TError? _error;

public bool IsError => !IsSuccess;
public bool IsSuccess { get; set; }

public TValue? Value => _value;
public TError? Error => _error;

private Results(TValue value)
{
IsSuccess = true;
_value = value;
}

private Results(TError error)
{
IsSuccess = false;
_error = error;
}

public static implicit operator Results<TValue, TError>(TValue value) => new(value);
public static implicit operator Results<TValue, TError>(TError error) => new(error);

public static Results<TValue, TError> CreateError(TError error) => new(error);
public static Results<TValue, TError> CreateSuccess(TValue value) => new(value);

/*
// 若要使用此方法, 请先去除 _value, _error 的 readonly 访问符
public Results<TValue, TError> WithValue(TValue value)
{
_value = value;
return this;
}

public Results<TValue, TError> WithError(TError error)
{
_error = error;
return this;
}
*/
public TResult Match<TResult>(Func<TValue, TResult> success, Func<TError, TResult> error)
=> IsSuccess ? success(_value!) : error(_error!);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// <auto-generated/>
#pragma warning disable
#nullable enable annotations

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System.Runtime.CompilerServices
{
/// <summary>
/// Reserved to be used by the compiler for tracking metadata.
/// This class should not be used by developers in source code.
/// </summary>
[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal static class IsExternalInit
{
}
}
Loading
Loading