Конвертирование электронного письма в формате RTF в HTML с изображениями и отправление с помощью SmtpClient


If you are looking also for a .Net solution to Create or Modify HTML documents, see our Document .Net.

Полный код

using System;
using System.IO;
using System.Net;
using System.Net.Mail;
using SkiaSharp;
using System.Net.Mime;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            string rtfFile = Path.GetFullPath(@"..\..\..\Images.rtf");

            // 1. Convert RTF to HTML and place all images to list
            SautinSoft.RtfToHtml r = new SautinSoft.RtfToHtml();
            SautinSoft.RtfToHtml.HtmlFixedSaveOptions opt = new SautinSoft.RtfToHtml.HtmlFixedSaveOptions
            {
                EmbedImages = false,
                ImagesDirectoryPath = Path.GetFullPath(@"..\..\..\Images"),
                ImagesDirectorySrcPath = Path.GetFullPath(@"..\..\..\Images")
            };
            string[] imageList = Directory.GetFiles(@"..\..\..\Images");

            // 2. After launching this method we'll get our RTF document in HTML format
            string htmlFile = Path.GetFullPath(@"..\..\..\Result.html");
            r.Convert(rtfFile, htmlFile, opt);

            // 3. Create Smtp client
            string userName = "bobuser";
            string userPassword = "bobpassword";
            string host = "smtp.bobsite.com";
            int port = 587;

            SmtpClient client = new SmtpClient(host, port)
            {
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Credentials = new NetworkCredential(userName, userPassword)
            };

            // 4. Create HTML email
            string from = "bob@bobsite.com";
            string to = "john@johnsite.com";
            string subject = "This is a testing email from Bob to John using SmtpClient";

            MailMessage emailMessage = new MailMessage
            {
                From = new MailAddress(from),
                Body = "Testing email",
                IsBodyHtml = true,
                Subject = subject.Replace("\r\n", "")
            };

            emailMessage.To.Add(to);

            // 5. Attach images to email
            AlternateView altView = AlternateView.CreateAlternateViewFromString(htmlFile, null, "text/html");

            foreach (string imgPath in imageList)
            {
                using (var inputStream = File.OpenRead(imgPath))
                {
                    using (var skBitmap = SKBitmap.Decode(inputStream))
                    {
                        if (skBitmap != null)
                        {
                            var ms = new MemoryStream();
                            using (var skImage = SKImage.FromBitmap(skBitmap))
                            using (var data = skImage.Encode(SKEncodedImageFormat.Png, 100))
                            {
                                data.SaveTo(ms);
                            }

                            ms.Position = 0;

                            var lr = new LinkedResource(ms)
                            {
                                ContentType = new ContentType("image/png"),
                                ContentId = Guid.NewGuid().ToString()
                            };

                            altView.LinkedResources.Add(lr);
                        }
                    }
                }
            }
            emailMessage.AlternateViews.Add(altView);

            // 6. Send the message using email account

            //client.UseDefaultCredentials = false;

            // Some smtp servers doesn't require credentials, therefore
            // you may set: client.UseDefaultCredentials = false;
            // and remove the line: client.Credentials = new NetworkCredential(userName, userPassword);

            // In the real example in case of the correct host, uncomment the line below:
            //client.Send(emailMessage);
            Console.WriteLine("The message has been sent!");
        }
    }
}

Download

Option Infer On

Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Mail
Imports SkiaSharp
Imports System.Net.Mime

Namespace Sample
	Friend Class Program
		Shared Sub Main(ByVal args() As String)
			Dim rtfFile As String = Path.GetFullPath("..\..\..\Images.rtf")

			' 1. Convert RTF to HTML and place all images to list
			Dim r As New SautinSoft.RtfToHtml()
			Dim opt As New SautinSoft.RtfToHtml.HtmlFixedSaveOptions With {
				.EmbedImages = False,
				.ImagesDirectoryPath = Path.GetFullPath("..\..\..\Images"),
				.ImagesDirectorySrcPath = Path.GetFullPath("..\..\..\Images")
			}
			Dim imageList() As String = Directory.GetFiles("..\..\..\Images")

			' 2. After launching this method we'll get our RTF document in HTML format
			Dim htmlFile As String = Path.GetFullPath("..\..\..\Result.html")
			r.Convert(rtfFile, htmlFile, opt)

			' 3. Create Smtp client
			Dim userName As String = "bobuser"
			Dim userPassword As String = "bobpassword"
			Dim host As String = "smtp.bobsite.com"
			Dim port As Integer = 587

			Dim client As New SmtpClient(host, port) With {
				.EnableSsl = True,
				.DeliveryMethod = SmtpDeliveryMethod.Network,
				.Credentials = New NetworkCredential(userName, userPassword)
			}

			' 4. Create HTML email
			Dim from As String = "bob@bobsite.com"
			Dim [to] As String = "john@johnsite.com"
			Dim subject As String = "This is a testing email from Bob to John using SmtpClient"

			Dim emailMessage As New MailMessage With {
				.From = New MailAddress(from),
				.Body = "Testing email",
				.IsBodyHtml = True,
				.Subject = subject.Replace(vbCrLf, "")
			}

			emailMessage.To.Add([to])

			' 5. Attach images to email
			Dim altView As AlternateView = AlternateView.CreateAlternateViewFromString(htmlFile, Nothing, "text/html")

			For Each imgPath As String In imageList
				Using inputStream = File.OpenRead(imgPath)
					Using skBitmap = SKBitmap.Decode(inputStream)
						If skBitmap IsNot Nothing Then
							Dim ms = New MemoryStream()
							Using skImage = SKImage.FromBitmap(skBitmap)
							Using data = skImage.Encode(SKEncodedImageFormat.Png, 100)
								data.SaveTo(ms)
							End Using
							End Using

							ms.Position = 0

							Dim lr = New LinkedResource(ms) With {
								.ContentType = New ContentType("image/png"),
								.ContentId = Guid.NewGuid().ToString()
							}

							altView.LinkedResources.Add(lr)
						End If
					End Using
				End Using
			Next imgPath
			emailMessage.AlternateViews.Add(altView)

			' 6. Send the message using email account

			'client.UseDefaultCredentials = false;

			' Some smtp servers doesn't require credentials, therefore
			' you may set: client.UseDefaultCredentials = false;
			' and remove the line: client.Credentials = new NetworkCredential(userName, userPassword);

			' In the real example in case of the correct host, uncomment the line below:
			'client.Send(emailMessage);
			Console.WriteLine("The message has been sent!")
		End Sub
	End Class
End Namespace

Download


Если вам нужен пример кода или у вас есть вопрос: напишите нам по адресу support@sautinsoft.ru или спросите в онлайн-чате (правый нижний угол этой страницы) или используйте форму ниже:



Вопросы и предложения всегда приветствуются!

Мы разрабатываем компоненты .Net с 2002 года. Мы знаем форматы PDF, DOCX, RTF, HTML, XLSX и Images. Если вам нужна помощь в создании, изменении или преобразовании документов в различных форматах, мы можем вам помочь. Мы напишем для вас любой пример кода абсолютно бесплатно.