好;我似乎无法发送邮件。我将它作为控制台应用程序运行:
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导致一个空白的命令提示符窗口。 感谢。
答案 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