从本地主机和在线 asp.net 发送电子邮件

本文关键字:net 电子邮件 asp 在线 主机 | 更新日期: 2023-09-27 18:31:32

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

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

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

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 

从本地主机和在线 asp.net 发送电子邮件

参考:确定应用程序是否在本地运行 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 实时邮件
中设置的帐户发送邮件在本地计算机上使用 Gmail 帐户发送电子邮件

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

如果 IP 与 ip 请求对象匹配,则返回计算机地址的 IP 地址。

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

裁判:
请求.用户名
如何在 C#
中获取计算机的 IP 地址获取远程 IP 地址或计算机名称

为什么不使用 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> 

如果你只是想检查你是否在本地主机上运行,那么你可以做这种事情:

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

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

我已经使用了这个"愤怒",它工作正常。

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

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

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