用户以纯文本形式接收cdo消息

时间:2013-11-22 15:01:06

标签: c# asp.net email ssl

我有一个需要发送电子邮件的ASP.NET应用程序。起初我使用System.Net.Mail,一切都很好。我的应用程序可以发送HTML消息,人们收到它们就好了。

但随后我们添加了一个新的Web服务器,该Web服务器需要SSL才能使用不同的smtp服务器发送电子邮件。所以我不得不使用cdo消息而不是System.Net.Mail。 见How can I send emails through SSL SMTP with the .NET Framework?

现在出现了一些非常奇怪的事情。原始服务器以纯文本形式发送电子邮件,而第二台服务器以html格式发送电子邮件。两个服务器都使用完全相同的代码(在本文末尾)。唯一的区别是原始服务器不需要用户名和密码,而第二个服务器不需要。

另一个区别是第一台服务器运行的是Windows Server 2008 R2,而第二台服务器运行的是Windows Server 2012.但我不认为cdo在这两个版本之间发生了变化,对吗?

我不知道如何解决这个问题。问题不在代码中,因为第二个服务器工作正常,并且它不在第一个服务器正在使用的smtp服务器中,因为它与System.Net.Mail一起正常工作。有什么想法??

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Net.Configuration;
using System.Net.Mail;
using System.Runtime.InteropServices;

namespace Kernel
{
    public class cdoMessage
    {
        public String Host;
        public String Username;
        public String Password;
        public Int32 Port;
        public Boolean EnableSsl;
        public String From;
        public MailAddressCollection To;
        public Boolean IsBodyHtml;
        public String Subject;
        public String Body;
        public MailAddressCollection Bcc;

        public cdoMessage()
        {
            SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");

            Host = settings.Network.Host;

            Username = settings.Network.UserName;

            Password = settings.Network.Password;

            Port = settings.Network.Port;

            EnableSsl = settings.Network.EnableSsl;

            From = settings.From;

            To = new MailAddressCollection();            

            IsBodyHtml = false;

            Bcc = new MailAddressCollection();
        }

        String s(String e)
        {
            return "http://schemas.microsoft.com/cdo/configuration/" + e;
        }

        public void Send()
        {

            CDO.Message message = new CDO.Message();

            try
            {
                message.Configuration.Fields[s("smtpserver")].Value = Host;

                message.Configuration.Fields[s("smtpserverport")].Value = Port;

                message.Configuration.Fields[s("sendusing")].Value = CDO.CdoSendUsing.cdoSendUsingPort;

                if (Username == null && Password == null)
                {
                    message.Configuration.Fields[s("smtpauthenticate")].Value = CDO.CdoProtocolsAuthentication.cdoAnonymous;
                }
                else
                {
                    message.Configuration.Fields[s("smtpauthenticate")].Value = CDO.CdoProtocolsAuthentication.cdoBasic;

                    message.Configuration.Fields[s("sendusername")].Value = Username;

                    message.Configuration.Fields[s("sendpassword")].Value = Password;
                }

                if (EnableSsl)
                {
                    message.Configuration.Fields[s("smtpusessl")].Value = "true";
                }

                message.Configuration.Fields.Update();

                message.From = From;

                // ToString works just fine.
                message.To = To.ToString();

                message.BCC = Bcc.ToString();

                message.Subject = Subject;

                if (IsBodyHtml)
                {
                    message.HTMLBody = Body;
                }
                else
                {
                    message.TextBody = Body;
                }

                message.Send();
            }
            finally
            {
                Marshal.ReleaseComObject(message);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

这是一个免费的库,在显式隐式模式下支持POP3,SMTP,IMAP的SSL \ TLS。显然我没有使用它,但它看起来相当复杂。它绝对值得尝试一下价格。

http://visualstudiogallery.msdn.microsoft.com/28b96cd4-b755-48a0-b686-9abb7d5607a8

答案 1 :(得分:0)

尝试将.HTMLBody.TextBody都设置为您想要的值。理想的纯文本和HTML版本不同。通常,如果没有,那就是html。 Html被认为是大多数读者的“替代”显示文本,至少它是在当天。也许不同的SMTP服务器以不同方式处理丢失的电子邮件字段。

如果这不能解决问题,请在两个字段中发送纯文本,看看两个服务器是否一样对待它。

如果这不起作用,请将服务器B中的电子邮件转发给服务器A,反之亦然,看看会发生什么。即使您只是从电子邮件阅读器手动执行此操作。它可能是默认情况下以纯文本形式发送的第二台SMTP服务器上的设置。

查看从两台服务器收到的邮件中的MIME标头。寻找差异,以便了解实际上的差异。

你最终应该能够确定正在发生的事情和地点。

<强>更新

输入您的凭据并尝试一下。它通过SSL将邮件发送到我的Gmail地址。尝试发送到旧服务器。

    public bool SendMail() {
        var client = new SmtpClient("smtp.gmail.com", 587) {
            Credentials = new NetworkCredential("your email", "password"),
            EnableSsl = true
        };

        MailMessage message = new MailMessage(
            new MailAddress("from email address"),
            new MailAddress("to email address")) {
                Body = "This is a test e-mail message sent using SSL ",
                Subject = "Test email with SSL and Credentials"
            };

        try {
            client.Send(message);
        } catch (Exception ex) {
            Console.WriteLine("Exception is:" + ex.ToString());
        }

        return false;
    }

答案 2 :(得分:0)

我记得这件事发生了奇怪的原因:

如果正文中的行太长,SMTP服务会将邮件作为纯文本发送,即使我们将其作为HTML发送。尝试插入\ n换行符,将邮件正文分解为较短的行。虽然我不能说线条可能有多长。