我知道如何通过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
答案 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 locally和How 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
。