Is there a way with the .NET Framework to send emails through an SSL SMTP server on port 465?
.NET框架有办法通过端口465上的SSL SMTP服务器发送电子邮件吗?
The usual way:
通常的方法:
System.Net.Mail.SmtpClient _SmtpServer = new System.Net.Mail.SmtpClient("tempurl.org");
_SmtpServer.Port = 465;
_SmtpServer.EnableSsl = true;
_SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
_SmtpServer.Timeout = 5000;
_SmtpServer.UseDefaultCredentials = false;
MailMessage mail = new MailMessage();
mail.From = new MailAddress(from);
mail.To.Add(to);
mail.CC.Add(cc);
mail.Subject = subject;
mail.Body = content;
mail.IsBodyHtml = useHtml;
_SmtpServer.Send(mail);
times out:
超时:
System.Net Verbose: 0 : [1024] SmtpClient::.ctor(host=ssl0.ovh.net, port=465)
System.Net Information: 0 : [1024] Associating SmtpClient#64923656 with SmtpTransport#44624228
System.Net Verbose: 0 : [1024] Exiting SmtpClient::.ctor() -> SmtpClient#64923656
System.Net Information: 0 : [1024] Associating MailMessage#17654054 with Message#52727599
System.Net Verbose: 0 : [1024] SmtpClient#64923656::Send(MailMessage#17654054)
System.Net Information: 0 : [1024] SmtpClient#64923656::Send(DeliveryMethod=Network)
System.Net Information: 0 : [1024] Associating SmtpClient#64923656 with MailMessage#17654054
System.Net Information: 0 : [1024] Associating SmtpTransport#44624228 with SmtpConnection#14347911
System.Net Information: 0 : [1024] Associating SmtpConnection#14347911 with ServicePoint#51393439
System.Net.Sockets Verbose: 0 : [1024] Socket#26756241::Socket(InterNetwork#2)
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#26756241::Socket()
System.Net.Sockets Verbose: 0 : [1024] Socket#23264094::Socket(InterNetworkV6#23)
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#23264094::Socket()
System.Net.Sockets Verbose: 0 : [1024] Socket#26756241::Connect(20:465#337754884)
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#26756241::Connect()
System.Net.Sockets Verbose: 0 : [1024] Socket#23264094::Close()
System.Net.Sockets Verbose: 0 : [1024] Socket#23264094::Dispose()
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#23264094::Close()
System.Net Information: 0 : [1024] Associating SmtpConnection#14347911 with SmtpPooledStream#14303791
System.Net.Sockets Verbose: 0 : [1024] Socket#26756241::Receive()
System.Net.Sockets Verbose: 0 : [2404] Socket#26756241::Dispose()
System.Net.Sockets Error: 0 : [1024] Exception in the Socket#26756241::Receive - A blocking operation was interrupted by a call to WSACancelBlockingCall
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#26756241::Receive() -> 0#0
System.Net Error: 0 : [1024] Exception in the SmtpClient#64923656::Send - Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall.
System.Net Error: 0 : [1024] at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.DelegatedStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.BufferedReadStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
System.Net Verbose: 0 : [1024] Exiting SmtpClient#64923656::Send()
System.Net Information: 0 : [1024] Associating MailMessage#49584532 with Message#19699911
I googled around and found that System.Net.Mail supports connections on port 587 (default port for Explicit SSL that starts unencrypted then issues a STARTDLS then switches to an Encrypted connection: RFC 2228), but doesn't support Implicit SSL (entire connection is wrapped in an SSL layer)...
我搜索了一下,找到了System.Net。邮件支持端口587上的连接(显式SSL的默认端口,该端口开始未加密,然后发出STARTDLS,然后切换到加密连接:RFC 2228),但不支持隐式SSL(整个连接被封装在SSL层中)……
11 个解决方案
#1
32
Here is an example of how to send email through GMail which also uses SSL/465. Minor tweaking of the code below should work!
下面是如何通过GMail发送电子邮件的示例,GMail也使用SSL/465。对下面的代码稍加修改就可以了!
using System.Web.Mail;
using System;
public class MailSender
{
public static bool SendEmail(
string pGmailEmail,
string pGmailPassword,
string pTo,
string pSubject,
string pBody,
System.Web.Mail.MailFormat pFormat,
string pAttachmentPath)
{
try
{
System.Web.Mail.MailMessage myMail = new System.Web.Mail.MailMessage();
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpserver",
"smtp.gmail.com");
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpserverport",
"465");
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendusing",
"2");
//sendusing: cdoSendUsingPort, value 2, for sending the message using
//the network.
//smtpauthenticate: Specifies the mechanism used when authenticating
//to an SMTP
//service over the network. Possible values are:
//- cdoAnonymous, value 0. Do not authenticate.
//- cdoBasic, value 1. Use basic clear-text authentication.
//When using this option you have to provide the user name and password
//through the sendusername and sendpassword fields.
//- cdoNTLM, value 2. The current process security context is used to
// authenticate with the service.
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate","1");
//Use 0 for anonymous
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendusername",
pGmailEmail);
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendpassword",
pGmailPassword);
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpusessl",
"true");
myMail.From = pGmailEmail;
myMail.To = pTo;
myMail.Subject = pSubject;
myMail.BodyFormat = pFormat;
myMail.Body = pBody;
if (pAttachmentPath.Trim() != "")
{
MailAttachment MyAttachment =
new MailAttachment(pAttachmentPath);
myMail.Attachments.Add(MyAttachment);
myMail.Priority = System.Web.Mail.MailPriority.High;
}
System.Web.Mail.SmtpMail.SmtpServer = "smtp.gmail.com:465";
System.Web.Mail.SmtpMail.Send(myMail);
return true;
}
catch (Exception ex)
{
throw;
}
}
}
#2
10
I'm late to this party but I'll offer my approach for any passersby that might be interested in an alternative.
我参加这个派对很晚了,但我会为任何可能对另一种选择感兴趣的路人提供我的方法。
As noted in previous answers, the System.Net.Mail
SmtpClient
class does not support Implicit SSL. It does support Explicit SSL, which requires an insecure connection to the SMTP server over port 25 in order to negotiate the transport level security (TLS). I blogged about my travails with this subtlety here.
如前所述,System.Net。邮件SmtpClient类不支持隐式SSL。它确实支持显式SSL,它需要通过端口25与SMTP服务器进行不安全连接,以便协商传输层安全性(TLS)。我在博客上写了关于我的辛苦的经历。
In short, SMTP over Implict SSL port 465 requires TLS to be negotiated before connecting to the SMTP server. Rather than write a .Net SMTPS implementation I turned to a utility named Stunnel. It's a small service that will let you redirect traffic on a local port to a remote port via SSL.
简而言之,SMTP对Implict SSL端口465的要求需要在连接到SMTP服务器之前进行协商。我没有编写。net SMTPS实现,而是转向了一个名为Stunnel的实用程序。它是一个小服务,可以让您通过SSL将本地端口上的通信重定向到远程端口。
DISCLAIMER: Stunnel uses portions of the OpenSSL library, which recently had a high-profile exploit published in all major tech news media. I believe the latest version uses the patched OpenSSL but please use at your own risk.
免责声明:Stunnel使用了OpenSSL库的一部分,该库最近在所有主要科技新闻媒体上发布了一个引人注目的漏洞。我相信最新的版本使用了修补过的OpenSSL,但请自行使用。
Once the utility is installed a small addition to the configuration file:
一旦安装了这个实用程序,配置文件就会有一个小的添加:
; Example SSL client mode services
[my-smtps]
client = yes
accept = 127.0.0.1:465
connect = mymailserver.com:465
...instructs the Stunnel service to reroute local requests to port 465 to my mail server on port 465. This happens over TLS, which satisfies the SMTP server on the other end.
…指示Stunnel服务将本地请求重新路由到端口465到端口465上的邮件服务器。这发生在TLS上,它满足另一端的SMTP服务器。
Using this utility, the following code will successfully transmit over port 465:
使用此实用程序,以下代码将成功地在端口465上传输:
using System;
using System.Net;
using System.Net.Mail;
namespace RSS.SmtpTest
{
class Program
{
static void Main( string[] args )
{
try {
using( SmtpClient smtpClient = new SmtpClient( "localhost", 465 ) ) { // <-- note the use of localhost
NetworkCredential creds = new NetworkCredential( "username", "password" );
smtpClient.Credentials = creds;
MailMessage msg = new MailMessage( "joe@schmoe.com", "jane@schmoe.com", "Test", "This is a test" );
smtpClient.Send( msg );
}
}
catch( Exception ex ) {
Console.WriteLine( ex.Message );
}
}
}
}
So the advantage here is that you can use Implict SSL and port 465 as the security protocol while still using the send mail methods built into the framework. The disadvantage is that it requires the use of a third party service that may not be useful for anything but this specific function.
因此,这里的优点是,您可以使用Implict SSL和端口465作为安全协议,同时仍然使用框架内置的send mail方法。缺点是,它需要使用第三方服务,除了这个特定的功能之外,这些服务可能对任何东西都没有用处。
#3
9
It works with System.Web.Mail (which is marked as obsolete):
它适用于包含。邮件(注明已作废):
private const string SMTP_SERVER = "http://schemas.microsoft.com/cdo/configuration/smtpserver";
private const string SMTP_SERVER_PORT = "http://schemas.microsoft.com/cdo/configuration/smtpserverport";
private const string SEND_USING = "http://schemas.microsoft.com/cdo/configuration/sendusing";
private const string SMTP_USE_SSL = "http://schemas.microsoft.com/cdo/configuration/smtpusessl";
private const string SMTP_AUTHENTICATE = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate";
private const string SEND_USERNAME = "http://schemas.microsoft.com/cdo/configuration/sendusername";
private const string SEND_PASSWORD = "http://schemas.microsoft.com/cdo/configuration/sendpassword";
System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
mail.Fields[SMTP_SERVER] = "tempurl.org";
mail.Fields[SMTP_SERVER_PORT] = 465;
mail.Fields[SEND_USING] = 2;
mail.Fields[SMTP_USE_SSL] = true;
mail.Fields[SMTP_AUTHENTICATE] = 1;
mail.Fields[SEND_USERNAME] = "username";
mail.Fields[SEND_PASSWORD] = "password";
System.Web.Mail.SmtpMail.Send(mail);
What is your point of view regarding obsolete namespace usage?
关于过时的名称空间使用,您的观点是什么?
#4
5
Try to check this free an open source alternative https://www.nuget.org/packages/AIM It is free to use and open source and uses the exact same way that System.Net.Mail is using To send email to implicit ssl ports you can use following code
试着检查这个免费的开源替代品https://www.nuget.org/packages/AIM它是免费使用和开源的,使用方式和System.Net完全一样。邮件用于将电子邮件发送到隐式ssl端口,您可以使用以下代码
public static void SendMail()
{
var mailMessage = new MimeMailMessage();
mailMessage.Subject = "test mail";
mailMessage.Body = "hi dude!";
mailMessage.Sender = new MimeMailAddress("you@gmail.com", "your name");
mailMessage.To.Add(new MimeMailAddress("yourfriend@gmail.com", "your friendd's name"));
// You can add CC and BCC list using the same way
mailMessage.Attachments.Add(new MimeAttachment("your file address"));
//Mail Sender (Smtp Client)
var emailer = new SmtpSocketClient();
emailer.Host = "your mail server address";
emailer.Port = 465;
emailer.SslType = SslMode.Ssl;
emailer.User = "mail sever user name";
emailer.Password = "mail sever password" ;
emailer.AuthenticationMode = AuthenticationType.Base64;
// The authentication types depends on your server, it can be plain, base 64 or none.
//if you do not need user name and password means you are using default credentials
// In this case, your authentication type is none
emailer.MailMessage = mailMessage;
emailer.OnMailSent += new SendCompletedEventHandler(OnMailSent);
emailer.SendMessageAsync();
}
// A simple call back function:
private void OnMailSent(object sender, AsyncCompletedEventArgs asynccompletedeventargs)
{
if (e.UserState!=null)
Console.Out.WriteLine(e.UserState.ToString());
if (e.Error != null)
{
MessageBox.Show(e.Error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (!e.Cancelled)
{
MessageBox.Show("Send successfull!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
#5
4
If it's Implicit SSL, it looks like it can't be done with System.Net.Mail and isn't supported as of yet.
如果它是隐式SSL,那么看起来它不能用System.Net完成。目前还不支持邮件和邮件。
http://blogs.msdn.com/webdav_101/archive/2008/06/02/system -网-邮件- - ssl - -对-港- 465. - aspx进行身份验证
To check if it's Implicit SSL try this.
要检查它是否是隐式SSL,请尝试此操作。
#6
4
You can also connect via port 465, but due to some limitations of the System.Net.Mail namespace you may have to alter your code. This is because the namespace does not offer the ability to make implicit SSL connections. This is discussed at http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx.
您也可以通过端口465进行连接,但是由于System.Net的一些限制。可能需要更改代码的邮件名称空间。这是因为名称空间不提供进行隐式SSL连接的能力。这在http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with- sslto -authenticate- port-465.aspx中有讨论。
It is possible to make implicit connections without having to use the now obsolete System.Web.Mail namespace, but you have to access the Microsoft CDO (Collaborative Data Object). I have supplied an example of how to use the CDO in another discussion (GMail SMTP via C# .Net errors on all ports).
不需要使用现在已经过时的System.Web就可以进行隐式连接。邮件名称空间,但您必须访问Microsoft CDO(协作数据对象)。我在另一个讨论中提供了如何使用CDO的示例(GMail SMTP通过c# . net错误在所有端口上)。
Hope this helps!
希望这可以帮助!
#7
4
In VB.NET while trying to connect to Rackspace's SSL port on 465 I encountered the same issue (requires implicit SSL). I made use of https://www.nuget.org/packages/MailKit/ in order to successfully connect.
在VB。在尝试连接Rackspace的465 SSL端口时,我遇到了同样的问题(需要隐式SSL)。为了成功连接,我使用了https://www.nuget.org/packages/MailKit/。
The following is an example of an HTML email message.
下面是一个HTML电子邮件消息的示例。
Imports MailKit.Net.Smtp
Imports MailKit
Imports MimeKit
Sub somesub()
Dim builder As New BodyBuilder()
Dim mail As MimeMessage
mail = New MimeMessage()
mail.From.Add(New MailboxAddress("", c_MailUser))
mail.To.Add(New MailboxAddress("", c_ToUser))
mail.Subject = "Mail Subject"
builder.HtmlBody = "<html><body>Body Text"
builder.HtmlBody += "</body></html>"
mail.Body = builder.ToMessageBody()
Using client As New SmtpClient
client.Connect(c_MailServer, 465, True)
client.AuthenticationMechanisms.Remove("XOAUTH2") ' Do not use OAUTH2
client.Authenticate(c_MailUser, c_MailPassword) ' Use a username / password to authenticate.
client.Send(mail)
client.Disconnect(True)
End Using
End Sub
#8
1
I know I'm joining late to the discussion, but I think this can be useful to others.
我知道我参加讨论的时间很晚,但我认为这对其他人是有用的。
I wanted to avoid deprecated stuff and after a lot of fiddling I found a simple way to send to servers requiring Implicit SSL: use NuGet and add the MailKit package to the project. (I used VS2017 targetting .NET 4.6.2 but it should work on lower .NET versions...)
我想避免被弃用的东西,在做了很多修改之后,我找到了一种简单的方法来发送到需要隐式SSL的服务器:使用NuGet并将MailKit包添加到项目中。(我使用了VS2017 target .NET 4.6.2,但是它应该适用于较低的。net版本…)
Then you'll only need to do something like this:
那么你只需要做这样的事情:
using MailKit.Net.Smtp;
using MimeKit;
var client = new SmtpClient();
client.Connect("server.name", 465, true);
// Note: since we don't have an OAuth2 token, disable the XOAUTH2 authentication mechanism.
client.AuthenticationMechanisms.Remove ("XOAUTH2");
if (needsUserAndPwd)
{
// Note: only needed if the SMTP server requires authentication
client.Authenticate (user, pwd);
}
var msg = new MimeMessage();
msg.From.Add(new MailboxAddress("sender@ema.il"));
msg.To .Add(new MailboxAddress("target@ema.il"));
msg.Subject = "This is a test subject";
msg.Body = new TextPart("plain") {
Text = "This is a sample message body"
};
client.Send(msg);
client.Disconnect(true);
Of course you can also tweak it to use Explicit SSL or no transport security at all.
当然,您也可以对它进行调整,以使用显式SSL或根本不使用传输安全性。
#9
1
As stated in a comment at
如在评论中所述
http://blogs.msdn.com/webdav_101/archive/2008/06/02/system -网-邮件- - ssl - -对-港- 465. - aspx进行身份验证
with System.Net.Mail, use port 25 instead of 465:
与System.Net。邮件,使用端口25代替465:
You must set SSL=true and Port=25. Server responds to your request from unprotected 25 and then throws connection to protected 465.
您必须设置SSL=true,端口=25。服务器响应您的请求,从不受保护的25,然后抛出连接保护465。
#10
0
For gmail these settings worked for me, the ServicePointManager.SecurityProtocol line was necessary. Because I has setup 2 step verification I needed get a App Password from google app password generator. SmtpClient mailer = new SmtpClient(); mailer.Host = "smtp.gmail.com"; mailer.Port = 587; mailer.EnableSsl = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
对于gmail,这些设置对我ServicePointManager有效。SecurityProtocol线是必要的。因为我有安装2步验证,我需要从谷歌应用密码生成器中获取应用密码。SmtpClient mailer =新的SmtpClient();梅勒。主机= " smtp.gmail.com ";梅勒。端口= 587;梅勒。EnableSsl = true;ServicePointManager。SecurityProtocol = SecurityProtocolType.Tls;
#11
-1
If any doubt in this code, please ask your questions(Here for gmail Port number is 587)
如果在此代码中有任何疑问,请提出您的问题(gmail端口号是587)
// code to Send Mail
// Add following Lines in your web.config file
// <system.net>
// <mailSettings>
// <smtp>
// <network host="smtp.gmail.com" port="587" userName="xxx@gmail.com" password="yyy" defaultCredentials="false"/>
// </smtp>
// </mailSettings>
// </system.net>
// Add below lines in your config file inside appsetting tag <appsetting></appsetting>
// <add key="emailFromAddress" value="xxxx@gmail.com"/>
// <add key="emailToAddress" value="xxxxxxx@gmail.com"/>
// <add key="EmailSsl" value="true"/>
// Namespace Used
using System.Net.Mail;
public static bool SendingMail(string subject, string content)
{
// getting the values from config file through c#
string fromEmail = ConfigurationSettings.AppSettings["emailFromAddress"];
string mailid = ConfigurationSettings.AppSettings["emailToAddress"];
bool useSSL;
if (ConfigurationSettings.AppSettings["EmailSsl"] == "true")
{
useSSL = true;
}
else
{
useSSL = false;
}
SmtpClient emailClient;
MailMessage message;
message = new MailMessage();
message.From = new MailAddress(fromEmail);
message.ReplyTo = new MailAddress(fromEmail);
if (SetMailAddressCollection(message.To, mailid))
{
message.Subject = subject;
message.Body = content;
message.IsBodyHtml = true;
emailClient = new SmtpClient();
emailClient.EnableSsl = useSSL;
emailClient.Send(message);
}
return true;
}
// if you are sending mail in group
private static bool SetMailAddressCollection(MailAddressCollection toAddresses, string mailId)
{
bool successfulAddressCreation = true;
toAddresses.Add(new MailAddress(mailId));
return successfulAddressCreation;
}
#1
32
Here is an example of how to send email through GMail which also uses SSL/465. Minor tweaking of the code below should work!
下面是如何通过GMail发送电子邮件的示例,GMail也使用SSL/465。对下面的代码稍加修改就可以了!
using System.Web.Mail;
using System;
public class MailSender
{
public static bool SendEmail(
string pGmailEmail,
string pGmailPassword,
string pTo,
string pSubject,
string pBody,
System.Web.Mail.MailFormat pFormat,
string pAttachmentPath)
{
try
{
System.Web.Mail.MailMessage myMail = new System.Web.Mail.MailMessage();
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpserver",
"smtp.gmail.com");
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpserverport",
"465");
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendusing",
"2");
//sendusing: cdoSendUsingPort, value 2, for sending the message using
//the network.
//smtpauthenticate: Specifies the mechanism used when authenticating
//to an SMTP
//service over the network. Possible values are:
//- cdoAnonymous, value 0. Do not authenticate.
//- cdoBasic, value 1. Use basic clear-text authentication.
//When using this option you have to provide the user name and password
//through the sendusername and sendpassword fields.
//- cdoNTLM, value 2. The current process security context is used to
// authenticate with the service.
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate","1");
//Use 0 for anonymous
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendusername",
pGmailEmail);
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendpassword",
pGmailPassword);
myMail.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpusessl",
"true");
myMail.From = pGmailEmail;
myMail.To = pTo;
myMail.Subject = pSubject;
myMail.BodyFormat = pFormat;
myMail.Body = pBody;
if (pAttachmentPath.Trim() != "")
{
MailAttachment MyAttachment =
new MailAttachment(pAttachmentPath);
myMail.Attachments.Add(MyAttachment);
myMail.Priority = System.Web.Mail.MailPriority.High;
}
System.Web.Mail.SmtpMail.SmtpServer = "smtp.gmail.com:465";
System.Web.Mail.SmtpMail.Send(myMail);
return true;
}
catch (Exception ex)
{
throw;
}
}
}
#2
10
I'm late to this party but I'll offer my approach for any passersby that might be interested in an alternative.
我参加这个派对很晚了,但我会为任何可能对另一种选择感兴趣的路人提供我的方法。
As noted in previous answers, the System.Net.Mail
SmtpClient
class does not support Implicit SSL. It does support Explicit SSL, which requires an insecure connection to the SMTP server over port 25 in order to negotiate the transport level security (TLS). I blogged about my travails with this subtlety here.
如前所述,System.Net。邮件SmtpClient类不支持隐式SSL。它确实支持显式SSL,它需要通过端口25与SMTP服务器进行不安全连接,以便协商传输层安全性(TLS)。我在博客上写了关于我的辛苦的经历。
In short, SMTP over Implict SSL port 465 requires TLS to be negotiated before connecting to the SMTP server. Rather than write a .Net SMTPS implementation I turned to a utility named Stunnel. It's a small service that will let you redirect traffic on a local port to a remote port via SSL.
简而言之,SMTP对Implict SSL端口465的要求需要在连接到SMTP服务器之前进行协商。我没有编写。net SMTPS实现,而是转向了一个名为Stunnel的实用程序。它是一个小服务,可以让您通过SSL将本地端口上的通信重定向到远程端口。
DISCLAIMER: Stunnel uses portions of the OpenSSL library, which recently had a high-profile exploit published in all major tech news media. I believe the latest version uses the patched OpenSSL but please use at your own risk.
免责声明:Stunnel使用了OpenSSL库的一部分,该库最近在所有主要科技新闻媒体上发布了一个引人注目的漏洞。我相信最新的版本使用了修补过的OpenSSL,但请自行使用。
Once the utility is installed a small addition to the configuration file:
一旦安装了这个实用程序,配置文件就会有一个小的添加:
; Example SSL client mode services
[my-smtps]
client = yes
accept = 127.0.0.1:465
connect = mymailserver.com:465
...instructs the Stunnel service to reroute local requests to port 465 to my mail server on port 465. This happens over TLS, which satisfies the SMTP server on the other end.
…指示Stunnel服务将本地请求重新路由到端口465到端口465上的邮件服务器。这发生在TLS上,它满足另一端的SMTP服务器。
Using this utility, the following code will successfully transmit over port 465:
使用此实用程序,以下代码将成功地在端口465上传输:
using System;
using System.Net;
using System.Net.Mail;
namespace RSS.SmtpTest
{
class Program
{
static void Main( string[] args )
{
try {
using( SmtpClient smtpClient = new SmtpClient( "localhost", 465 ) ) { // <-- note the use of localhost
NetworkCredential creds = new NetworkCredential( "username", "password" );
smtpClient.Credentials = creds;
MailMessage msg = new MailMessage( "joe@schmoe.com", "jane@schmoe.com", "Test", "This is a test" );
smtpClient.Send( msg );
}
}
catch( Exception ex ) {
Console.WriteLine( ex.Message );
}
}
}
}
So the advantage here is that you can use Implict SSL and port 465 as the security protocol while still using the send mail methods built into the framework. The disadvantage is that it requires the use of a third party service that may not be useful for anything but this specific function.
因此,这里的优点是,您可以使用Implict SSL和端口465作为安全协议,同时仍然使用框架内置的send mail方法。缺点是,它需要使用第三方服务,除了这个特定的功能之外,这些服务可能对任何东西都没有用处。
#3
9
It works with System.Web.Mail (which is marked as obsolete):
它适用于包含。邮件(注明已作废):
private const string SMTP_SERVER = "http://schemas.microsoft.com/cdo/configuration/smtpserver";
private const string SMTP_SERVER_PORT = "http://schemas.microsoft.com/cdo/configuration/smtpserverport";
private const string SEND_USING = "http://schemas.microsoft.com/cdo/configuration/sendusing";
private const string SMTP_USE_SSL = "http://schemas.microsoft.com/cdo/configuration/smtpusessl";
private const string SMTP_AUTHENTICATE = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate";
private const string SEND_USERNAME = "http://schemas.microsoft.com/cdo/configuration/sendusername";
private const string SEND_PASSWORD = "http://schemas.microsoft.com/cdo/configuration/sendpassword";
System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
mail.Fields[SMTP_SERVER] = "tempurl.org";
mail.Fields[SMTP_SERVER_PORT] = 465;
mail.Fields[SEND_USING] = 2;
mail.Fields[SMTP_USE_SSL] = true;
mail.Fields[SMTP_AUTHENTICATE] = 1;
mail.Fields[SEND_USERNAME] = "username";
mail.Fields[SEND_PASSWORD] = "password";
System.Web.Mail.SmtpMail.Send(mail);
What is your point of view regarding obsolete namespace usage?
关于过时的名称空间使用,您的观点是什么?
#4
5
Try to check this free an open source alternative https://www.nuget.org/packages/AIM It is free to use and open source and uses the exact same way that System.Net.Mail is using To send email to implicit ssl ports you can use following code
试着检查这个免费的开源替代品https://www.nuget.org/packages/AIM它是免费使用和开源的,使用方式和System.Net完全一样。邮件用于将电子邮件发送到隐式ssl端口,您可以使用以下代码
public static void SendMail()
{
var mailMessage = new MimeMailMessage();
mailMessage.Subject = "test mail";
mailMessage.Body = "hi dude!";
mailMessage.Sender = new MimeMailAddress("you@gmail.com", "your name");
mailMessage.To.Add(new MimeMailAddress("yourfriend@gmail.com", "your friendd's name"));
// You can add CC and BCC list using the same way
mailMessage.Attachments.Add(new MimeAttachment("your file address"));
//Mail Sender (Smtp Client)
var emailer = new SmtpSocketClient();
emailer.Host = "your mail server address";
emailer.Port = 465;
emailer.SslType = SslMode.Ssl;
emailer.User = "mail sever user name";
emailer.Password = "mail sever password" ;
emailer.AuthenticationMode = AuthenticationType.Base64;
// The authentication types depends on your server, it can be plain, base 64 or none.
//if you do not need user name and password means you are using default credentials
// In this case, your authentication type is none
emailer.MailMessage = mailMessage;
emailer.OnMailSent += new SendCompletedEventHandler(OnMailSent);
emailer.SendMessageAsync();
}
// A simple call back function:
private void OnMailSent(object sender, AsyncCompletedEventArgs asynccompletedeventargs)
{
if (e.UserState!=null)
Console.Out.WriteLine(e.UserState.ToString());
if (e.Error != null)
{
MessageBox.Show(e.Error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (!e.Cancelled)
{
MessageBox.Show("Send successfull!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
#5
4
If it's Implicit SSL, it looks like it can't be done with System.Net.Mail and isn't supported as of yet.
如果它是隐式SSL,那么看起来它不能用System.Net完成。目前还不支持邮件和邮件。
http://blogs.msdn.com/webdav_101/archive/2008/06/02/system -网-邮件- - ssl - -对-港- 465. - aspx进行身份验证
To check if it's Implicit SSL try this.
要检查它是否是隐式SSL,请尝试此操作。
#6
4
You can also connect via port 465, but due to some limitations of the System.Net.Mail namespace you may have to alter your code. This is because the namespace does not offer the ability to make implicit SSL connections. This is discussed at http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx.
您也可以通过端口465进行连接,但是由于System.Net的一些限制。可能需要更改代码的邮件名称空间。这是因为名称空间不提供进行隐式SSL连接的能力。这在http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with- sslto -authenticate- port-465.aspx中有讨论。
It is possible to make implicit connections without having to use the now obsolete System.Web.Mail namespace, but you have to access the Microsoft CDO (Collaborative Data Object). I have supplied an example of how to use the CDO in another discussion (GMail SMTP via C# .Net errors on all ports).
不需要使用现在已经过时的System.Web就可以进行隐式连接。邮件名称空间,但您必须访问Microsoft CDO(协作数据对象)。我在另一个讨论中提供了如何使用CDO的示例(GMail SMTP通过c# . net错误在所有端口上)。
Hope this helps!
希望这可以帮助!
#7
4
In VB.NET while trying to connect to Rackspace's SSL port on 465 I encountered the same issue (requires implicit SSL). I made use of https://www.nuget.org/packages/MailKit/ in order to successfully connect.
在VB。在尝试连接Rackspace的465 SSL端口时,我遇到了同样的问题(需要隐式SSL)。为了成功连接,我使用了https://www.nuget.org/packages/MailKit/。
The following is an example of an HTML email message.
下面是一个HTML电子邮件消息的示例。
Imports MailKit.Net.Smtp
Imports MailKit
Imports MimeKit
Sub somesub()
Dim builder As New BodyBuilder()
Dim mail As MimeMessage
mail = New MimeMessage()
mail.From.Add(New MailboxAddress("", c_MailUser))
mail.To.Add(New MailboxAddress("", c_ToUser))
mail.Subject = "Mail Subject"
builder.HtmlBody = "<html><body>Body Text"
builder.HtmlBody += "</body></html>"
mail.Body = builder.ToMessageBody()
Using client As New SmtpClient
client.Connect(c_MailServer, 465, True)
client.AuthenticationMechanisms.Remove("XOAUTH2") ' Do not use OAUTH2
client.Authenticate(c_MailUser, c_MailPassword) ' Use a username / password to authenticate.
client.Send(mail)
client.Disconnect(True)
End Using
End Sub
#8
1
I know I'm joining late to the discussion, but I think this can be useful to others.
我知道我参加讨论的时间很晚,但我认为这对其他人是有用的。
I wanted to avoid deprecated stuff and after a lot of fiddling I found a simple way to send to servers requiring Implicit SSL: use NuGet and add the MailKit package to the project. (I used VS2017 targetting .NET 4.6.2 but it should work on lower .NET versions...)
我想避免被弃用的东西,在做了很多修改之后,我找到了一种简单的方法来发送到需要隐式SSL的服务器:使用NuGet并将MailKit包添加到项目中。(我使用了VS2017 target .NET 4.6.2,但是它应该适用于较低的。net版本…)
Then you'll only need to do something like this:
那么你只需要做这样的事情:
using MailKit.Net.Smtp;
using MimeKit;
var client = new SmtpClient();
client.Connect("server.name", 465, true);
// Note: since we don't have an OAuth2 token, disable the XOAUTH2 authentication mechanism.
client.AuthenticationMechanisms.Remove ("XOAUTH2");
if (needsUserAndPwd)
{
// Note: only needed if the SMTP server requires authentication
client.Authenticate (user, pwd);
}
var msg = new MimeMessage();
msg.From.Add(new MailboxAddress("sender@ema.il"));
msg.To .Add(new MailboxAddress("target@ema.il"));
msg.Subject = "This is a test subject";
msg.Body = new TextPart("plain") {
Text = "This is a sample message body"
};
client.Send(msg);
client.Disconnect(true);
Of course you can also tweak it to use Explicit SSL or no transport security at all.
当然,您也可以对它进行调整,以使用显式SSL或根本不使用传输安全性。
#9
1
As stated in a comment at
如在评论中所述
http://blogs.msdn.com/webdav_101/archive/2008/06/02/system -网-邮件- - ssl - -对-港- 465. - aspx进行身份验证
with System.Net.Mail, use port 25 instead of 465:
与System.Net。邮件,使用端口25代替465:
You must set SSL=true and Port=25. Server responds to your request from unprotected 25 and then throws connection to protected 465.
您必须设置SSL=true,端口=25。服务器响应您的请求,从不受保护的25,然后抛出连接保护465。
#10
0
For gmail these settings worked for me, the ServicePointManager.SecurityProtocol line was necessary. Because I has setup 2 step verification I needed get a App Password from google app password generator. SmtpClient mailer = new SmtpClient(); mailer.Host = "smtp.gmail.com"; mailer.Port = 587; mailer.EnableSsl = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
对于gmail,这些设置对我ServicePointManager有效。SecurityProtocol线是必要的。因为我有安装2步验证,我需要从谷歌应用密码生成器中获取应用密码。SmtpClient mailer =新的SmtpClient();梅勒。主机= " smtp.gmail.com ";梅勒。端口= 587;梅勒。EnableSsl = true;ServicePointManager。SecurityProtocol = SecurityProtocolType.Tls;
#11
-1
If any doubt in this code, please ask your questions(Here for gmail Port number is 587)
如果在此代码中有任何疑问,请提出您的问题(gmail端口号是587)
// code to Send Mail
// Add following Lines in your web.config file
// <system.net>
// <mailSettings>
// <smtp>
// <network host="smtp.gmail.com" port="587" userName="xxx@gmail.com" password="yyy" defaultCredentials="false"/>
// </smtp>
// </mailSettings>
// </system.net>
// Add below lines in your config file inside appsetting tag <appsetting></appsetting>
// <add key="emailFromAddress" value="xxxx@gmail.com"/>
// <add key="emailToAddress" value="xxxxxxx@gmail.com"/>
// <add key="EmailSsl" value="true"/>
// Namespace Used
using System.Net.Mail;
public static bool SendingMail(string subject, string content)
{
// getting the values from config file through c#
string fromEmail = ConfigurationSettings.AppSettings["emailFromAddress"];
string mailid = ConfigurationSettings.AppSettings["emailToAddress"];
bool useSSL;
if (ConfigurationSettings.AppSettings["EmailSsl"] == "true")
{
useSSL = true;
}
else
{
useSSL = false;
}
SmtpClient emailClient;
MailMessage message;
message = new MailMessage();
message.From = new MailAddress(fromEmail);
message.ReplyTo = new MailAddress(fromEmail);
if (SetMailAddressCollection(message.To, mailid))
{
message.Subject = subject;
message.Body = content;
message.IsBodyHtml = true;
emailClient = new SmtpClient();
emailClient.EnableSsl = useSSL;
emailClient.Send(message);
}
return true;
}
// if you are sending mail in group
private static bool SetMailAddressCollection(MailAddressCollection toAddresses, string mailId)
{
bool successfulAddressCreation = true;
toAddresses.Add(new MailAddress(mailId));
return successfulAddressCreation;
}