using System.Configuration;
using System.Net.Security;
using System.Security.Authentication;
-#if NET_4_5
using System.Threading.Tasks;
-#endif
namespace System.Net.Mail {
+ [Obsolete ("SmtpClient and its network of types are poorly designed, we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead")]
public class SmtpClient
-#if NET_4_0
: IDisposable
-#endif
{
#region Fields
if (cfg != null) {
this.host = cfg.Network.Host;
this.port = cfg.Network.Port;
-#if NET_4_0
this.enableSsl = cfg.Network.EnableSsl;
-#endif
TargetName = cfg.Network.TargetName;
if (this.TargetName == null)
TargetName = "SMTPSVC/" + (host != null ? host : "");
}
#endif
-#if NET_4_0
public
-#endif
string TargetName { get; set; }
public ICredentialsByHost Credentials {
#endregion // Events
#region Methods
-#if NET_4_0
public void Dispose ()
{
Dispose (true);
{
// TODO: We should close all the connections and abort any async operations here
}
-#endif
private void CheckState ()
{
if (messageInProcess != null)
// FIXME: parse the list of extensions so we don't bother wasting
// our time trying commands if they aren't supported.
- status = SendCommand ("EHLO " + Dns.GetHostName ());
+
+ // Get the FQDN of the local machine
+ string fqdn = Dns.GetHostEntry (Dns.GetHostName ()).HostName;
+ status = SendCommand ("EHLO " + fqdn);
if (IsError (status)) {
- status = SendCommand ("HELO " + Dns.GetHostName ());
+ status = SendCommand ("HELO " + fqdn);
if (IsError (status))
throw new SmtpException (status.StatusCode, status.Description);
ResetExtensions();
writer = new StreamWriter (stream);
reader = new StreamReader (stream);
- status = SendCommand ("EHLO " + Dns.GetHostName ());
+ status = SendCommand ("EHLO " + fqdn);
if (IsError (status)) {
- status = SendCommand ("HELO " + Dns.GetHostName ());
+ status = SendCommand ("HELO " + fqdn);
if (IsError (status))
throw new SmtpException (status.StatusCode, status.Description);
sfre.Add (new SmtpFailedRecipientException (status.StatusCode, message.Bcc [i].Address));
}
-#if TARGET_JVM // List<T>.ToArray () is not supported
- if (sfre.Count > 0) {
- SmtpFailedRecipientException[] xs = new SmtpFailedRecipientException[sfre.Count];
- sfre.CopyTo (xs);
- throw new SmtpFailedRecipientsException ("failed recipients", xs);
- }
-#else
if (sfre.Count >0)
throw new SmtpFailedRecipientsException ("failed recipients", sfre.ToArray ());
-#endif
// DATA
status = SendCommand ("DATA");
if (message.ReplyToList.Count > 0)
SendHeader ("Reply-To", EncodeAddresses (message.ReplyToList));
-#if NET_4_0
foreach (string s in message.Headers.AllKeys)
SendHeader (s, ContentType.EncodeSubjectRFC2047 (message.Headers [s], message.HeadersEncoding));
-#else
- foreach (string s in message.Headers.AllKeys)
- SendHeader (s, message.Headers [s]);
-#endif
AddPriorityHeader (message);
Send (new MailMessage (from, to, subject, body));
}
-#if NET_4_5
public Task SendMailAsync (MailMessage message)
{
var tcs = new TaskCompletionSource<object> ();
static void SendMailAsyncCompletedHandler (TaskCompletionSource<object> source, AsyncCompletedEventArgs e, SendCompletedEventHandler handler, SmtpClient client)
{
- if ((object) handler != e.UserState)
+ if (source != e.UserState)
return;
client.SendCompleted -= handler;
source.SetResult (null);
}
-#endif
private void SendDot()
{
case TransferEncoding.Base64:
byte [] content = new byte [av.ContentStream.Length];
av.ContentStream.Read (content, 0, content.Length);
-#if TARGET_JVM
- SendData (Convert.ToBase64String (content));
-#else
SendData (Convert.ToBase64String (content, Base64FormattingOptions.InsertLineBreaks));
-#endif
break;
case TransferEncoding.QuotedPrintable:
byte [] bytes = new byte [av.ContentStream.Length];
case TransferEncoding.Base64:
byte [] content = new byte [lr.ContentStream.Length];
lr.ContentStream.Read (content, 0, content.Length);
-#if TARGET_JVM
- SendData (Convert.ToBase64String (content));
-#else
SendData (Convert.ToBase64String (content, Base64FormattingOptions.InsertLineBreaks));
-#endif
break;
case TransferEncoding.QuotedPrintable:
byte [] bytes = new byte [lr.ContentStream.Length];
att.ContentStream.Read (content, 0, content.Length);
switch (att.TransferEncoding) {
case TransferEncoding.Base64:
-#if TARGET_JVM
- SendData (Convert.ToBase64String (content));
-#else
SendData (Convert.ToBase64String (content, Base64FormattingOptions.InsertLineBreaks));
-#endif
break;
case TransferEncoding.QuotedPrintable:
SendData (ToQuotedPrintable (content));
throw new SmtpException (SmtpStatusCode.GeneralFailure, "Server does not support secure connections.");
}
-#if TARGET_JVM
- ((NetworkStream) stream).ChangeToSSLSocket ();
-#elif SECURITY_DEP
+#if SECURITY_DEP
SslStream sslStream = new SslStream (stream, false, callback, null);
CheckCancellation ();
sslStream.AuthenticateAsClient (Host, this.ClientCertificates, SslProtocols.Default, false);