Wysyłanie maili z aplikacji desktopowej

0

Piszę program który ma wysyłać maile za pomocą aplikacji outlook (desktopowej). Odkryłem 2 przestrzenie nazw do tego:
Microsoft.Office.Interop.Outlook;
oraz
System.Net.Mail;

Microsoft.Office.Interop.Outlook wydaje mi się bardziej przyjazne tym bardziej że nie muszę w kodzie podawać loginu oraz hasła ani maila, wszystko bierze z aplikacji lecz niestety nie umiem tutaj zrobić 2 widoków html i tekstowego ( tekstowy po to, że jeżeli skrzynka odbiorcy nie obsługuje html to pojawia mu sie teskt informujący go o tym fakcie)

        public void sendEMail(string recipient, string title, string body, bool priority)
        {

            Outlook.Application app = new Outlook.Application();
            Outlook.MailItem mail = app.CreateItem(Outlook.OlItemType.olMailItem);
            mail.BodyFormat = Outlook.OlBodyFormat.olFormatHTML;        
           
            mail.HTMLBody = body;            
                       
            mail.Subject = title;
            mail.To = recipient;

            if (priority)
            {
                mail.Importance = Outlook.OlImportance.olImportanceHigh;
            }

            mail.Send();

        }

System.Net.Mail tutaj bez problemu 2 takie widoki umiem zrobić ale, nie podoba mi się tutaj to, że muszę podawać maila z której skrzynki pocztowej będzie to wysyłane ,login oraz hasło.

 using (MailMessage message = new MailMessage())
            {
                message.From = new MailAddress("mailfrom");
                message.To.Add(new MailAddress("mailto"));
                message.Subject = "Test programu";


                AlternateView plainText = AlternateView.CreateAlternateViewFromString("Zawartość nie może zostać wyświetlona.", new ContentType("text/plain; charset=UTF-8"));

                AlternateView htmlText = AlternateView.CreateAlternateViewFromString("kodhtml", new ContentType("text/html"));

                message.AlternateViews.Add(htmlText);
                message.AlternateViews.Add(plainText);

                using (SmtpClient MailClient = new SmtpClient("smtp-mail.outlook.com", 587))
                {

                    MailClient.EnableSsl = true;
                    MailClient.UseDefaultCredentials = true;
                    MailClient.Credentials = new NetworkCredential("login", "hasło");

                        MailClient.Send(message);
                    
                   
                }
            }

I tu pojawia się pytanie czy jest jakiś sposób aby w 1 kodzie dodać tekst alternatywny bądź w 2 przykładzie wyrzucić z kodu logowanie i skorzystać z danych użytkownika który jest zalogowany na desktopowej aplikacji outlook? Za wszelką pomoc będę wdzięczny :)

2

A co jak nie będzie Outlooka na komputerze? I wydaje mi się to takie trochę słabe ze aplikacja wysyła maile "za moimi plecami" wykorzystując outlooka. Ciekawe, że w ogóle tak się da. Dodatkowo to rozwiązanie jest oparte o obiekty COM - jak nie musisz to lepiej nie korzystać - moim zdaniem.
Druga metoda jest tą "po bożemu".
Może jak napiszesz więcej co to za maile i po co one są będzie łatwiej coś doradzić.

0

Tak niezobowiązująco, to mi się wydaje Text jest wprost zawartością maila, a HTML jego attachmentem

Disclaimer: ale to może być wiedza nieco przestarzałą, lub nie dotycząca outlooka.
Zdecydowanie tak było/jest w java mail i w kilku innych api

Przeanalizuj normalny "ręcznie" wysłany email z outlooka, poszerzysz sobie spojrzenie.

1
UglyMan napisał(a):

A co jak nie będzie Outlooka na komputerze? I wydaje mi się to takie trochę słabe ze aplikacja wysyła maile "za moimi plecami" wykorzystując outlooka. Ciekawe, że w ogóle tak się da. Dodatkowo to rozwiązanie jest oparte o obiekty COM - jak nie musisz to lepiej nie korzystać - moim zdaniem.

Druga metoda jest tą "po bożemu".
Może jak napiszesz więcej co to za maile i po co one są będzie łatwiej coś doradzić.

Widziałem takie integracje, które wtykały maile "w gardło" outlookowi, więc pewnie się da. Plusem jest (czy zawsze???) pełna historia wysyłanych maili

A szczerze mówiąc to chętnie bym poznał współczesny sposób na 100% archiwum wysyłanych (czasem konflikt w/s idzie aż do sądu, kiedyś firma wygrała mają pokwitowanie z faksu).
Lokalne proxy SMTP??? Sam nie wiem ...

0

Zależy od serwera pocztowego lub jego konfiguracji. W jednych serwerach, po wysłaniu przez SMTP mail zapisuje się w "Wysłane" lub "Sent", a w drugich nie ma żadnego śladu po wysłaniu.

