Отправка сообщения электронной почты в WP7 на необработанное исключение - PullRequest
3 голосов
/ 10 мая 2011

Есть ли способ отправить сообщение электронной почты с подробностями, когда в приложении WP7 возникает необработанное исключение?

Я видел подход журналирования WCF / отправки электронной почты, но у меня нет места для публичного размещения службы.

Ответы [ 4 ]

6 голосов
/ 10 мая 2011

Посмотрите на Энди Пеннелла " маленький Ватсон ".Работает довольно хорошо.

1 голос
/ 10 мая 2011

Я использую следующее в своем приложении, оно немного запутанное, но работает.Следующий код находится в App.xaml.cs:

/// <summary>
/// Indicates whether the application needs to quit due to a previous exception
/// </summary>
private static bool _appMustQuit = false;

/// <summary>
/// Exception class that will be unhandled causing application to quit
/// </summary>
private class AppQuitException : Exception {}



// Code to execute on Unhandled Exceptions
private void Application_UnhandledException( object sender,
                                             ApplicationUnhandledExceptionEventArgs e )
{
  if( ( e.ExceptionObject is AppQuitException ) == false ) {
    Debug.WriteLine( "App:Application_UnhandledException - " + e.ToString() );

    if( Debugger.IsAttached ) {
      // An unhandled exception has occurred; break into the debugger
      Debugger.Break();

    } 

    // Compose error report
    StringBuilder report = new StringBuilder( 1024 );

    report.AppendFormat( "{0}", LangResources.ErrorReportContent );
    report.AppendFormat( "Message: {0}\n", e.ExceptionObject.Message );
    if( e.ExceptionObject.InnerException != null ) {
      report.AppendFormat( "Inner: {0}\n", e.ExceptionObject.InnerException.Message );
    }
    report.AppendFormat( "\nStackTrace: {0}\n", e.ExceptionObject.StackTrace );

    if( MessageBox.Show( "Unexpected Error", "Error", MessageBoxButton.OKCancel ) 
        == MessageBoxResult.OK ) {
      e.Handled = true;

      // Email the error report
      Tasks.ComposeEmail( "\"Developer\" <your@emailaddress.com>", "MyApp Error Report",
        report.ToString() );
      _appMustQuit = true;
    }
  }
}


// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated( object sender, ActivatedEventArgs e )
{
  var state = PhoneApplicationService.Current.State;

  if( state.ContainsKey( "AppMustQuit" ) ) {
    throw new AppQuitException();

  } else {
    // Restore other tombstoned variables

  }
}

// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated( object sender, DeactivatedEventArgs e )
{
  if( _appMustQuit ) {
    state["AppMustQuit"] = true;

  } else {
    // Save other variables for tombstoning

  }
}

Tasks - это статический класс с набором вспомогательных функций из пространства имен Microsoft.Phone.Tasks.

using Microsoft.Phone.Tasks;

namespace MyApp
{
  /// <summary>
  /// Utility class for performing various phone tasks
  /// </summary>
  public static class Tasks
  {
    /// <summary>
    /// Composes an email using the specified arguments
    /// </summary>
    /// <param name="to">The recepient(s) of the email</param>
    /// <param name="subject">Email subject</param>
    /// <param name="body">Email contents</param>
    /// <param name="cc">The recipient(s) on the cc line of the email</param>
    public static void ComposeEmail( string to, string subject, string body,
                                     string cc = "" )
    {
      var task = new EmailComposeTask() {
        To = to,
        Subject = subject,
        Body = body,
        Cc = cc,
      };
      task.Show();
    }
  }
}

Toнемного объясните код, используя EmailComposeTask, и ваше приложение будет захоронено.Поскольку я не хочу продолжать выполнение приложения после необработанного исключения, я сохраняю логическое значение в словаре PhoneApplicationService State, чтобы после отправки пользователем сообщения электронной почты при повторном пробуждении приложенияЯ могу искать это логическое значение и выдавать другое исключение, которое намеренно не обрабатывается.Это второе исключение приводит к закрытию приложения.

1 голос
/ 10 мая 2011

Единственный другой вариант, который у вас есть, - это использование EmailComposeTask . Это оставляет вас в зависимости от пользователя, чтобы отправить сообщение, потому что оно даст вам свой адрес электронной почты, но в настоящее время это единственный способ отправить сообщение без службы WCF.

Пример 1:

private void emailAddressChooserTask_Completed(object sender, EmailResult e) 
{ 
    if (e.TaskResult == TaskResult.OK) 
    { 
        MessageBox.Show("Selected email :" + e.Email); 

        //in-real world application user expect to select it from his contacts and if not found enter manually. 
        //EmailComposeTask emailComposeTask = new EmailComposeTask(); 
        //emailComposeTask.To = e.Email; 
        //emailComposeTask.To = saveEmailAddressTask.Email; 
        //emailComposeTask.Body = "WP7 Emails Demo"; 
        //emailComposeTask.Cc = "testmail2@test.com"; 
        //emailComposeTask.Subject = "Windows Phone 7"; 
        //emailComposeTask.Show(); 
    } 
} 

Пример 2:

private void composeMail_Click(object sender, RoutedEventArgs e) 
{ 
    EmailComposeTask emailComposeTask = new EmailComposeTask(); 
    emailComposeTask.To = "chris@example.com"; 
    emailComposeTask.To = saveEmailAddressTask.Email; 
    emailComposeTask.Body = "WP7 Emails Demo"; 
    emailComposeTask.Cc = "testmail2@test.com"; 
    emailComposeTask.Subject = "Windows Phone 7"; 
    emailComposeTask.Show(); 
} 

Соус: http://www.windowsphonegeek.com/articles/1-how-to-perform-email-tasks-in-a-wp7-app

0 голосов
/ 03 апреля 2014

Если кто-то ищет сообщения электронной почты в фоновом режиме (без загрузки EmailComposeTask), тогда MailMessage может быть лучшим вариантом, так как он также разрешает вложения, которые EmailComposeTask вообще не поддерживает.это позволит вам отправлять электронные письма, не беспокоя пользователей в фоновом режиме, используя свой собственный Gmail или любой другой аккаунт.

вы можете получить его у NuGet Install-Package MailMessage, чтобы попробовать, однако я сам не использовал его, поэтому, возможно, вам придется купить его у сайта авторов только за 29,99 $это действительно стоит заплатить за это.Бесплатная версия также работает, но она показывает всплывающее сообщение в приложении перед отправкой электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...