从localhost和在线asp.net发送电子邮件

时间:2012-04-18 07:58:27

标签: c# asp.net email smtp localhost

我知道如何通过c#

中的代码通过smtp发送电子邮件

如果我设置了一个gmail smtp,它在localhost中工作正常 但当我上传并使其在线,然后gmail(smtp.gmail.com)设置不起作用。我必须在上传

后每次更改设置到godaddy(relay-hosting.secureserver.net)

现在我的问题是!有什么方法我可以找到我在代码或在线的localhost然后动态更改设置我在db中存储我的设置 我的工作代码是

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);

我不想每次都更改我的设置,在线或在localhost环境中开发 我想要这个流程,我怎么知道我的应用程序是在线代码或本地代码隐藏在

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

3 个答案:

答案 0 :(得分: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> 

答案 1 :(得分:3)

参考: Determine if ASP.NET application is running locallyHow secure is 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;

修改

请按照这些链接,这些不是您问题的确切原因,而是指导您在本地计算机上解决此问题:
I can receive mail but not send from an account I set up in windows live mail
sending email using gmail account on local machine

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

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

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

价:
Request.UserHostName
How to get the IP address of a machine in C#
get remote Ip address or machine name

答案 2 :(得分: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