C # Avvia un nuovo processo MailTo e codifica URL HTML

Ho creato un nuovo metodo di estensione MailTo per la class Process che riempie semplicemente il processo con un nuovo ProcessStartinfo che contiene gli argomenti mailto richiesti. Ho creato un metodo chiamato FormatMailToArgument (Right at the end) che converte i caratteri di controllo nei loro equivalenti Url Encodedant e hanno testato questo e funziona ma c’è un modo migliore per farlo?

///  ///  extension methods. ///  public static class Processes { #region MailTo ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// The mail message. public static void MailTo(this Process process, MailMessage mailMessage) { MailTo( process, mailMessage.To.ToDelimetedString(), mailMessage.CC.ToDelimetedString(), mailMessage.Bcc.ToDelimetedString(), mailMessage.Subject, mailMessage.Body); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses. public static void MailTo(this Process process, IEnumerable to) { MailTo( process, to.ToDelimetedString(Character.SemiColon), null, null, null, null); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses. /// The email subject. public static void MailTo(this Process process, IEnumerable to, string subject) { MailTo( process, to.ToDelimetedString(Character.SemiColon), null, null, subject, null); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses. /// The email subject. /// The email body. public static void MailTo( this Process process, IEnumerable to, string subject, string body) { MailTo( process, to.ToDelimetedString(Character.SemiColon), null, null, subject, body); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses. /// The Cc email addresses. /// The email subject. /// The email body. public static void MailTo( this Process process, IEnumerable to, IEnumerable cc, string subject, string body) { MailTo( process, to.ToDelimetedString(Character.SemiColon), cc.ToDelimetedString(Character.SemiColon), null, subject, body); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses. /// The Cc email addresses. /// The Bcc email addresses. /// The email subject. /// The email body. public static void MailTo( this Process process, IEnumerable to, IEnumerable cc, IEnumerable bcc, string subject, string body) { MailTo( process, (to == null) ? null : to.ToDelimetedString(Character.SemiColon), (cc == null) ? null : cc.ToDelimetedString(Character.SemiColon), (bcc == null) ? null : bcc.ToDelimetedString(Character.SemiColon), subject, body); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses. /// The Cc email addresses. /// The Bcc email addresses. /// The email subject. /// The email body. /// The attachment file path. public static void MailTo( this Process process, IEnumerable to, IEnumerable cc, IEnumerable bcc, string subject, string body, string attachmentPath) { MailTo( process, (to == null) ? null : to.ToDelimetedString(Character.SemiColon), (cc == null) ? null : cc.ToDelimetedString(Character.SemiColon), (bcc == null) ? null : bcc.ToDelimetedString(Character.SemiColon), subject, body, attachmentPath); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses delimeted by a semi-colon. /// The Cc email addresses delimeted by a semi-colon. /// The Bcc email addresses delimeted by a semi-colon. /// The email subject. /// The email body. public static void MailTo(this Process process, string to, string cc, string bcc, string subject, string body) { MailTo(process, to, cc, bcc, subject, body, null); } ///  /// Populates the process with mailto . You may leave any /// argument as null if not needed. ///  /// The process. /// To email addresses delimeted by a semi-colon. /// The Cc email addresses delimeted by a semi-colon. /// The Bcc email addresses delimeted by a semi-colon. /// The email subject. /// The email body. /// The attachment file path. Note: this will not work in some /// email applications. public static void MailTo( this Process process, string to, string cc, string bcc, string subject, string body, string attachmentPath) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(Uri.UriSchemeMailto + Character.Colon); stringBuilder.Append(FormatMailToArgument(to)); if (!string.IsNullOrEmpty(cc) || !string.IsNullOrEmpty(bcc) || !string.IsNullOrEmpty(subject) || !string.IsNullOrEmpty(body) || !string.IsNullOrEmpty(attachmentPath)) { stringBuilder.Append(Character.Question); List arguments = new List(); if (!string.IsNullOrEmpty(subject)) { arguments.Add("subject=" + FormatMailToArgument(subject)); } if (!string.IsNullOrEmpty(body)) { arguments.Add("body=" + FormatMailToArgument(body)); } if (!string.IsNullOrEmpty(cc)) { arguments.Add("CC=" + FormatMailToArgument(cc)); } if (!string.IsNullOrEmpty(bcc)) { arguments.Add("BCC=" + FormatMailToArgument(bcc)); } if (!string.IsNullOrEmpty(attachmentPath)) { arguments.Add("attachment=" + FormatMailToArgument(attachmentPath)); } stringBuilder.Append(arguments.ToDelimetedString(Character.Ampersand)); } process.StartInfo = new ProcessStartInfo(stringBuilder.ToString()); } #endregion #region Methods ///  /// Formats the mailto argument. Converts  to their /// hexadecimal representation. ///  /// The argument. /// The formatted argument. private static string FormatMailToArgument(string argument) { return argument. Replace(Character.Percent.ToString(), "%25"). Replace(Character.Ampersand.ToString(), "%26"). Replace(Character.Colon.ToString(), "%3A"). Replace(Character.HorizontalTab.ToString(), "%0D"). Replace(Character.NewLine.ToString(), "%0A"). Replace(Character.Question.ToString(), "%3F"). Replace(Character.Quote.ToString(), "%22"). Replace(Character.Space.ToString(), "%20"); } #endregion } 

Se intendi che esiste un modo più efficiente per sfuggire ai tuoi indirizzi email, allora si può usare la class System.Uri.

 string escapedAddress = Uri.EscapeUriString("mailto:joe blogg's\r\[email protected]"); Console.WriteLine(escapedAddress); 

Produzione:

 mailto:joe%20blogg's%0D%[email protected] 

Noterai nel mio esempio che il carattere di virgoletta singola non viene scappato ma è perché non è richiesto che sia negli indirizzi email.

Per quanto riguarda l’approccio generale che hai usato, non vedo perché dovresti aggiungere un metodo di estensione alla class Process. Per inviare una e-mail e avere tutto l’indirizzo di fuga. allegati, autenticazione del server ecc. presi cura del perché non usare solo le classi System.Net.Mail ?

Come documentato in questo collegamento ufficiale , il metodo EscapeUriString presuppone che il parametro stringToEscape non abbia sequenze di escape in esso.

Questo metodo è perfetto per sfuggire a Uris, ma fai attenzione perché la stringa di destinazione è una linea mailto: che può contenere molti parametri (non solo sobject, corpo, …), ovviamente separati ognuno con alcuni caratteri di escape … come & e ? .

Quindi, nei miei test con le app di Windows Store con testo tratto dal commento @anon, quella stringa non sarà completamente sfuggita utilizzando solo il metodo Uri.EscapeUriString() , poiché contiene la sequenza di escape & .

Avrai bisogno di un ulteriore escape manuale per far passare tutta la stringa come parametro in un mailto: Uri:

 Uri.EscapeUriString(stringToEscape).Replace("&", "%26");