168 lines
5.1 KiB
C#
168 lines
5.1 KiB
C#
using System;
|
|
using System.Collections.Specialized;
|
|
using System.Windows.Forms;
|
|
using YLErp.MailKit;
|
|
|
|
namespace YLMailTest
|
|
{
|
|
public partial class FormMail : Form
|
|
{
|
|
public FormMail()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void button1_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
int port = 25;
|
|
var strPort = tbPort.Text.Trim();
|
|
if (!string.IsNullOrEmpty(tbPort.Text) && !int.TryParse(tbPort.Text, out port))
|
|
{
|
|
MessageBox.Show("解析端口失败:" + tbPort.Text);
|
|
return;
|
|
}
|
|
|
|
var smtpConfig = new SmtpConfig
|
|
{
|
|
EnableSsl = chkSSL.Checked,
|
|
From = tbFrom.Text.Trim(),
|
|
Password = tbPassword.Text,
|
|
Port = port,
|
|
Receipt = chkReceipt.Checked,
|
|
Server = tbServer.Text.Trim(),
|
|
UserName = tbUserName.Text.Trim(),
|
|
ZipAttach = false
|
|
};
|
|
var mailSubject = tbMailSubject.Text.Trim();
|
|
var mailBody = tbMailBody.Text.Trim();
|
|
MailSender.Send(smtpConfig, new MailSendingOption
|
|
{
|
|
MailTo = new[] { tbMailTo.Text.Trim() },
|
|
Subject = string.IsNullOrEmpty(mailSubject) ? "测试邮件发送" : mailSubject,
|
|
Body = string.IsNullOrEmpty(mailBody) ? "测试邮件发送" : mailBody,
|
|
IsBodyHtml = false,
|
|
FilesToAttach = null,
|
|
CC = null
|
|
});
|
|
MessageBox.Show("邮件发送成功");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show("邮件发送失败:\r\n" + ex.ToString());
|
|
}
|
|
}
|
|
|
|
private void button2_Click(object sender, EventArgs e)
|
|
{
|
|
var str = textBox1.Text;
|
|
|
|
if (string.IsNullOrWhiteSpace(str))
|
|
{
|
|
return;
|
|
}
|
|
|
|
SmtpConfig sc;
|
|
|
|
var index = str.IndexOf("[|]");
|
|
if (index > 0)
|
|
{
|
|
str = str.Substring(0, index);
|
|
}
|
|
var nv = UrlHelper.ParseQueryString(str, true);
|
|
|
|
chkSSL.Checked = nv[nameof(sc.EnableSsl)]?.ToLowerInvariant() == "true";
|
|
chkReceipt.Checked = nv[nameof(sc.Receipt)]?.ToLowerInvariant() == "true";
|
|
|
|
tbServer.Text = nv[nameof(sc.Server)];
|
|
tbPort.Text = nv[nameof(sc.Port)];
|
|
|
|
tbFrom.Text = nv[nameof(sc.From)];
|
|
tbUserName.Text = nv[nameof(sc.UserName)];
|
|
tbPassword.Text = nv[nameof(sc.Password)];
|
|
}
|
|
}
|
|
|
|
public static class UrlHelper
|
|
{
|
|
/// <summary>
|
|
/// 解析url查询字符串,支持&&转义为&,所以和标准规范有出入
|
|
/// </summary>
|
|
public static NameValueCollection ParseQueryString(string query, bool urlencoded = false)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(query))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var len = query.Length;
|
|
var buf = new char[len + 2];
|
|
query.CopyTo(0, buf, 0, len);
|
|
|
|
//在下面的循环中正好排除最后一个处理
|
|
buf[len++] = '&';
|
|
buf[len++] = 'm';
|
|
|
|
var startPos = 0;
|
|
var hasEscape = false;
|
|
var nv = new NameValueCollection(10);
|
|
|
|
for (var index = 0; index < len; index++)
|
|
{
|
|
if (buf[index] != '&')
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!urlencoded && buf[index + 1] == '&')
|
|
{
|
|
index++;
|
|
hasEscape = true;
|
|
continue;
|
|
}
|
|
|
|
var index2 = startPos;
|
|
startPos = index + 1;
|
|
var substr = new string(buf, index2, index - index2).Trim();
|
|
|
|
if (substr.Length == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (hasEscape)
|
|
{
|
|
hasEscape = false;
|
|
substr = substr.Replace("&&", "&");
|
|
}
|
|
|
|
index2 = substr.IndexOf('=');
|
|
|
|
if (index2 > 0)
|
|
{
|
|
var key = substr.Substring(0, index2);
|
|
var value = substr.Substring(index2 + 1);
|
|
if (urlencoded)
|
|
{
|
|
key = Uri.UnescapeDataString(key);
|
|
value = Uri.UnescapeDataString(value);
|
|
}
|
|
nv.Add(key.Trim(), value.Trim());
|
|
}
|
|
else
|
|
{
|
|
var key = substr;
|
|
if (urlencoded)
|
|
{
|
|
key = Uri.UnescapeDataString(key);
|
|
}
|
|
nv.Add(key.Trim(), string.Empty);
|
|
}
|
|
}
|
|
|
|
return nv;
|
|
}
|
|
}
|
|
}
|