SMTP异常“发送邮件失败”

12

我创建了一个控制台应用程序来发送电子邮件。

    public static void sendEmail(string email, string body)
    {
        if (String.IsNullOrEmpty(email))
            return;
        try
        {
            MailMessage mail = new MailMessage();
            mail.To.Add(email);
            mail.From = new MailAddress("test@gmail.com");
            mail.Subject = "sub";

            mail.Body = body;

            mail.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.gmail.com"; //Or Your SMTP Server Address
            smtp.Credentials = new System.Net.NetworkCredential("test@gmail.com", "admin@1234"); // ***use valid credentials***
            smtp.Port = 587;

            //Or your Smtp Email ID and Password
            smtp.EnableSsl = true;
            smtp.Send(mail);
        }
        catch (Exception ex)
        {

        }
    }

我正在使用正确的凭据登录我的Gmail账户。

是否需要进行任何设置来配置Gmail账户


1
你能发布完整的异常信息吗?另外,在你的Gmail安全设置中,允许不太安全的应用程序。 - user1666620
如果我没记错的话,GMail仅支持SMTPS访问。 - Andrea Corbellini
我启用了“较不安全的应用程序”。它正在工作,非常感谢。 - user5264652
2个回答

16

很可能您实际上遇到了这个错误,只是因为您处于控制台应用程序中,它被某种方式压制了。

SMTP服务器需要安全连接或客户端未经身份验证。服务器响应为:5.5.1需要身份验证。

更改此代码片段并添加一行额外代码。重要的是它在凭据之前。

smtp.Host = "smtp.gmail.com"; //Or Your SMTP Server Address
// ** HERE! **
smtp.UseDefaultCredentials = false;
// ***********
smtp.Credentials = new System.Net.NetworkCredential("test@gmail.com", "admin@1234"); // ***use valid credentials***
smtp.Port = 587;

您还需要前往此处并启用 less secure apps。

https://www.google.com/settings/security/lesssecureapps

如果您的帐户启用了两步验证,您需要设置一个应用程序专用密码,然后在代码中使用该密码,而不是您的主帐户密码。

我刚刚在我的两步帐户上进行了测试并验证了此方法有效。以下是我的整个方法,直接从 LINQPad 复制(当然,已删除详细信息)。

var fromAddress = new MailAddress("myaccount@gmail.com", "My Name");
var toAddress = new MailAddress("test.address@email.com", "Mr Test");
const string fromPassword = "tbhagpfpcxwhkczd";
const string subject = "test";
const string body = "HEY, LISTEN!";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
    Timeout = 20000
};

using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}

编辑:

使用附件:

using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    Attachment attachment = new Attachment(filePath);
    message.Attachments.Add(attachment);

    smtp.Send(message);
}

这里如何使用“Attachments”? - user5264652
1
添加了一个附件的示例 :-) - Equalsk

0
在我使用C# SMTP客户端的经验中,代码需要遵循一定的步骤(见下面的代码片段)。
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Credentials = new NetworkCredential("account@gmail.com", "secretPassword");
smtpClient.Send(mail);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接