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 { /// /// 解析url查询字符串,支持&&转义为&,所以和标准规范有出入 /// 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; } } }