4

C#のコードでsmtp経由でメールを送信する方法を知っています

gmail smtp を設定すると、localhost では問題なく動作しますが、アップロードしてオンラインにすると、gmail (smtp.gmail.com) の設定が機能しません。アップロード後、godaddy で毎回設定を (relay-hosting.secureserver.net) に変更する必要があります

今私の質問です!コードまたはオンラインでローカルホストにいるのかどうかを確認してから、設定を動的に変更する方法はありますか?設定を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);

オンラインであるかローカルホスト環境で開発しているかに関係なく、毎回設定を変更し
たくありません

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.IsLocalRequest.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;

編集

これらのリンクをたどってください。これらは問題の正確な理由ではありませんが、ローカル マシンでこれを解決するためのガイドです:メールを受信できますが、ローカル マシンで gmail アカウントを使用してメールを送信
する Windows Live メールで設定したアカウントから送信できません

もう 1 つの側面は、ローカル マシンの IP またはマシン名をチェックして、 HttpRequest クラス HttpRequest.UserHostAddress プロパティを使用して、リモート サーバー上の Web サイトまたは自分のマシンのいずれかを把握できることです。

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

ローカルホストで実行しているかどうかを確認したいだけの場合は、次のようなことができます。

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 に答える