SMTP电子邮件“服务”我可以包含在我的C#项目中吗?

时间:2012-01-20 16:32:39

标签: c# email windows-7 smtp

我写了几个从C#发送电子邮件的程序。这在winXP中效果很好,但我发现它在Win7中有所突破。我的理解是,即使我引用的SMTP服务器在另一台计算机上,发送计算机也需要安装SMTP服务(并且win7不安装)。

我知道可以安装第三方SMTP服务器,但是我需要在运行我程序的每台计算机上执行此操作。相反,我想在我的项目中包含一个临时SMTP服务器,我可以完全从代码中使用它来完成同样的工作。有没有人知道如何在我的项目中包含临时SMTP服务器的库(或示例代码)?

这是我的代码:

public static void sendEmail(String[] recipients, String sender, String subject, String body, String[] attachments)
    {
            MailMessage message;

            try
            {
                message = new MailMessage(sender, recipients[0]);
            }
            catch (Exception)
            {
                return;
            }

            foreach (String s in recipients)
            {
                if (!message.To.Contains(new MailAddress(s)))
                    message.To.Add(s);
            }

            message.From = new MailAddress(sender);
            message.Subject = subject;
            message.Body = body;
            message.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient("PRIVATE.PRIVATE.PRIVATE", 25);
            smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
            //smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

            smtp.UseDefaultCredentials = true;

            if (attachments.Length > 0)
            {
                foreach (String a in attachments)
                {
                    message.Attachments.Add(new Attachment(a));
                }
            }
            try
            {
                smtp.SendAsync(message, null);

5 个答案:

答案 0 :(得分:2)

要从c#发送电子邮件,您需要本地SMTP服务。您只需要System.Net.Mail库。使用远程SMTP服务器(可能是一个具有有效PTR设置而不是网络中的一个,以避免被视为垃圾邮件发送者)应该就足够了。

答案 1 :(得分:2)

这可能是凭证问题。将SendAsync更改为Send以查看是否有任何异常。或者为Async调用添加处理程序

smtp.SendCompleted += delegate(object s, System.ComponentModel.AsyncCompletedEventArgs    e)
{
    if (e.Error != null)
     {
        System.Diagnostics.Trace.TraceError(e.Error.ToString());
     }
};

您的代码更改后,在Win7中为我工作

SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
//smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(GoogleUserEmail, GooglePassword);
smtp.EnableSsl = true;

// smtp.UseDefaultCredentials = true;

if (attachments != null && attachments.Length > 0)
        {
            foreach (String a in attachments)
            {
                message.Attachments.Add(new Attachment(a));
            }
        }
        try
        {
            smtp.Send(message);
        }

答案 2 :(得分:1)

我从未找到过嵌入式SMTP服务器,但这两种服务器都很接近,您可以修改它们以满足您的需求。

http://www.codeproject.com/KB/IP/smtppop3mailserver.aspx

http://www.ericdaugherty.com/dev/cses/developers.html

我会继续寻找,因为这也是我觉得有用的东西。如果我发现任何内容,我会发布更多。

答案 3 :(得分:0)

您是否尝试在App.config文件中指定SMTP设置?类似的东西:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="Network">
                <specifiedPickupDirectory pickupDirectoryLocation="C:\tmp"/>
                <network host="smtp.example.com"/>
            </smtp>
        </mailSettings>
    </system.net>
</configuration>

如果您更改deliveryMethod="SpecifiedPickupDirectory",那么它只会写一个代表将发送到您指定目录的电子邮件的文件。

希望这有帮助。

答案 4 :(得分:0)

如果您只是使用未配置的服务来发送电子邮件,那么由于反向DNS和SPF检查失败,您肯定会进入垃圾邮件文件夹。因此,您需要正确配置服务器。或者,您可以使用Elastic Email等第三方服务。这是Elastic Email的示例代码,它使用HTTP发送邮件:

    public static string SendEmail(string to, string subject, string bodyText, string bodyHtml, string from, string fromName)
    {

        WebClient client = new WebClient();
        NameValueCollection values = new NameValueCollection();
        values.Add("username", USERNAME);
        values.Add("api_key", API_KEY);
        values.Add("from", from);
        values.Add("from_name", fromName);
        values.Add("subject", subject);
        if (bodyHtml != null)
            values.Add("body_html", bodyHtml);
        if (bodyText != null)
            values.Add("body_text", bodyText);
        values.Add("to", to);

        byte[] response = client.UploadValues("https://api.elasticemail.com/mailer/send", values);
        return Encoding.UTF8.GetString(response);
    }