不会发送邮件消息 - C#

时间:2013-01-13 23:13:27

标签: c# email

好;我似乎无法发送邮件。我将它作为控制台应用程序运行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace Email
{
    class Program
    {
        static void EMail(string ToAddress, string Subject, string Body, string FromAddress, string Host, int Port, string Username, string Password)
        {
            System.Net.Mail.SmtpClient SMTPClient = new System.Net.Mail.SmtpClient(Host, Port);
            System.Net.Mail.MailMessage Message = new System.Net.Mail.MailMessage();
            Message.To.Add(new System.Net.Mail.MailAddress(ToAddress));
            Message.From = new System.Net.Mail.MailAddress(FromAddress);
            Message.Body = Body;
            Message.Subject = Subject;
            SMTPClient.EnableSsl = true;
            SMTPClient.Credentials = new System.Net.NetworkCredential(Username, Password);
            SMTPClient.Send(Message);
            SMTPClient.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(FinishedSending);
        }
        static void FinishedSending(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            Console.WriteLine("DONE!");
        }
        static void Main(string[] args)
        {
            EMail("***********", "Hi!", "This is a test, Sent from a C# application.", "******", "smtp.gmail.com", 465, "****************", "**************");
            Console.ReadLine();
        }
    }
}

我没有收到任何错误,我没有在我的Gmail帐户中收到它,而且它没有写“完成!”。 我已经允许端口465,输出和传入。端口465上的telnetting smtp.gmail.com导致一个空白的命令提示符窗口。 感谢。

4 个答案:

答案 0 :(得分:4)

如果没有例外,电子邮件应该会通过。

不打印"完成!"因为您在强调Send()方法后隐藏了事件。在之前挂钩>调用发送。

编辑:是的它应该是SendAsync。发送是同步的。

也按此顺序尝试这些参数:

smtpClient.EnableSsl = true;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = (...)

此代码适用于我,在新的Winforms应用程序中:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            var state = e.UserState;
            //"Done"
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var smtpClient = new SmtpClient("smtp.gmail.com", 587)
            {
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential("myEmail@gmail.com", "mypassword")
            };

            var message = new MailMessage("myEmail@gmail.com", "myEmail@gmail.com", "Subject", "body");

            smtpClient.SendCompleted += new SendCompletedEventHandler(smtpClient_SendCompleted);
            smtpClient.SendAsync(message, new object());

        }
    }

答案 1 :(得分:1)

转到任务 - >行动 - >编辑操作并将“启动(可选)”设置为可执行文件所在的文件夹。

答案 2 :(得分:0)

我认为System.Net.Mail.SmtpClient :: Send()可能不是应该的同步。我在一个由任务计划程序运行的PowerShell脚本中使用此类。从powershell控制台运行脚本时,我总是收到消息。但是,当将脚本作为计划任务运行时,我不会。

我通过让脚本在发送后休眠1秒来解决问题 - 我怀疑在会话结束时PowerShell关闭会导致SMTP会话被杀死,这在交互式会话中运行时不会发生

我知道它很草率,但我还没有想出一个更好的方法来确保它真的完成了。也许有一个必须刷新的缓冲区?

另一种方法可能是在发送实际消息后使用伪造消息调用Send()。我发现如果我这样做,就会一直发送消息。这仍然很草率,但我发现它稍微不那么草率,因为它更有可能实际上要求在发送之前刷新缓冲区,而等待任意数量的时间肯定不会导致它。

答案 3 :(得分:0)

它不起作用的原因是因为您的目标是端口465.将EnableSsl与端口25一起使用(尽管不使用Gmail)或端口587应该适合您。

端口465上的SMTPS,或Microsoft在很多地方调用的“隐式SSL”,SmtpClient类不支持。 EnableSsl属性控制在查找未加密连接后该类是否会查找并使用STARTTLS命令。

根据Microsoft SmtpClient.EnableSsl Property documentation

  

SmtpClient类仅支持SMTP服务扩展   通过RFC 3207中定义的传输层安全保护SMTP   在这种模式下,SMTP会话在未加密的频道上开始,然后是   STARTTLS命令由客户端发送到要切换到的服务器   使用SSL进行安全通信。请参阅Internet发布的RFC 3207   工程任务组(IETF)获取更多信息。

     

备用连接方法是建立SSL会话的位置   在发送任何协议命令之前预先准备好。这种连接方法   有时称为SMTP / SSL,SMTP over SSL或SMTPS,默认情况下   使用端口465.这种使用SSL的备用连接方法不是   目前支持。

如果您确实需要在端口465上使用SMTPS,则可以使用在后台使用CDONTS的已弃用的System.Web.Mail类,例如: https://stackoverflow.com/a/1014876