0

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

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 上远程登录 smtp.gmail.com 会导致一个空白的命令提示符窗口。谢谢。

4

4 回答 4

4

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

它没有打印“完成!” 因为您在调用方法正在挂钩事件。Send()在调用 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());

        }
    }
于 2013-01-13T23:17:31.177 回答
1

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

于 2014-12-18T18:50:02.383 回答
0

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

我通过在发送后让脚本休眠 1 秒解决了这个问题——我怀疑 SMTP 会话被脚本结束时关闭的 powershell 杀死,从交互式会话运行它时不会发生这种情况。

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

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

于 2013-03-21T16:58:04.973 回答
0

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

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

根据Microsoft SmtpClient.EnableSsl 属性文档

SmtpClient 类仅支持 RFC 3207 中定义的基于传输层安全的安全 SMTP 的 SMTP 服务扩展。在这种模式下,SMTP 会话在未加密的通道上开始,然后客户端向服务器发出 STARTTLS 命令以切换到使用 SSL 进行安全通信。有关详细信息,请参阅 Internet 工程任务组 (IETF) 发布的 RFC 3207。

另一种连接方法是在发送任何协议命令之前预先建立 SSL 会话。此连接方法有时称为 SMTP/SSL、SMTP over SSL 或 SMTPS,默认使用端口 465。当前不支持使用 SSL 的替代连接方法。

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

于 2016-09-08T04:22:33.947 回答