2016-03-03 1 views
-2

J'ai ce code qui envoie un email avec pièce jointe [s]:Comment envoyer des courriels Outlook en mode silencieux?

internal static bool EmailGeneratedReport(List<string> recipients) 
{ 
    bool success = true; 
    try 
    { 
     Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); 
     MailItem mailItem = app.CreateItem(OlItemType.olMailItem); 
     Recipients _recipients = mailItem.Recipients; 
     foreach (string recip in recipients) 
     { 
      Recipient outlookRecipient = _recipients.Add(recip); 
      outlookRecipient.Type = (int)OlMailRecipientType.olTo; 
      outlookRecipient.Resolve(); 
     } 
     mailItem.Subject = String.Format("Platypus Reports generated {0}", GetYYYYMMDDHHMM()); 
     List<String> htmlBody = new List<string> 
     { 
      "<html><body><img src=\"http://www.platypus.com/wp-content/themes/duckbill/images/pa_logo_notag.png\" alt=\"Pro*Act logo\" ><p>Your Platypus reports are attached.</p>" 
     }; 
     htmlBody.Add("</body></html>"); 
     mailItem.HTMLBody = string.Join(Environment.NewLine, htmlBody.ToArray()); 

     . . . // un-Outlook-specific code elided for brevity 

     FileInfo[] rptsToEmail = GetLastReportsGenerated(uniqueFolder); 
     foreach (var file in rptsToEmail) 
     { 
      String fullFilename = Path.Combine(uniqueFolder, file.Name); 
      if (!File.Exists(fullFilename)) continue; 
      if (!file.Name.Contains(PROCESSED_FILE_APPENDAGE)) 
      { 
       mailItem.Attachments.Add(fullFilename); 
      } 
      MarkFileAsSent(fullFilename); 
     } 
     mailItem.Importance = OlImportance.olImportanceHigh; 
     mailItem.Display(false); 
    } 
    catch (System.Exception ex) 
    { 
     String exDetail = String.Format(ExceptionFormatString, ex.Message, 
      Environment.NewLine, ex.Source, ex.StackTrace, ex.InnerException); 
     MessageBox.Show(exDetail); 
     success = false; 
    } 
    return success; 
} 

Cependant, il apparaît la fenêtre de courrier électronique lorsque vous êtes prêt, que l'utilisateur doit répondre par envoi ou l'annulation. Comme il s'agit d'une application qui envoie un courrier électronique en fonction d'une minuterie générant des rapports à envoyer, je ne peux pas compter sur un être humain présent pour appuyer sur le bouton "Envoyer".

L'email Outlook peut-il être envoyé "en silence"? Si c'est le cas, comment?

Je peux envoyer des e-mail en silence avec gmail:

private void EmailMessage(string msg) 
{ 
    string FROM_EMAIL = "[email protected]"; 
    string TO_EMAIL = "[email protected]"; 
    string FROM_EMAIL_NAME = "B. Clay Shannon"; 
    string TO_EMAIL_NAME = "Clay Shannon"; 
    string GMAIL_PASSWORD = "theRainNSpainFallsMainlyOnDonQuixotesHelmet"; 

    var fromAddress = new MailAddress(FROM_EMAIL, FROM_EMAIL_NAME); 
    var toAddress = new MailAddress(TO_EMAIL, TO_EMAIL_NAME); 
    string fromPassword = GMAIL_PASSWORD; 
    string subject = string.Format("Log msg from ReportScheduler app sent 
{0}", DateTime.Now.ToLongDateString()); 
    string body = msg; 

    var smtp = new SmtpClient 
    { 
     Host = "smtp.gmail.com", 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
    }; 
    using (var message = new MailMessage(fromAddress, toAddress) 
    { 
     Subject = subject, 
     Body = body 
    }) 
    { 
     smtp.Send(message); 
    } 
} 

... mais quand je fais ça, je dois fournir mon mot de passe gmail, et je ne veux pas vraiment faire ça (mon mot de passe exposer dans le code source). Alors, comment puis-je profiter des avantages de Gmail (silence) et Outlook (garder mon mot de passe privé)?

+1

Compilez le code, cs sera compilé en dll. Le mot de passe est sûr. – Kramb

+1

N'utilisez pas Outlook directement, utilisez SendMail pointant vers le serveur Outlook. –

+0

@JohnPeters: Comment? –

Répondre

4

Si vous voulez que le chemin le plus court:

System.Web.Mail.SmtpMail.SmtpServer="SMTP Host Address"; 
System.Web.Mail.SmtpMail.Send("from","To","Subject","MessageText"); 
+0

Comment ce code fonctionnera avec MailItem dans Outlook. Le serveur SMTP a-t-il besoin d'informations d'identification? Vous ne pourrez donc pas envoyer l'objet serveur smtp si vous ne fournissez pas les informations d'identification. Alors, comment votre code fonctionnerait? –

+0

Cela dépend de la configuration d'Outlook, par défaut, il utilise le protocole IMAP et non SMTP. Cependant, s'il a un support pour SMTP, alors oui, vous devez envoyer des informations d'identification avant d'arriver au point ci-dessus. –

-1

Ce code était que je réutilisez d'un autre projet où je voulais la boîte de dialogue d'envoi pour afficher, et pour l'e-mail uniquement à envoyer quand l'utilisateur a appuyé sur le bouton "Envoyer". Pour cette raison, il n'a pas appelé « envoyer »

Pour obtenir le courrier électronique pour envoyer en silence/sans surveillance, je avais juste besoin d'ajouter un appel à « mailItem.Send() » comme ceci:

mailItem.Importance = OlImportance.olImportanceHigh; 
mailItem.Display(false); 
mailItem.Send(); // This was missing