SMTP электронной почты «Сервис» я могу включить в мой проект C #? - PullRequest
0 голосов
/ 20 января 2012

Я написал несколько программ, которые отправляют электронную почту из 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 ]

2 голосов
/ 20 января 2012

Это может быть проблема с учетными данными.Измените 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 голосов
/ 20 января 2012

Для отправки писем с c # вам не нужна локальная служба SMTP. Вам просто нужна библиотека System.Net.Mail. Использование удаленного SMTP-сервера (возможно, с действительными настройками PTR, а не одного в вашей сети, чтобы не быть рассмотренным как спамер) должно быть вполне достаточным.

1 голос
/ 20 января 2012

Я никогда не находил встраиваемый SMTP-сервер, но оба они близки, и вы, возможно, могли бы изменить их в соответствии со своими потребностями.

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

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

Я буду продолжать искать, потому что это тоже то, что я бы нашел полезным.Я выложу больше, если найду.

0 голосов
/ 25 января 2012

Если вы просто используете ненастроенную службу для отправки электронной почты, вы обязательно попадете в папку СПАМ из-за неудачной проверки 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);
    }
0 голосов
/ 20 января 2012

Вы пытались указать настройки SMTP в файле App.config?Что-то вроде:

<?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", тогда он просто напишет файл, представляющий письмо, которое будет отправлено в указанный вами каталог.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...