【问题标题】:Email sending issue using C#使用 C# 的电子邮件发送问题
【发布时间】:2018-08-01 14:40:54
【问题描述】:

我正在使用 c# 发送一封电子邮件,并从 web.config 文件中使用的 appsettings 获取所有值,但我的问题是我没有收到任何电子邮件,尽管我没有收到任何异常或错误。请帮我解决我的问题,这是我的代码

public static bool SendMail(string to,string subject, string body)
    {
        try
        {
            MailMessage mailMessage = new MailMessage();
            mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["smtpUser"]);
            mailMessage.To.Add(new MailAddress(to));
            mailMessage.Subject = subject;
            mailMessage.IsBodyHtml = true;
            mailMessage.Body = body;
            using (SmtpClient smtp = new SmtpClient())
            {
                smtp.EnableSsl = true;
                smtp.Host = ConfigurationManager.AppSettings["smtpServer"];
                smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["smtpPort"]);
                smtp.UseDefaultCredentials = false;
                smtp.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["smtpUser"], ConfigurationManager.AppSettings["smtpPass"]);
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.SendMailAsync(mailMessage);
                return true;
            }
        }
        catch (Exception ex)
        {
            return false;
        }
    }

这是我的 web.config 设置

 <add key="smtpServer" value="smtp.gmail.com" />
<add key="smtpPort" value="587" />
<add key="smtpUser" value="offey2018@gmail.com" />
<add key="smtpPass" value="*******" />

【问题讨论】:

  • 所以你的代码返回true ?
  • 您检查过垃圾邮件文件夹吗?
  • 我的一个愚蠢问题,但你检查过垃圾邮件文件夹吗?
  • 是的,我的代码返回 true。
  • 是的,我也检查了我的垃圾邮件文件夹。没关系,你可以问我任何问题。

标签: c# asp.net-mvc async-await web-config smtpclient


【解决方案1】:

您无需等待它完成发送电子邮件,而是在发送电子邮件之前处理(using 块)SmtpClient:

smtp.SendMailAsync(mailMessage);

异步返回一个Task,如果你想等到它完成,你必须等待它。

例子:

// this does require that the enclosing method is also async, and awaited
await smtp.SendMailAsync(mailMessage);

或者,或者,只使用这个:

smtp.Send(mailMessage);

【讨论】:

  • 您确定我们可以使用 SendMail 方法吗?我认为 SmtpClient 中没有提供名为 SendMail 的方法。
  • @Suvethan 对不起,我记错了。只是Send。
【解决方案2】:

试试这个

如果您打算使用 SendMailAsync 方法,您可以按照以下方式进行操作

public static async Task SendMail(string to,string subject, string body)
{
    try
    {
        MailMessage mailMessage = new MailMessage();
        mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["smtpUser"]);
        mailMessage.To.Add(new MailAddress(to));
        mailMessage.Subject = subject;
        mailMessage.IsBodyHtml = true;
        mailMessage.Body = body;
        using (SmtpClient smtp = new SmtpClient())
        {
            smtp.EnableSsl = true;
            smtp.Host = ConfigurationManager.AppSettings["smtpServer"];
            smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["smtpPort"]);
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["smtpUser"], ConfigurationManager.AppSettings["smtpPass"]);
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            await smtp.SendMailAsync(mailMessage);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

否则您可以使用以下方式通过非异步方法发送邮件

public static bool SendMail(string to,string subject, string body)
{
    try
    {
        MailMessage mailMessage = new MailMessage();
        mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["smtpUser"]);
        mailMessage.To.Add(new MailAddress(to));
        mailMessage.Subject = subject;
        mailMessage.IsBodyHtml = true;
        mailMessage.Body = body;
        using (SmtpClient smtp = new SmtpClient())
        {
            smtp.EnableSsl = true;
            smtp.Host = ConfigurationManager.AppSettings["smtpServer"];
            smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["smtpPort"]);
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["smtpUser"], ConfigurationManager.AppSettings["smtpPass"]);
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtp.Send(mailMessage);
            return true;
        }
    }
    catch (Exception ex)
    {
        return false;
    }
}

注意

async 方法只能有两种返回类型 1) Void 2)Task 。因此,您可以根据需要使用任何一种方式。

我希望这会对你有所帮助。如果您有任何疑问或问题,请告诉我。

【讨论】:

  • SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.5.1 需要身份验证。了解更多信息...我收到以下错误
  • @ShamshadJamal 你检查了下面的文章我认为这是因为你可以按照下面的文章修复它的时区吗? stackoverflow.com/questions/20906077/…
猜你喜欢
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多