.net update, implemented base session, added test client
This commit is contained in:
parent
e0b732267b
commit
7b147569e0
11 changed files with 371 additions and 41 deletions
276
tests/smtpclient/Program.cs
Normal file
276
tests/smtpclient/Program.cs
Normal file
|
|
@ -0,0 +1,276 @@
|
|||
using System.Data;
|
||||
using System.Net;
|
||||
using System.Net.Mail;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
|
||||
namespace SmtpClient;
|
||||
|
||||
internal class Program
|
||||
{
|
||||
private static string? _host = null;
|
||||
private static string? _username = null;
|
||||
private static string? _password = null;
|
||||
private static string? _from = null;
|
||||
private static List<string>? _rcpts = [];
|
||||
private static List<string>? _rcptsCc = [];
|
||||
private static string? _subject = null;
|
||||
private static string? _body = null;
|
||||
private static bool _secure = false;
|
||||
|
||||
static async Task Main()
|
||||
{
|
||||
Console.WriteLine("Relay Test Client");
|
||||
|
||||
Console.WriteLine("\nSelect Input:");
|
||||
Console.WriteLine("\t1-Static");
|
||||
Console.WriteLine("\t2-Interactive");
|
||||
|
||||
switch (Console.ReadKey().Key)
|
||||
{
|
||||
case ConsoleKey.D1:
|
||||
case ConsoleKey.NumPad1:
|
||||
StaticInput();
|
||||
break;
|
||||
case ConsoleKey.D2:
|
||||
case ConsoleKey.NumPad2:
|
||||
InteractiveInput();
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine("\nSelect Method:");
|
||||
Console.WriteLine("\t1-Single Mail");
|
||||
Console.WriteLine("\t2-Single Mail (Raw Pipelined)");
|
||||
Console.WriteLine("\t3-Mutli Mail");
|
||||
|
||||
try
|
||||
{
|
||||
switch (Console.ReadKey(true).Key)
|
||||
{
|
||||
case ConsoleKey.D1:
|
||||
case ConsoleKey.NumPad1:
|
||||
await SendAsync();
|
||||
break;
|
||||
case ConsoleKey.D2:
|
||||
case ConsoleKey.NumPad2:
|
||||
await SendPipelinedAsync();
|
||||
break;
|
||||
case ConsoleKey.D3:
|
||||
case ConsoleKey.NumPad3:
|
||||
await SendMultiAsync();
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine("\nUndefined Method");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
static void StaticInput()
|
||||
{
|
||||
_host = "localhost:2525"?.Trim();
|
||||
_secure = false;
|
||||
_username = "relay@example.local";
|
||||
_password = "supersecret";
|
||||
_from = "me@example.local"?.Trim();
|
||||
_rcpts = "noreply@example.local"?.Trim()?.Split(';').ToList();
|
||||
_rcptsCc = [];
|
||||
_subject = "Testnachricht";
|
||||
_body = "Das ist eine Testnachricht.";
|
||||
}
|
||||
|
||||
static void InteractiveInput()
|
||||
{
|
||||
Console.WriteLine("\nEnter Relay Host: ");
|
||||
_host = Console.ReadLine()?.Trim();
|
||||
|
||||
Console.WriteLine("\nEnter Username (Optional): ");
|
||||
_username = Console.ReadLine()?.Trim();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(_username))
|
||||
{
|
||||
Console.WriteLine("\nEnter Password: ");
|
||||
_password = Console.ReadLine()?.Trim();
|
||||
}
|
||||
|
||||
Console.WriteLine("\nEnter Sender:");
|
||||
_from = Console.ReadLine()?.Trim();
|
||||
|
||||
Console.WriteLine("\nEnter Receiver (delimit with ';'):");
|
||||
_rcpts = Console.ReadLine()?.Trim()?.Split(';').ToList();
|
||||
|
||||
Console.WriteLine("\nEnter Cc Receiver (delimit with ';'):");
|
||||
_rcptsCc = Console.ReadLine()?.Trim()?.Split(';').ToList();
|
||||
|
||||
Console.WriteLine("\nEnter Subject:");
|
||||
_subject = Console.ReadLine()?.Trim();
|
||||
|
||||
Console.WriteLine("\nEnter Body:");
|
||||
_body = Console.ReadLine()?.Trim();
|
||||
}
|
||||
|
||||
static async Task SendAsync()
|
||||
{
|
||||
var from = new MailAddress(_from!);
|
||||
var to = _rcpts!.Select(p => new MailAddress(p)).ToList();
|
||||
var cc = _rcptsCc!.Select(p => new MailAddress(p)).ToList();
|
||||
|
||||
var firstTo = to.First();
|
||||
to.Remove(firstTo);
|
||||
|
||||
using var message = new MailMessage(from, firstTo)
|
||||
{
|
||||
Priority = MailPriority.Normal,
|
||||
Subject = _subject ?? "Undefined",
|
||||
IsBodyHtml = false,
|
||||
Body = _body ?? string.Empty,
|
||||
};
|
||||
|
||||
foreach (var x in to)
|
||||
message.To.Add(x);
|
||||
|
||||
foreach (var x in cc)
|
||||
message.CC.Add(x);
|
||||
|
||||
message.Attachments.Add(new Attachment("attachment.txt"));
|
||||
|
||||
var credential = new NetworkCredential();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(_username))
|
||||
{
|
||||
credential.UserName = _username;
|
||||
credential.Password = _password;
|
||||
}
|
||||
|
||||
var host = _host;
|
||||
var port = 25;
|
||||
|
||||
if (_host!.Contains(':'))
|
||||
{
|
||||
host = _host.Split(':')[0];
|
||||
port = int.Parse(_host.Split(":")[1]);
|
||||
}
|
||||
|
||||
using var smtp = new System.Net.Mail.SmtpClient(host, port)
|
||||
{
|
||||
UseDefaultCredentials = false,
|
||||
Credentials = credential,
|
||||
EnableSsl = _secure,
|
||||
DeliveryMethod = SmtpDeliveryMethod.Network
|
||||
};
|
||||
|
||||
await smtp.SendMailAsync(message);
|
||||
}
|
||||
|
||||
static async Task SendMultiAsync()
|
||||
{
|
||||
var from = new MailAddress(_from!);
|
||||
var to = _rcpts!.Select(p => new MailAddress(p)).ToList();
|
||||
var cc = _rcptsCc!.Select(p => new MailAddress(p)).ToList();
|
||||
|
||||
var firstTo = to.First();
|
||||
to.Remove(firstTo);
|
||||
|
||||
using var message = new MailMessage(from, firstTo)
|
||||
{
|
||||
Priority = MailPriority.Normal,
|
||||
Subject = _subject ?? "Undefined",
|
||||
IsBodyHtml = false,
|
||||
Body = _body ?? string.Empty
|
||||
};
|
||||
|
||||
foreach (var x in to)
|
||||
message.To.Add(x);
|
||||
|
||||
foreach (var x in cc)
|
||||
message.CC.Add(x);
|
||||
|
||||
message.Attachments.Add(new Attachment("attachment.txt"));
|
||||
|
||||
var credential = new NetworkCredential();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(_username))
|
||||
{
|
||||
credential.UserName = _username;
|
||||
credential.Password = _password;
|
||||
}
|
||||
|
||||
var host = _host;
|
||||
var port = 25;
|
||||
|
||||
if (_host!.Contains(':'))
|
||||
{
|
||||
host = _host.Split(':')[0];
|
||||
port = int.Parse(_host.Split(":")[1]);
|
||||
}
|
||||
|
||||
using var smtp = new System.Net.Mail.SmtpClient(host, port)
|
||||
{
|
||||
UseDefaultCredentials = false,
|
||||
Credentials = credential,
|
||||
EnableSsl = _secure,
|
||||
DeliveryMethod = SmtpDeliveryMethod.Network
|
||||
};
|
||||
|
||||
await smtp.SendMailAsync(message);
|
||||
await smtp.SendMailAsync(message);
|
||||
}
|
||||
|
||||
static async Task SendPipelinedAsync()
|
||||
{
|
||||
var raw = "EHLO SmtpClient\r\n";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(_username))
|
||||
{
|
||||
raw += $"AUTH PLAIN {Convert.ToBase64String(Encoding.UTF8.GetBytes($"\0{_username}\0{_password}"))}\r\n";
|
||||
}
|
||||
|
||||
raw += $"MAIL FROM:<{_from}> SIZE=512\r\n";
|
||||
|
||||
foreach (var rcpt in _rcpts!)
|
||||
{
|
||||
raw += $"RCPT TO:<{rcpt}>\r\n";
|
||||
}
|
||||
|
||||
raw += "DATA\r\n";
|
||||
raw += "MIME-Version: 1.0\r\n";
|
||||
raw += $"From: {_from}\r\n";
|
||||
raw += $"To: {string.Join(", ", _rcpts!)}\r\n";
|
||||
|
||||
if (_rcptsCc != null && _rcptsCc.Count > 0)
|
||||
{
|
||||
raw += $"Cc: {string.Join(", ", _rcptsCc!)}\r\n";
|
||||
}
|
||||
|
||||
raw += "Date: 29 Oct 2025 21:10:56 +0100\r\n";
|
||||
raw += $"Subject:{_subject}\r\n";
|
||||
raw += "\r\n" ;
|
||||
raw += $"{_body}";
|
||||
raw += "\r\n.\r\n";
|
||||
raw += "QUIT\r\n";
|
||||
|
||||
var bytes = Encoding.ASCII.GetBytes(raw);
|
||||
var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
|
||||
var host = _host;
|
||||
var port = 25;
|
||||
|
||||
if (_host!.Contains(':'))
|
||||
{
|
||||
host = _host.Split(':')[0];
|
||||
port = int.Parse(_host.Split(":")[1]);
|
||||
}
|
||||
|
||||
await sock.ConnectAsync(host!, port);
|
||||
await sock.SendAsync(bytes);
|
||||
|
||||
Console.WriteLine("wait 3 seconds...");
|
||||
await Task.Delay(3000);
|
||||
}
|
||||
}
|
||||
1
tests/smtpclient/attachment.txt
Normal file
1
tests/smtpclient/attachment.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
test
|
||||
23
tests/smtpclient/smtpclient.csproj
Normal file
23
tests/smtpclient/smtpclient.csproj
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<Product>SmtpClient</Product>
|
||||
<AssemblyName>smtp_client</AssemblyName>
|
||||
<AssemblyVersion>2025.12.3.0</AssemblyVersion>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<RootNamespace>SmtpClient</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
||||
<InvariantGlobalization>true</InvariantGlobalization>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="attachment.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Loading…
Add table
Add a link
Reference in a new issue