Dokładnie nie pamiętam, bo to dawno robiłem takie eksperymenty. Serwer WP i Onet nie zapisuje, ale Yahoo zapisuje, jak dobrze pamiętam. A prywatne płatne serwery w firmach hostingowych, to nie wiem, możliwe, że dostawca oferuje możliwość konfiguracji.

0
AnyKtokolwiek napisał(a):

Tak niezobowiązująco, to mi się wydaje Text jest wprost zawartością maila, a HTML jego attachmentem

Disclaimer: ale to może być wiedza nieco przestarzałą, lub nie dotycząca outlooka.
Zdecydowanie tak było/jest w java mail i w kilku innych api

Przeanalizuj normalny "ręcznie" wysłany email z outlooka, poszerzysz sobie spojrzenie.

Abstrahując od budowy samego maila, większość bibliotek do wysyłania i odbierania ma możliwość podania wprost tekstu jako HTML i jako zwykłego. Tak na przykład jest z MailKit i MimeKit dla .NET. Przy wysyłaniu nie dodaje się specjalnego załącznika, tylko podaje się do któregoś pola tekst HTML. Jedynie przy odbiorze, MimeKit widzi listę elementów maila i na tej liście są poszczególne załączniki, ale też zarówno zwykły tekst, jak i tekst HTML, o ile taki występuje.

0

Powiem Wam tak, rzeczywiście Microsoft.Office.Interop.Outlook to był słaby pomysł ze względu na bezpieczeństwo i wszystko. Napisałem program w System.Net.Mail. I mam mały problem, bo można powiedzieć, że wszystko działa lecz jak wysyłam spotkanie to nie zapisuje się ono u nadawcy a jedynie u odbiorcy, i niestety nie mam pojęcia jak zrobić aby jednak u nadawcy też to się zapisywało.

 using (MailMessage message = new MailMessage())
            {
                message.From = new MailAddress(ConfigurationManager.AppSettings.Get("mail"));
                message.To.Add(new MailAddress(mailto));
                message.Subject = subject;
                message.BodyEncoding = Encoding.UTF8;
                if (attachment is not null)
                {
                    System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(attachment, MediaTypeNames.Application.Octet);

                    ContentDisposition disposition = data.ContentDisposition;
                    disposition.CreationDate = System.IO.File.GetCreationTime(attachment);
                    disposition.ModificationDate = System.IO.File.GetLastWriteTime(attachment);
                    disposition.ReadDate = System.IO.File.GetLastAccessTime(attachment);

                    message.Attachments.Add(data);
                }
                if (start is not null)
                {
                    StringBuilder str = new StringBuilder();
                    str.AppendLine("BEGIN:VCALENDAR");
                    str.AppendLine("METHOD:REQUEST");
                    str.AppendLine("BEGIN:VEVENT");
                    str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", DateTime.Parse("18.08.2021 15:00")));
                    str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
                    str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", DateTime.Parse("18.08.2021 15:30")));
                    str.AppendLine("LOCATION: sampleLocation");
                    str.AppendLine(string.Format("UID:{0}", Guid.NewGuid()));
                    str.AppendLine(string.Format("DESCRIPTION:{0}", description));
                    str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", description));
                    str.AppendLine(string.Format("SUMMARY:{0}", meetingSubject));
                    str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", ConfigurationManager.AppSettings.Get("mail")));

                    str.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", message.To[0].DisplayName, message.To[0].Address));

                    str.AppendLine("BEGIN:VALARM");
                    str.AppendLine("TRIGGER:-PT15M");
                    str.AppendLine("ACTION:DISPLAY");
                    str.AppendLine("DESCRIPTION:Reminder");
                    str.AppendLine("END:VALARM");
                    str.AppendLine("END:VEVENT");
                    str.AppendLine("END:VCALENDAR");
                    ContentType contype = new ContentType("text/calendar");
                    contype.Parameters.Add("method", "REQUEST");

                    contype.Parameters.Add("name", "Meeting.ics");
                    
                    avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), contype);

                }
                

                AlternateView plainText = AlternateView.CreateAlternateViewFromString("Widok html nie jest obsługiwany", new ContentType("text/plain; charset=UTF-8"));

                AlternateView htmlText = AlternateView.CreateAlternateViewFromString(htmlbody, new ContentType("text/html"));

                message.AlternateViews.Add(htmlText);
                message.AlternateViews.Add(avCal);
                // message.AlternateViews.Add(plainText);


                using (SmtpClient MailClient = new SmtpClient("smtp-mail.outlook.com", 587))
                {

                    MailClient.EnableSsl = true;
                    MailClient.UseDefaultCredentials = false;
                    MailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                    MailClient.Credentials = new NetworkCredential(ConfigurationManager.AppSettings.Get("mail"), ConfigurationManager.AppSettings.Get("password"));
                    try
                    {
                        MailClient.Send(message);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }

                }
            }

1 użytkowników online, w tym zalogowanych: 0, gości: 1