2012-07-03 4 views
2

주석 상자를 추가하고 사용자가 새 처리기를 호출하여이를 DB에 적용하기 위해 삽입 처리기를 호출 할 때마다 추가했습니다. 여기서 내가 좋아하는 것은 빠르면 빠르다는 것입니다.asp.net에서 보내는 전자 메일 지연을 극복하는 방법

지금 내가하고 싶은 일은 새로운 코멘트가 삽입 될 때마다, 지연없이 삽입하는 것입니다.

는 그래서 난려면 SmtpClient 을 추가하고 동일한 삽입 핸들러가 SendAsync 를 사용하여 메일을 보내주십시오. 나를 위해 충분하지 않았다. 심지어 가장 간단한 이메일 본문 ("hello world")에도 repsonse하기까지 5 초가 걸렸다. 아마 새 스레드를 추가해야합니까?

이메일 전송 지연을 극복하는 다른 방법이 있습니까? 새 처리기를 작성하여 삽입 처리기의 onComplete을 실행하고, 백그라운드에서 보내는 메일을 처리 할 다른 처리기를 호출하므로 사용자가 알지 못합니다. 이 문제는 스팸 일 수 있지만 동일한 핸들러를 계속해서 다시 호출하는 경우가 있습니다.

+2

이메일 전송 어쨌든 비동기 작업 본질적이다 - 왜 * 문제가 어디에서 일부 지연이 도입 *을합니까? –

+0

이것은 조숙 한 최적화처럼 보입니다. 이메일에 관해서는 몇 초의 지연이 예상되며 어쨌든 발신자에서 수신자로 유선을 통해 이동해야합니다.길을 따라 약간의 네트워크 속도 저하가이 "지연"을 극복하기 위해 한 모든 작업을 쓸모 없게 만드는 데 필요한 모든 것입니다. 또한 * 고객 *이 약간의 지연을 도입한다는 점도 지적 할 가치가 있습니다 (Outlook은 새로운 메시지를보고 확인하고 몇 분 * 이전에 수신되었음을 확인합니다. PC가 오래되거나 바쁜/느림). – Alex

+0

수신자 사서함에 들어가기까지 이메일이 오랫동안 걸릴지는 신경 쓰지 않습니다. 그것은 내가 걱정하는 전송 지연 자체입니다. 지연은 5 분 지연으로 이어지며 Enter 키를 누르면 함수가 복귀합니다. – Yaniv

답변

1

이 문제를 다루는 데는 여러 가지 방법이 있지만 내 접근 방식은 항상 데이터베이스에서 직접 읽고 전자 메일을 ASP.NET 응용 프로그램과 별도로 보내는 완전히 다른 시간에 지정된 프로세스 나 서비스를 사용하는 것이 었습니다.

이상적인 대규모 응용 프로그램에서는 수신 측에서 MSMQ - Microsoft Message Queuing과 같은 별도의 프로세스를 사용합니다.

편집 :

OK, 그래서 (매우 부서지기 쉬운 것 때문에 난 강력하게 사용 억제 것) 장소의 몇 온라인 언급하지만, 기본적으로는 ASP를 만드는 작업이 포함되는 또 다른 방법이있다. NET webservice는 jQuery를 사용하여 전자 메일을 보내고 해당 서비스를 호출하는 코드를 포함합니다. 그래서 당신이 결국 그렇게하면이

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 
public class EmailSender : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public void SendEmail(string email, string message) 
    { 
     //Send my email 
    } 
} 

좋아하고 당신이이 라인을 따라 뭔가를 호출 할 것이다 제출 또는 양식 포스트 백에 웹 서비스 선언 무언가이다.

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8;", 
    url: "EmailSender.asmx", 
    data: JSON.stringify({ email: "[email protected]", 
     message: "this is a test message" 
    }), 
    dataType: "json", 
    success: function (data, textStatus, jqXHR) { 
     //Do success stuff 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     //Do error stuff 
    } 
}); 
+0

내 호스팅 계획이 좋지 않아 현재 서비스가 옵션이 아닙니다. – Yaniv

+0

jQuery OnComplete와 함께 Generic Handler를 호출하여 이메일을 보내겠습니까? 나는 그것에 대해 생각했지만 스패머들에게 열려있을 수 있습니다 ... – Yaniv

+0

사실 그것은 작동 할 수도 있고, 스패머에게 공개 될 것이라는 데 동의하지만 많은 선택의 여지가없는 것 같습니다. 솔직히 나는 아직도 당신이이 문제를 해결하기 위해 노력하는 것보다 귀하의 호스팅을 업그레이 드하는 것이 좋습니다. 아래의 제안은 너무 나쁘지 않지만 귀하의 호스팅 계획에 따라서는 불가능할 수도 있습니다. –

0

한 프로젝트에서 같은 문제가있었습니다. 그 문제에 대한 나의 해결책은 보내야 할 이메일을 덤프하기 위해 내 홈페이지의 픽업 위치와 별도의 SMTP 서버를 실행하는 것이 었습니다. 이 작업을 수행 할 때 전자 메일은 ASP .Net 사이드 인스턴트에서 생성됩니다. 그런 다음 SMTP 서버가 실제 보내기 절차를 처리합니다.

이렇게하면 내 웹 페이지가 빠르게 응답하고 너무 많은 이메일을 보내지 않아도되므로 내 SMTP 서버가 다른 SMTP 서버에 의해 블랙리스트에 추가됩니다.

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpdeliverymethod.aspx

0

아마 당신은이 코드의 SendMailMessageAsync() 메서드를 사용할 수 있습니다. 이것은 BlogEngine의 소스 코드에서 가져온 것입니다.

public static string SendMailMessage(MailMessage message) 
{ 
    if (message == null) 
    { 
     throw new ArgumentNullException("message"); 
    } 

    StringBuilder errorMsg = new StringBuilder(); 

    try 
    { 
     message.IsBodyHtml = true; 
     message.BodyEncoding = Encoding.UTF8; 
     var smtp = new SmtpClient(Settings.Instance.SmtpServer); 

     // don't send credentials if a server doesn't require it, 
     // linux smtp servers don't like that 
     if (!string.IsNullOrEmpty(Settings.Instance.SmtpUserName)) 
     { 
      smtp.Credentials = new NetworkCredential(yourusername, yourpassword)); 
     } 

     smtp.Port = Settings.Instance.SmtpServerPort; 
     smtp.EnableSsl = Settings.Instance.EnableSsl; 
     smtp.Send(message); 
    } 
    catch (Exception ex) 
    { 
     errorMsg.Append("Error sending email in SendMailMessage: "); 
     Exception current = ex; 

     while (current != null) 
     { 
      if (errorMsg.Length > 0) { errorMsg.Append(" "); } 
      errorMsg.Append(current.Message); 
      current = current.InnerException; 

      Logger.Error("Error sending email in SendMailMessage.", ex); 
     } 
    } 
    finally 
    { 
     // Remove the pointer to the message object so the GC can close the thread. 
     message.Dispose(); 
    } 

    return errorMsg.ToString(); 
} 

public static void SendMailMessageAsync(MailMessage message) 
{ 
    ThreadPool.QueueUserWorkItem(delegate { SendMailMessage(message); }); 
} 
관련 문제