使用 MailKit 发送邮件而不指定端口号
send mail using MailKit without specifying port number
使用 asp.net 核心 3.1
我可以使用此代码发送电子邮件:
代码片段 1 使用 System.Net.Mail.SmtpClient
using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient())
{
smtp.Host = "mail.my-real-domain-name.com";
smtp.EnableSsl = false;
NetworkCredential credential = new NetworkCredential(emailModel.From,
emailModel.Password);
smtp.UseDefaultCredentials = false;
smtp.Credentials = credential;
smtp.Send(mm);
}
但是当我尝试使用 MailKit 发送电子邮件时,它没有连接到邮件服务器
MailKit 文档中的代码片段 2
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
client.Connect("mail.my-real-domain-name.com",0,false);
client.Authenticate(emailModel.From, emailModel.Password);
client.Send(message);
client.Disconnect(true);
}
使用 MailKit 的代码片段 1 等于多少?
None 以下几行有效,所以我想知道如何使用 MailKit 发送电子邮件而不指定端口号。
它没有抛出任何错误,只是没有连接,我的意思是它停留在 client.Connect 行。
// client.Connect("mail.my-real-domain-name.com", 465);
// client.Connect("mail.my-real-domain-name.com", 465, true);
// client.Connect("mail.my-real-domain-name.com", 25, false);
// client.Connect("mail.my-real-domain-name.com", 2525, false);
// client.Connect("mail.my-real-domain-name.com", 587,MailKit.Security.SecureSocketOptions.StartTls);
如果您查看 SmtpClient.cs 参考源,在 Initialize() 方法中:
- 如果端口 == 0
- 如果有可用的 MailConfiguration XML 文件,它将使用 XML 中的指定端口(默认为端口 25):https://referencesource.microsoft.com/#System/net/System/Net/Configuration/SmtpNetworkElement.cs,e4c99455ef3ea37c
- 否则如果没有 XML 配置文件,它使用静态
defaultPort
成员,设置为 25。
因此,要获得与 System.Net.Mail 相同的行为,请使用端口 25。
MailKit 还将在 Connect()
调用中接受 port = 0,并且根据 SecureSocketOptions 参数,它会在 ComputeDefaultValues()
方法中选择一个合适的默认端口:https://github.com/jstedfast/MailKit/blob/master/MailKit/Net/Smtp/SmtpClient.cs#L1253
如果端口==0,那么如果useSsl=true或者socketOptions=SslOnConnect,会选择465端口,否则会选择25端口。
使用 asp.net 核心 3.1 我可以使用此代码发送电子邮件:
代码片段 1 使用 System.Net.Mail.SmtpClient
using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient())
{
smtp.Host = "mail.my-real-domain-name.com";
smtp.EnableSsl = false;
NetworkCredential credential = new NetworkCredential(emailModel.From,
emailModel.Password);
smtp.UseDefaultCredentials = false;
smtp.Credentials = credential;
smtp.Send(mm);
}
但是当我尝试使用 MailKit 发送电子邮件时,它没有连接到邮件服务器
MailKit 文档中的代码片段 2
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
client.Connect("mail.my-real-domain-name.com",0,false);
client.Authenticate(emailModel.From, emailModel.Password);
client.Send(message);
client.Disconnect(true);
}
使用 MailKit 的代码片段 1 等于多少?
None 以下几行有效,所以我想知道如何使用 MailKit 发送电子邮件而不指定端口号。 它没有抛出任何错误,只是没有连接,我的意思是它停留在 client.Connect 行。
// client.Connect("mail.my-real-domain-name.com", 465);
// client.Connect("mail.my-real-domain-name.com", 465, true);
// client.Connect("mail.my-real-domain-name.com", 25, false);
// client.Connect("mail.my-real-domain-name.com", 2525, false);
// client.Connect("mail.my-real-domain-name.com", 587,MailKit.Security.SecureSocketOptions.StartTls);
如果您查看 SmtpClient.cs 参考源,在 Initialize() 方法中:
- 如果端口 == 0
- 如果有可用的 MailConfiguration XML 文件,它将使用 XML 中的指定端口(默认为端口 25):https://referencesource.microsoft.com/#System/net/System/Net/Configuration/SmtpNetworkElement.cs,e4c99455ef3ea37c
- 否则如果没有 XML 配置文件,它使用静态
defaultPort
成员,设置为 25。
因此,要获得与 System.Net.Mail 相同的行为,请使用端口 25。
MailKit 还将在 Connect()
调用中接受 port = 0,并且根据 SecureSocketOptions 参数,它会在 ComputeDefaultValues()
方法中选择一个合适的默认端口:https://github.com/jstedfast/MailKit/blob/master/MailKit/Net/Smtp/SmtpClient.cs#L1253
如果端口==0,那么如果useSsl=true或者socketOptions=SslOnConnect,会选择465端口,否则会选择25端口。