【问题标题】:How sent e-mail from ASP.NET site using GMail's SMTP server? [duplicate]如何使用 GMail 的 SMTP 服务器从 ASP.NET 站点发送电子邮件? [复制]
【发布时间】:2011-07-18 20:12:21
【问题描述】:

可能重复:
Sending email through Gmail SMTP server with C#

我希望我的 ASP.NET MVC 应用程序向网站用户发送一些标准信件。出于测试目的,我没有本地 SMTP 服务器,而且我的提供商也没有我所知道的。所以我必须使用像 GMail 的 SMTP 这样的公共服务。

如何使用smtp.gmail.com 和我的GMail 帐户发送电子邮件?如果我的电子邮件是 drastomail@gmail.com 并且我的密码是 password,我到底应该把什么放到 Web.config 和 whot 上?

谢谢


编辑

当我尝试以下演示程序时:

class Program {
    static void Main(string[] args) {
        var client = new SmtpClient("smtp.gmail.com", 587) {
            Credentials = new NetworkCredential("puzzlehunters@gmail.com", "puzzlehunters111"),
            EnableSsl = true
        };
        client.Send("puzzlehunters@gmail.com", "puzzlehunters@gmail.com", "test", "testbody");
        Console.WriteLine("Sent");
        Console.ReadLine();
    }
}

异常失败。大多数内部异常都带有此消息:

No connection could be made because the target machine actively refused it 209.85.227.109:587

任何所有当前答案(最早 3 个)也给了我同样的例外。我能用它做什么?

【问题讨论】:

  • 我很确定 smtp 服务器必须驻留在您的应用程序所在的服务器上。虽然我想有人有一个 API 可以将消息发送到,它会从那里发送消息。
  • @Nick 一点也不。 SMTP 中继可以在任何地方。现在,大多数服务器管理员会将中继限制为本地应用程序,但这是一项配置设置,并不是硬性要求。
  • @Wyatt Barnett,很高兴知道这一点。
  • 请查看我对问题的编辑。
  • @p.campbell 在我编辑后不再存在。那里提出的解决方案对我来说会引发异常。

标签: c# asp.net web-config smtp


【解决方案1】:

这可能是防火墙问题。运行您的代码的服务器上的防火墙可能会阻止 TCP 端口 587 上的流量。也可能是在您的服务器和 Internet 之间的网络基础设施中被阻止。

【讨论】:

    【解决方案2】:

    这是我过去使用过的一个类:

    namespace MyApp
    {
        public class GMailer
        {
            public static string GmailUsername { get; set; }
            public static string GmailPassword { get; set; }
            public static string GmailHost { get; set; }
            public static int GmailPort { get; set; }
            public static bool GmailSSL { get; set; }
    
            public string ToEmail { get; set; }
            public string Subject { get; set; }
            public string Body { get; set; }
            public bool IsHtml { get; set; }
    
            static GMailer()
            {
                GmailHost = "smtp.gmail.com";
                GmailPort = 25; // Gmail can use ports 25, 465 & 587; but must be 25 for medium trust environment.
                GmailSSL = true;
            }
    
            public void Send()
            {
                SmtpClient smtp = new SmtpClient();
                smtp.Host = GmailHost;
                smtp.Port = GmailPort;
                smtp.EnableSsl = GmailSSL;
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.UseDefaultCredentials = false;
                smtp.Credentials = new NetworkCredential(GmailUsername, GmailPassword);
    
                using (var message = new MailMessage(GmailUsername, ToEmail))
                {
                    message.Subject = Subject;
                    message.Body = Body;
                    message.IsBodyHtml = IsHtml;
                    smtp.Send(message);
                }
            }
        }
    }
    

    这个类需要在你的Application_Start事件中配置:

    GMailer.GmailUsername = "you@gmail.com";
    GMailer.GmailPassword = "password";
    

    用法:

    GMailer mailer = new GMailer();
    mailer.ToEmail = "someone@somewhere.com";
    mailer.Subject = "Email Subject Line";
    mailer.Body = "This is a test message";
    mailer.IsHtml = false;
    mailer.Send();
    

    【讨论】:

    • 请查看我对原始问题的编辑
    • 在尝试您的代码时会引发完全相同的异常。
    • 这很奇怪。只需将此代码复制并粘贴到 LINQPad 中,它就可以毫无问题地发送邮件。您是否尝试过使用其他端口? (我认为,25、465 和 587 都支持)。
    【解决方案3】:

    使用如下简单的实用程序类:

    using System.IO;
    using System.Net.Mail;
    using System.Text;
    using System.Net;
    public sealed class Emailer
    {
        private Emailer()
        {
        }
    
        public static void SendMail(string subject, string to, 
            string from = null, string body = null, Stream attachment = null,
            int port = 25, string host = "localhost", bool isBodyHtml = true)
        {
            MailMessage mailMsg = new MailMessage();
            mailMsg.From = new MailAddress(from);
            mailMsg.To.Add(to);
            mailMsg.Subject = subject;
            mailMsg.IsBodyHtml = isBodyHtml;
            mailMsg.BodyEncoding = Encoding.UTF8;
            mailMsg.Body = body;
            mailMsg.Priority = MailPriority.Normal;
    
            //Message attahment
            if (attachment != null)
                mailMsg.Attachments.Add(new Attachment(attachment, "my.text"));
    
            // Smtp configuration
            SmtpClient client = new SmtpClient();
            client.Credentials = new NetworkCredential("YOUR_GMAIL_USER_NAME", "PASSWORD");
            client.UseDefaultCredentials = true;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.Port = port; //use 465 or 587 for gmail           
            client.Host = host;//for gmail "smtp.gmail.com";
            client.EnableSsl = false;
    
            MailMessage message = mailMsg;
    
            client.Send(message);
    
        }
    
    }
    

    【讨论】:

    • 请查看我对原始问题的修改。
    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2020-11-19
    • 2014-10-28
    • 1970-01-01
    • 2012-10-20
    • 2010-10-17
    相关资源
    最近更新 更多