在尝试将 hMailServer 配置为从 C# 发送电子邮件时,我偶然发现了这个问题。我尝试了以下方法:
- C# SmtpClient - 不适用于隐式 SSL - 请参阅此问题和答案
- AegisImplicitMail from here - 无法使用 UTF-8 字符串(我的字符串中有变音符号)
- MailKit 从这里开始- 非常强大和成熟,使用它没有问题
我的目标是:
- 体面的安全
- 能够向主流电子邮件提供商(例如 Google、Yahoo)发送电子邮件并到达收件箱
- 能够接收来自主流电子邮件提供商的电子邮件
C# 代码
public void MailKitSend(string senderEmail, string senderName, string subject, string bodyText, string receivers, string receiversCc)
{
// no receivers, no e-mail is sent
if (string.IsNullOrEmpty(receivers))
return;
var msg = new MimeMessage();
msg.From.Add(new MailboxAddress(Encoding.UTF8, senderName, senderEmail));
msg.Subject = subject;
var bb = new BodyBuilder {HtmlBody = bodyText};
msg.Body = bb.ToMessageBody();
IList<string> receiversEmails = receivers.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (string receiver in receiversEmails)
msg.To.Add(new MailboxAddress(Encoding.UTF8, "", receiver));
if (!string.IsNullOrEmpty(receiversCc))
{
IList<string> receiversEmailsCc = receiversCc.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (string receiverCc in receiversEmailsCc)
msg.Cc.Add(new MailboxAddress(Encoding.UTF8, "", receiverCc));
}
try
{
var sc = new MailKit.Net.Smtp.SmtpClient();
if (!string.IsNullOrWhiteSpace(SmtpUser) && !string.IsNullOrWhiteSpace(SmtpPassword))
{
sc.Connect(SmtpServer, 465);
sc.Authenticate(SmtpUser, SmtpPassword);
}
sc.Send(msg);
sc.Disconnect(true);
}
catch (Exception exc)
{
string err = $"Error sending e-mail from {senderEmail} ({senderName}) to {receivers}: {exc}";
throw new ApplicationException(err);
}
}
hMailServer 配置
1)开放端口——开放25、143、465、995,保证可以收发邮件
2) TCP/IP 端口配置
SMTP / 0.0.0.0 / port 25 / no security (allow receiving start process)
SMTP / 0.0.0.0 / port 465 / SSL/TLS security (must define a SSL certificate)
POP3 / 0.0.0.0 / port 995 / SSL/TLS security (use the same SSL certificate)
3)预 C# 测试
从 hMailServer 管理员运行诊断程序
使用允许手动配置各种设置的电子邮件客户端,例如每个协议的端口、安全性。我用过雷鸟。包括向外部提供商发送电子邮件和从他们那里接收电子邮件(我已经尝试过使用 Gmail)。
我没有更改 IP 范围,只保留了隐含的范围(我的电脑和 Internet)。