4

我知道如何在 C# 代码中通过 smtp 发送电子邮件

如果我设置了 gmail smtp,它在 localhost 中可以正常工作,但是当我上传并使其在线时,gmail (smtp.gmail.com) 设置不起作用。上传后我每次都必须在godaddy将设置更改为(relay-hosting.secureserver.net)

现在我的问题是!有什么办法可以找出我是在代码中还是在线的本地主机上然后动态更改设置我将我的设置存储在数据库中我的工作代码是

mm.LoadByPrimaryKey(4);//get body , subject etc from db
  mc.LoadByPrimaryKey(1);// get settings from db (host, from , port etc)

 var maTo = new MailAddress(strEmail, userName);
    var mMailMessage = new MailMessage
                           {
  Subject = mm.Subject,
  Body = strBody,
  IsBodyHtml = true,
  Priority = MailPriority.High,
  From =new MailAddress(mc.AdminEmailAddress),
  DeliveryNotificationOptions=      DeliveryNotificationOptions.OnFailure
                           };
    mMailMessage.To.Add(maTo);
    var mSmtpClient = new SmtpClient
                                 {
             UseDefaultCredentials = false,
             Host = mc.Host,
             Credentials = CredentialCache.DefaultNetworkCredentials,
             DeliveryMethod = SmtpDeliveryMethod.Network};
             mSmtpClient.Send(mMailMessage);

我不想每次都更改我的设置,无论是在线还是在本地主机环境中开发
我想要这个流程以及我如何知道我的应用程序在线或代码后面的本地主机

if(myconnection ==localhost) then fetch gmail credentials 
else if (myconnection==online) then fetch godaddys credentials 
4

3 回答 3

3

为什么不使用 Web.Config?

<system.net> 
<mailSettings> 
<smtp from="YYYYY@xxxxxx.com"> 
<network 
host="mail.xxxxxx.com" 
port="25" 
password="password" 
userName="user@xxxxxx.com" 
defaultCredentials="false" 
/> 
</smtp> 
</mailSettings> 
</system.net> 
于 2012-04-18T08:02:19.817 回答
3

参考: 确定 ASP.NET 应用程序是否在本地运行以及Request.IsLocal 的安全性如何?

根据评论检查localhost使用 HttpContext.Current.Request.IsLocal属性的最佳方法。它与 Request.IsLocal 与检查 127.0.0.1 或 ::1 相同。

用这个:

bool isLocal = HttpContext.Current.Request.IsLocal;

if(isLocal) then fetch gmail credentials 
else if (myconnection==online) then fetch godaddys credentials 

通过 gmail 发送邮件的示例代码片段是:

SmtpClient mailClient = new SmtpClient(); 
            //This object stores the authentication values      
            System.Net.NetworkCredential basicCredential = 
                new System.Net.NetworkCredential("username@mydomain.com", "****"); 
            mailClient.Host = "smtp.gmail.com"; 
            mailClient.Port = 587; 
            mailClient.EnableSsl = true; 
            mailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
            mailClient.UseDefaultCredentials = false; 
            mailClient.Credentials = basicCredential; 


            MailMessage message = new MailMessage(); 

            MailAddress fromAddress = new MailAddress("info@mydomain.com", "Me myself and I "); 
            message.From = fromAddress; 
            //here you can set address    
            message.To.Add("to@you.com"); 
            //here you can put your message details 

            mailClient.Send(message);

如果这些设置与配置匹配,那么您绝对可以通过 gmail 发送邮件。

检查您的这部分设置。

 NetworkCredential NetCrd = new NetworkCredential(youracc, yourpass);   
  smtpClient.UseDefaultCredentials = false;    
  smtpClient.Credentials = NetCrd;

编辑

按照这些链接,这些不是您问题的确切原因,而是在您的本地计算机上解决此问题的指南:
我可以接收邮件,但不能从我在 Windows Live Mail 中设置的帐户
发送邮件 在本地计算机上使用 gmail 帐户发送电子邮件

另一个方面是,您可以使用HttpRequest 类 HttpRequest.UserHostAddress 属性检查本地机器 ip 或机器名称以找出远程服务器上的网站或您自己的机器上的网站。

如果 Ip 与 ip 请求对象匹配,则将 ip 地址返回到您的机器地址。

if (ip match to your machine)// local host else run your remote settings

Ref:
Request.UserHostName
如何在 C# 中获取机器的 IP 地址
获取远程 IP 地址或机器名称

于 2012-04-18T08:18:21.463 回答
1

如果您只想检查您是否在 localhost 上运行,那么您可以执行以下操作:

if (Request.UrlReferrer.DnsSafeHost.ToLower() == "localhost")
{
  // Do it the gmail way
}
else
{
  // Use the online stuff
}

这样做的好处是您不需要检查实际的 URL,除非您愿意(因此您不需要更改任何配置文件或任何东西)。

我已经在“愤怒”中使用了它,并且效果很好。

显然,关于在您的实时代码中存储 gmail 凭据的问题是一个单独的问题,不是您问题的一部分。实际上,我认为您说您将它们存储在数据库中,这很好。

编辑:当我使用它时,我会检查它是否Request.UrlReferrer.DnsSafeHost是我的实际活动域,以防止有人从不同来源发布到我的页面的简单攻击。

如果您只是想检查您在哪里运行而不关心您是如何到达那里的(不一定是一个好主意),您可以使用Request.Url.DnsSafeHost.

于 2012-04-18T10:57:36.683 回答