如何使用 GMail 的 SMTP 服务器从 ASP.NET 站点发送电子邮件? [复制]

Posted

技术标签:

【中文标题】如何使用 GMail 的 SMTP 服务器从 ASP.NET 站点发送电子邮件? [复制]【英文标题】:How sent e-mail from ASP.NET site using GMail's SMTP server? [duplicate] 【发布时间】: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 在我编辑后不再存在。那里提出的解决方案对我来说会引发异常。 【参考方案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);

    


【讨论】:

请查看我对原始问题的修改。

以上是关于如何使用 GMail 的 SMTP 服务器从 ASP.NET 站点发送电子邮件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP-2.0:如何使用 CakEmail 和 SMTP 设置从 gmail 帐户发送电子邮件?

如何在Linux命令行中通过SMTP服务器发送电子邮件

从PHP页面使用GMail SMTP服务器发送电子邮件

无法使用 codeIgniter 从 gmail smtp 服务器发送电子邮件?

PHPMailer使用GMAIL SMTP和多个GMAIL帐户用于多个虚拟主机

如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?