带TLS的SMTP“;“手工”;在.NET中

带TLS的SMTP“;“手工”;在.NET中,.net,ssl,smtp,.net,Ssl,Smtp,我想通过SMTP服务器发送电子邮件,但不想使用内置的SmtpClient类,因为它不提供对电子邮件头的太多控制 我发现基本上可以归结为: string server = "smtp.server.com"; int port = 25; IPHostEntry host = Dns.GetHostEntry(server); IPEndPoint endPt = new IPEndPoint(host.AddressList[0], port); using (Socket s = new

我想通过SMTP服务器发送电子邮件,但不想使用内置的
SmtpClient
类,因为它不提供对电子邮件头的太多控制

我发现基本上可以归结为:

string server = "smtp.server.com";
int port = 25;

IPHostEntry host = Dns.GetHostEntry(server);
IPEndPoint endPt = new IPEndPoint(host.AddressList[0], port);

using (Socket s = new Socket(endPt.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) {
    s.Connect(endPt);

    Action<string> Senddata = (string msg) => {
        byte[] _msg = Encoding.ASCII.GetBytes(msg);
        s.Send(_msg, 0, _msg.Length, SocketFlags.None);
    };

    Senddata("HELO " + server);
    // Rest of email data elided
}
string server=“smtp.server.com”;
int端口=25;
IPHostEntry主机=Dns.GetHostEntry(服务器);
IPEndPoint endPt=新IPEndPoint(主机地址列表[0],端口);
使用(sockets=newsocket(endPt.AddressFamily,SocketType.Stream,ProtocolType.Tcp)){
s、 连接(endPt);
动作Senddata=(字符串消息)=>{
字节[]_msg=Encoding.ASCII.GetBytes(msg);
s、 发送(_msg,0,_msg.Length,SocketFlags.None);
};
Senddata(“HELO”+服务器);
//其余电子邮件数据被删除
}
但对于需要TLS的连接(如Gmail的SMTP服务器),这可能不起作用


是否有一种直接的方法通过显式SSL连接进行此类交换,例如使用
STARTTLS
SMTP命令?我对SSL协议了解不多,当然也不想在编写自己的实现时陷入困境。我希望有一种方法可以使用
SslStream
类或其他东西来发送数据。

你能详细说明你需要做什么SmtpClient不能做的事情吗?我想让电子邮件的“to”标题与SMTP的“RCPT”字段有不同的内容。.NET
SmtpClient
对这两个值都使用
MailMessage.To
属性,并且不允许您覆盖头。您可以使用第三方SMTP组件来实现此目的。SecureBackbox和Rebex库包括一个。