我写了几个从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);
答案 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);
}