Initial commit: WpywMail 自建邮件系统:.NET 8 原生 SMTP/IMAP 服务端(DKIM 签名、SPF/DKIM/DMARC 入站校验、SQLite 存储、完整账号体系)、Node 服务端、WinUI 3 客户端与 Web 前端

This commit is contained in:
WpyQwq
2026-09-19 11:19:40 +08:00
commit b8814a7615
84 changed files with 21197 additions and 0 deletions
+174
View File
@@ -0,0 +1,174 @@
<Window
x:Class="WpywMail.Client.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="Wpyw Mail">
<Grid Background="{StaticResource PageBackgroundBrush}">
<Grid x:Name="LoginView" Visibility="Visible">
<Grid.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#151515" Offset="0" />
<GradientStop Color="#20262D" Offset="1" />
</LinearGradientBrush>
</Grid.Background>
<Border Width="420" Padding="34" Background="#252525" BorderBrush="#3A3A3A" BorderThickness="1" CornerRadius="12" HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel Spacing="18">
<StackPanel Spacing="5">
<TextBlock Text="Wpyw Mail" FontSize="28" FontWeight="SemiBold" Foreground="{StaticResource TextPrimaryBrush}" />
<TextBlock Text="登录你的邮箱" FontSize="14" Foreground="{StaticResource TextSecondaryBrush}" />
</StackPanel>
<StackPanel Spacing="8">
<TextBlock Text="服务端地址" Foreground="{StaticResource TextSecondaryBrush}" />
<TextBox x:Name="ApiUrlBox" Text="http://127.0.0.1:8787/api" Style="{StaticResource TextBoxStyle}" />
</StackPanel>
<StackPanel Spacing="8">
<TextBlock Text="邮箱" Foreground="{StaticResource TextSecondaryBrush}" />
<TextBox x:Name="EmailBox" Text="[email protected]" Style="{StaticResource TextBoxStyle}" />
</StackPanel>
<StackPanel Spacing="8">
<TextBlock Text="密码" Foreground="{StaticResource TextSecondaryBrush}" />
<PasswordBox x:Name="PasswordBox" Style="{StaticResource PasswordBoxStyle}" KeyDown="PasswordBox_KeyDown" />
</StackPanel>
<Button x:Name="LoginButton" Content="登录" Click="LoginButton_Click" Style="{StaticResource PrimaryButtonStyle}" HorizontalAlignment="Stretch" />
<TextBlock x:Name="LoginStatus" TextWrapping="Wrap" Foreground="{StaticResource TextTertiaryBrush}" />
</StackPanel>
</Border>
</Grid>
<Grid x:Name="ShellView" Visibility="Collapsed">
<Grid.RowDefinitions>
<RowDefinition Height="52" />
<RowDefinition Height="44" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="#191919" Padding="12,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Spacing="10" VerticalAlignment="Center">
<Border Width="28" Height="28" CornerRadius="7" Background="{StaticResource AccentBrush}">
<TextBlock Text="W" Foreground="#101010" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<TextBlock Text="Wpyw Mail" FontSize="16" FontWeight="SemiBold" VerticalAlignment="Center" Foreground="{StaticResource TextPrimaryBrush}" />
</StackPanel>
<TextBox Grid.Column="1" x:Name="SearchBox" Width="360" HorizontalAlignment="Center" PlaceholderText="搜索邮件" Style="{StaticResource TextBoxStyle}" TextChanged="SearchBox_TextChanged" />
<StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="4" VerticalAlignment="Center">
<TextBlock x:Name="AccountText" Foreground="{StaticResource TextSecondaryBrush}" VerticalAlignment="Center" Margin="0,0,10,0" />
<Button Content="设置" Click="SettingsButton_Click" Style="{StaticResource QuietButtonStyle}" />
<Button Content="退出" Click="LogoutButton_Click" Style="{StaticResource QuietButtonStyle}" />
</StackPanel>
</Grid>
<Grid Grid.Row="1" Background="#222222" Padding="12,0">
<StackPanel Orientation="Horizontal" Spacing="8" VerticalAlignment="Center">
<Button Content="写信" Click="ComposeButton_Click" Style="{StaticResource PrimaryButtonStyle}" />
<Button Content="刷新" Click="RefreshButton_Click" Style="{StaticResource QuietButtonStyle}" />
<TextBlock x:Name="ConnectionText" VerticalAlignment="Center" Margin="8,0,0,0" Foreground="{StaticResource TextTertiaryBrush}" />
</StackPanel>
</Grid>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="58" />
<ColumnDefinition Width="220" />
<ColumnDefinition Width="360" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" Background="{StaticResource RailBackgroundBrush}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Spacing="9" Margin="0,14,0,0">
<Button Content="✉" Style="{StaticResource RailButtonStyle}" Foreground="{StaticResource AccentBrush}" />
<Button Content="✓" Style="{StaticResource RailButtonStyle}" />
<Button Content="▣" Style="{StaticResource RailButtonStyle}" />
</StackPanel>
</Grid>
<Grid Grid.Column="1" Background="#1B1B1B" Padding="12,18">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="文件夹" FontSize="16" FontWeight="SemiBold" Foreground="{StaticResource TextPrimaryBrush}" />
<Button Grid.Row="1" Content="+ 新建文件夹" Style="{StaticResource QuietButtonStyle}" HorizontalAlignment="Left" Margin="-10,12,0,8" />
<StackPanel Grid.Row="2" Spacing="2">
<Button Tag="inbox" Click="FolderButton_Click" Style="{StaticResource FolderButtonStyle}">
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="28" /><ColumnDefinition Width="*" /><ColumnDefinition Width="Auto" /></Grid.ColumnDefinitions><TextBlock Text="收件箱" Grid.Column="1" /><TextBlock x:Name="InboxCount" Text="" Grid.Column="2" Foreground="{StaticResource AccentBrush}" /></Grid>
</Button>
<Button Tag="sent" Click="FolderButton_Click" Style="{StaticResource FolderButtonStyle}"><TextBlock Text="已发送" /></Button>
<Button Tag="drafts" Click="FolderButton_Click" Style="{StaticResource FolderButtonStyle}"><TextBlock Text="草稿" /></Button>
<Button Tag="archive" Click="FolderButton_Click" Style="{StaticResource FolderButtonStyle}"><TextBlock Text="归档" /></Button>
<Button Tag="trash" Click="FolderButton_Click" Style="{StaticResource FolderButtonStyle}"><TextBlock Text="垃圾箱" /></Button>
</StackPanel>
</Grid>
<Grid Grid.Column="2" Background="#202020" BorderBrush="{StaticResource StrokeBrush}" BorderThickness="1,0,1,0">
<Grid.RowDefinitions>
<RowDefinition Height="44" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Padding="14,0">
<TextBlock x:Name="FolderTitle" Text="收件箱" FontSize="17" FontWeight="SemiBold" VerticalAlignment="Center" Foreground="{StaticResource TextPrimaryBrush}" />
<TextBlock x:Name="FolderSubtitle" Text="" HorizontalAlignment="Right" VerticalAlignment="Center" Foreground="{StaticResource TextTertiaryBrush}" />
</Grid>
<ListView Grid.Row="1" x:Name="MessageList" SelectionChanged="MessageList_SelectionChanged" SelectionMode="Single" BorderThickness="0" Background="Transparent" Padding="8,0">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Padding" Value="0" />
<Setter Property="Margin" Value="0,2" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Border Padding="12,10" CornerRadius="7" Background="{Binding Unread, Converter={StaticResource UnreadBackgroundConverter}}">
<Grid>
<Grid.ColumnDefinitions><ColumnDefinition Width="34" /><ColumnDefinition Width="*" /><ColumnDefinition Width="Auto" /></Grid.ColumnDefinitions>
<Border Width="28" Height="28" CornerRadius="14" Background="#3B4D60" VerticalAlignment="Top"><TextBlock Text="{Binding Initials}" FontSize="11" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="#E6EEF7" /></Border>
<StackPanel Grid.Column="1" Spacing="3" Margin="9,0,5,0">
<TextBlock Text="{Binding SenderName}" FontWeight="{Binding Unread, Converter={StaticResource UnreadWeightConverter}}" Foreground="{StaticResource TextPrimaryBrush}" TextTrimming="CharacterEllipsis" />
<TextBlock Text="{Binding Subject}" Foreground="{StaticResource TextSecondaryBrush}" TextTrimming="CharacterEllipsis" />
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Text="{Binding Preview}" Foreground="{StaticResource TextTertiaryBrush}" FontSize="12" TextTrimming="CharacterEllipsis" />
<TextBlock Text="{Binding DeliveryStatusLabel}" Foreground="{StaticResource AccentBrush}" FontSize="11" />
</StackPanel>
</StackPanel>
<TextBlock Grid.Column="2" Text="{Binding DateLabel}" FontSize="11" Foreground="{StaticResource TextTertiaryBrush}" />
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
<Grid Grid.Column="3" Background="#242424" Padding="30,26">
<Grid x:Name="EmptyReadingPane" Visibility="Visible">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="8">
<TextBlock Text="选择一封邮件" FontSize="22" Foreground="{StaticResource TextPrimaryBrush}" HorizontalAlignment="Center" />
<TextBlock Text="邮件内容会显示在这里" Foreground="{StaticResource TextTertiaryBrush}" HorizontalAlignment="Center" />
</StackPanel>
</Grid>
<ScrollViewer x:Name="ReadingPane" Visibility="Collapsed" VerticalScrollBarVisibility="Auto">
<StackPanel Spacing="18">
<StackPanel Spacing="7">
<TextBlock x:Name="ReadingSubject" FontSize="26" FontWeight="SemiBold" Foreground="{StaticResource TextPrimaryBrush}" TextWrapping="Wrap" />
<StackPanel Orientation="Horizontal" Spacing="9">
<Border Width="30" Height="30" CornerRadius="15" Background="#3B4D60"><TextBlock x:Name="ReadingInitials" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="#E6EEF7" /></Border>
<StackPanel><TextBlock x:Name="ReadingFrom" Foreground="{StaticResource TextPrimaryBrush}" /><TextBlock x:Name="ReadingDate" Foreground="{StaticResource TextTertiaryBrush}" FontSize="12" /></StackPanel>
</StackPanel>
</StackPanel>
<Border Height="1" Background="{StaticResource StrokeBrush}" />
<TextBlock x:Name="ReadingBody" TextWrapping="Wrap" FontSize="15" LineHeight="24" Foreground="{StaticResource TextSecondaryBrush}" />
</StackPanel>
</ScrollViewer>
</Grid>
</Grid>
</Grid>
</Grid>
</Window>