Использовать SMTP-клиент для отправки писем, пересылки сообщений и выполнения слияния почты в C#

Contents
[ ]

Отправка писем

Отправка писем с классом SmtpClient

Этот SmtpClient класс позволяет приложениям отправлять письма через Simple Mail Transfer Protocol (SMTP).

Одной из ключевых возможностей является способность отправку сообщений массово.

Он также полностью поддерживает синхронных и асинхронных модели программирования. Чтобы передать письмо, блокируя основной поток до завершения операции, разработчики могут использовать один из синхронных Отправить методы. Альтернативно, чтобы основной поток продолжал работать, пока письмо отправляется, разработчики могут использовать SendAsync метод.

Кроме того, SmtpClient поддерживает отправку сообщений в Transport Neutral Encapsulation Format (TNEF).

Отправка писем синхронно

Сообщение электронной почты можно отправить синхронно с помощью Отправить метод SmtpClient класс. Он отправляет указанное электронное письмо через SMTP‑сервер для доставки. Чтобы отправить письмо синхронно, выполните следующие шаги:

  1. Создайте экземпляр MailMessage класс и задайте его свойства.
  2. Создайте экземпляр SmtpClient класс и укажите хост, порт, имя пользователя и пароль.
  3. Отправьте сообщение с помощью Отправить метод SmtpClient класс и передайте MailMessage экземпляр.

Ниже показан фрагмент кода C#, демонстрирующий, как синхронно отправлять письма Outlook.

// Declare msg as MailMessage instance
MailMessage msg = new MailMessage();

// Create an instance of SmtpClient class
SmtpClient client = new SmtpClient();

// Specify your mailing host server, Username, Password, Port # and Security option
client.Host = "mail.server.com";
client.Username = "username";
client.Password = "password";
client.Port = 587;
client.SecurityOptions = SecurityOptions.SSLExplicit;

try
{
    // Client.Send will send this message
    client.Send(msg);
    Console.WriteLine("Message sent");
}
catch (Exception ex)
{
    Trace.WriteLine(ex.ToString());
}

Отправка писем асинхронно

Иногда вы можете захотеть отправлять письма асинхронно, чтобы программа могла продолжать выполнять другие операции, пока письмо отправляется в фоне. Начиная с .NET Framework 4.5, вы можете использовать асинхронные методы, реализованные в соответствии с TAP модель. Ниже приведён фрагмент кода C#, показывающий, как отправлять сообщения Outlook, используя методы асинхронного паттерна на основе задач:

  • SendAsync Отправляет указанные сообщения.

  • IAsyncSmtpClient - Позволяет приложениям отправлять сообщения, используя протокол SMTP (Simple Mail Transfer Protocol).

  • SmtpClient.CreateAsync - Создаёт новый экземпляр класса Aspose.Email.Clients.Smtp.SmtpClient

  • SmtpSend - Набор параметров метода Aspose.Email.Clients.Smtp.IAsyncSmtpClient.SendAsync(Aspose.Email.Clients.Smtp.Models.SmtpSend).

  • SmtpForward - Аргументы Aspose.Email.Clients.Smtp.IAsyncSmtpClient.ForwardAsync(Aspose.Email.Clients.Smtp.Models.SmtpForward).

// Authenticate the client to obtain necessary permissions
static readonly string tenantId = "YOU_TENANT_ID";
static readonly string clientId = "YOU_CLIENT_ID";
static readonly string redirectUri = "http://localhost";
static readonly string username = "username";
static readonly string[] scopes = { "https://outlook.office.com/SMTP.Send" };

// Use the SmtpAsync method for asynchronous operations
static async Task Main(string[] args)
{
    await SmtpAsync();
    Console.ReadLine();
}

static async Task SmtpAsync()
{
    // Create token provider and get access token
    var tokenProvider = new TokenProvider(clientId, tenantId, redirectUri, scopes);
    var client = SmtpClient.CreateAsync("outlook.office365.com", username, tokenProvider, 587).GetAwaiter().GetResult();

    // Create a message to send
    var eml = new MailMessage("from@domain.com", "to@domain.com", "test subj async", "test body async");
    
    // send message
    var sendOptions = SmtpSend.Create();
    sendOptions.AddMessage(eml);
    await client.SendAsync(sendOptions);
    Console.WriteLine("message was sent");

    // forward message
    var fwdOptions = SmtpForward.Create();
    fwdOptions.SetMessage(eml);
    fwdOptions.AddRecipient("rec@domain.com");
    await client.ForwardAsync(fwdOptions);
    Console.WriteLine("message was forwarded");
}

// Token provider implementation
public class TokenProvider : IAsyncTokenProvider
{
    private readonly PublicClientApplicationOptions _pcaOptions;
    private readonly string[] _scopes;

    public TokenProvider(string clientId, string tenantId, string redirectUri, string[] scopes)
    {
        _pcaOptions = new PublicClientApplicationOptions
        {
            ClientId = clientId,
            TenantId = tenantId,
            RedirectUri = redirectUri
        };

        _scopes = scopes;
    }

    public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false, CancellationToken cancellationToken = default)
    {

        var pca = PublicClientApplicationBuilder
            .CreateWithApplicationOptions(_pcaOptions).Build();

        try
        {
            var result = await pca.AcquireTokenInteractive(_scopes)
                .WithUseEmbeddedWebView(false)
                .ExecuteAsync(cancellationToken);

            return new OAuthToken(result.AccessToken);
        }
        catch (MsalException ex)
        {
            Console.WriteLine($"Error acquiring access token: {ex}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex}");
        }

        return null;
    }

    public void Dispose()
    {

    }
}

Отправка сообщений с диска

Файлы EML содержат заголовок, тело сообщения и вложения. Aspose.Email позволяет разработчикам работать с файлами EML разными способами. В этом разделе показано, как загрузить файлы EML с диска и отправить их как письма через SMTP. Вы можете загрузить .eml файлы с диска или потока в MailMessage класс и отправьте сообщение, используя SmtpClient класс. The MailMessage класс является основным классом для создания новых сообщений электронной почты, загрузки файлов сообщений с диска или потока и их сохранения. Ниже показан фрагмент кода C#, демонстрирующий, как отправить сохранённые сообщения с диска.

// Load an EML file in MailMessage class
var message = MailMessage.Load(dataDir + "test.eml");

// Send this message using SmtpClient
var client = new SmtpClient("host", "username", "password");
            
try
{
    client.Send(message);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}            

Отправка писем в простом тексте

Этот Тело свойство, свойство MailMessage класс, используется для указания текстового содержания тела сообщения. Чтобы отправить простое текстовое письмо, выполните следующие шаги:

  • Создать экземпляр MailMessage класс.
  • Укажите адреса отправителя и получателя в MailMessage экземпляр.
  • Укажите Тело содержание, используемое для текстового сообщения.
  • Создать экземпляр SmtpClient класс и отправьте письмо.

Следующий фрагмент кода показывает, как отправить простое текстовое письмо.

//Create an instance of the MailMessage class
var message = new MailMessage();

// Set From field, To field and Plain text body
message.From = "sender@sender.com";
message.To.Add("receiver@receiver.com");
message.Body = "This is Plain Text Body";

// Create an instance of the SmtpClient class
var client = new SmtpClient();

// And Specify your mailing host server, Username, Password and Port
client.Host = "smtp.server.com";
client.Username = "Username";
client.Password = "Password";
client.Port = 25;

try
{
    //Client.Send will send this message
    client.Send(message);
    Console.WriteLine("Message sent");
}
catch (Exception ex)
{
    System.Diagnostics.Trace.WriteLine(ex.ToString());
}

Отправка писем с HTML‑телом

Ниже приведённые примеры программ показывают, как можно отправить простое HTML‑сообщение. HtmlBody, свойство MailMessage класс, используется для указания HTML‑содержимого тела сообщения. Чтобы отправить простое HTML‑письмо, выполните следующие шаги:

  • Создать экземпляр MailMessage класс.
  • Укажите адреса отправителя и получателя в MailMessage экземпляр.
  • Укажите HtmlBody содержание.
  • Создать экземпляр SmtpClient класс и отправьте письмо, используя Отправить метод.

Для целей этой статьи HTML‑содержание письма простое: This is the HTML body Большинство HTML‑писем будет более сложным. Ниже показан фрагмент кода, показывающий, как отправить письмо с HTML‑текстом.

public static void Run()
{
    // Declare msg as MailMessage instance
    var msg = new MailMessage();

    // Use MailMessage properties like specify sender, recipient, message and HtmlBody
    msg.From = "newcustomeronnet@gmail.com";
    msg.To = "asposetest123@gmail.com";
    msg.Subject = "Test subject";
    msg.HtmlBody = "<html><body>This is the HTML body</body></html>";

    var client = GetSmtpClient();

    try
    {
        // Client will send this message
        client.Send(msg);
        Console.WriteLine("Message sent");
    }
    catch (Exception ex)
    {
        Trace.WriteLine(ex.ToString());
    }

    Console.WriteLine(Environment.NewLine + "Email sent with HTML body.");
}

private static SmtpClient GetSmtpClient()
{
    var client = new SmtpClient("smtp.gmail.com", 587, "your.email@gmail.com", "your.password");
    client.SecurityOptions = SecurityOptions.Auto;
    return client;
}

Отправка HTML‑писем с альтернативным текстом

Используйте AlternateView класс для указания копий сообщения электронной почты в разных форматах. Например, если вы отправляете сообщение в формате HTML, вы также можете предоставить текстовую версию для получателей, использующих почтовые клиенты, не поддерживающие HTML. Или, если вы рассылаете новостную рассылку, вы можете предоставить текстовую копию для получателей, выбравших текстовый вариант. Чтобы отправить письмо с альтернативным текстом, выполните следующие шаги:

  1. Создать экземпляр MailMessage класс.
  2. Укажите адреса отправителя и получателя в MailMessage экземпляр.
  3. Создать экземпляр AlternateView класс.

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

  1. Добавьте экземпляр AlternateView класс к MailMessage объекта.
  2. Создать экземпляр SmtpClient класс и отправьте письмо, используя Отправить метод.

Следующий фрагмент кода показывает, как отправить письмо с альтернативным текстом.

// Declare message as MailMessage instance
var message = new MailMessage();

// Creates AlternateView to view an email message using the content specified in the //string
var alternate = AlternateView.CreateAlternateViewFromString("Alternate Text");
            
// Adding alternate text
message.AlternateViews.Add(alternate);

Отправка массовых писем

Мы можем отправить пакет писем, используя SmtpClient класс Отправить перегрузка метода, принимающая MailMessageCollection:

  1. Создайте экземпляр SmtpClient класс.
  2. Укажите SmtpClient свойств класса.
  3. Создать экземпляр MailMessage класс.
  4. Укажите отправителя, получателя, тему письма и сообщение в экземпляре MailMessage класс.
  5. Повторите вышеуказанные два шага, если хотите отправить письмо другому получателю.
  6. Создайте экземпляр MailMessageCollection класс.
  7. Добавьте экземпляр MailMessage класс в объекте MailMessageCollection класс.
  8. Теперь отправьте ваше письмо, используя SmtpClient класс Отправить метод, передавая экземпляр MailMessageCollection класс в нём.

Следующий фрагмент кода показывает, как отправить массовую рассылку писем.

// Create SmtpClient as client and specify server, port, user name and password
var client = new SmtpClient("mail.server.com", 25, "Username", "Password");

// Create instances of MailMessage class and Specify To, From, Subject and Message
var message1 = new MailMessage("msg1@from.com", "msg1@to.com", "Subject1", "message1, how are you?");
var message2 = new MailMessage("msg1@from.com", "msg2@to.com", "Subject2", "message2, how are you?");
var message3 = new MailMessage("msg1@from.com", "msg3@to.com", "Subject3", "message3, how are you?");

// Create an instance of MailMessageCollection class
var manyMsg = new MailMessageCollection();
manyMsg.Add(message1);
manyMsg.Add(message2);
manyMsg.Add(message3);

try
{
    // Send Messages using Send method
    client.Send(manyMsg);                
    Console.WriteLine("Message sent");
}
catch (Exception ex)
{
    Trace.WriteLine(ex.ToString());
}

Отслеживание успеха массовой рассылки

При массовой рассылке вы можете получить информацию о числе успешно отправленных сообщений и даже получить их список. The SucceededSending событие предназначено для этой цели.

Пример кода:

using (var client = new SmtpClient(host, SecurityOptions.Auto))
{
    int messageCount = 0;

    client.SucceededSending += (sender, eventArgs) =>
    {
        Console.WriteLine("The message '{0}' was successfully sent.", eventArgs.Message.Subject);
        messageCount++;
    };

    client.Send(messages);

    Console.WriteLine("{0} messages were successfully sent.", messageCount);
}

Отправка писем с MultiConnection

Этот UseMultiConnection свойство можно использовать для создания нескольких соединений при тяжёлых операциях. Вы также можете задать количество соединений, используемых в режиме многосоединения, используя SmtpClient.ConnectionsQuantity. Следующий фрагмент кода демонстрирует использование режима мультисоединения для отправки нескольких сообщений.

var smtpClient = new SmtpClient();
smtpClient.Host = "<HOST>";
smtpClient.Username = "<USERNAME>";
smtpClient.Password = "<PASSWORD>";
smtpClient.Port = 587;
smtpClient.SupportedEncryption = EncryptionProtocols.Tls;
smtpClient.SecurityOptions = SecurityOptions.SSLExplicit;

var messages = new List<MailMessage>();
for (int i = 0; i < 20; i++)
{
    MailMessage message = new MailMessage(
        "<EMAIL ADDRESS>",
        "<EMAIL ADDRESS>",
        "Test Message - " + Guid.NewGuid().ToString(),
        "SMTP Send Messages with MultiConnection");
    messages.Add(message);
}

smtpClient.ConnectionsQuantity = 5;
smtpClient.UseMultiConnection = MultiConnectionMode.Enable;
smtpClient.Send(messages);

Отправка сообщений в формате TNEF

Письма TNEF имеют особое форматирование, которое может быть утеряно при отправке через стандартный API. The SmtpClient класс UseTnef свойство можно установить, чтобы отправлять письмо в формате TNEF. Следующий фрагмент кода показывает, как отправить сообщение в формате TNEF.

var emlFileName = RunExamples.GetDataDir_Email() + "Message.eml";     // A TNEF Email

// Load from eml
var eml1 = MailMessage.Load(emlFileName, new EmlLoadOptions());
eml1.From = "somename@gmail.com";
eml1.To.Clear();
eml1.To.Add(new MailAddress("first.last@test.com"));
eml1.Subject = "With PreserveTnef flag during loading";
eml1.Date = DateTime.Now;

var client = new SmtpClient("smtp.gmail.com", 587, "somename", "password");
client.SecurityOptions = SecurityOptions.Auto;
client.UseTnef = true;     // Use this flag to send as TNEF
client.Send(eml1);

Отправка запросов на встречи

Aspose.Email позволяет разработчикам добавлять функции календаря в ваши письма.

Отправка запросов по электронной почте

Чтобы отправить запросы встреч по электронной почте, выполните следующие шаги:

  • Создать экземпляр MailMessage класс.
  • Укажите адреса отправителя и получателя, используя экземпляр MailMessage класс.
  • Инициализируйте экземпляр Appointment класс и передайте его значения.
  • Укажите краткое описание и описание в Calendar экземпляр.
  • Добавьте Calendar к MailMessage экземпляр и передайте ему Appointment экземпляр.

|Запрос встречи iCalendar, отправленный по электронной почте| | :- | |todo:image_alt_text| Следующий фрагмент кода показывает, как отправлять запросы по электронной почте.


// Create an instance of the MailMessage class
var msg = new MailMessage();

// Set the sender, recipient, who will receive the meeting request. Basically, the recipient is the same as the meeting attendees
msg.From = "newcustomeronnet@gmail.com";
msg.To = "person1@domain.com, person2@domain.com, person3@domain.com, asposetest123@gmail.com";

// Create Appointment instance
var app = new Appointment("Room 112", new DateTime(2015, 7, 17, 13, 0, 0), new DateTime(2015, 7, 17, 14, 0, 0), msg.From, msg.To);
app.Summary = "Release Meetting";
app.Description = "Discuss for the next release";

// Add appointment to the message and Create an instance of SmtpClient class
msg.AddAlternateView(app.RequestApointment());
var client = GetSmtpClient();

try
{
    // Client.Send will send this message
    client.Send(msg);
    Console.WriteLine("Message sent");
}
catch (Exception ex)
{
    Trace.WriteLine(ex.ToString());
}

Переслать сообщения

Переслать сообщения с помощью SMTP‑клиента

Пересылка письма — обычная практика. Полученное письмо может быть переслано определённым получателям. The Переслать метод может использоваться для пересылки полученного или сохранённого письма нужным получателям. Ниже показан фрагмент кода, демонстрирующий, как переслать письмо с помощью SMTP‑клиента.

//Create an instance of SmtpClient class
var client = new SmtpClient();

// Specify your mailing host server, Username, Password, Port and SecurityOptions
client.Host = "mail.server.com";
client.Username = "username";
client.Password = "password";
client.Port = 587;
client.SecurityOptions = SecurityOptions.SSLExplicit;
var message = MailMessage.Load(dataDir + "Message.eml");
client.Forward("Recipient1@domain.com", "Recipient2@domain.com", message);

Переслать сообщения без MailMessage

API также поддерживает пересылку сообщений EML без предварительной загрузки в MailMessage. Это полезно в случаях, когда ресурсы системы ограничены, например, память.


using (var client = new SmtpClient(host, smtpPort, username, password, SecurityOptions.Auto))
{
    using (var fs = File.OpenRead(@"test.eml"))
    {
        client.Forward(sender, recipients, fs);
    }
}

Переслать сообщения асинхронно без MailMessage

using (var client = new SmtpClient(host, smtpPort, username, password))
{
    using (var fs = File.OpenRead(@"test.eml"))
    {
        await client.ForwardAsync(sender, recipients, fs);
    }
}

Слияние почты

Как объединять письма

Слияние писем помогает создавать и отправлять партию схожих электронных сообщений. Основное содержание писем одинаково, но контент может быть персонализирован. Обычно данные получателя (имя, фамилия, компания и т.п.) используются для персонализации письма.

|Иллюстрация того, как работает слияние почты:| | :- | |todo:image_alt_text| Aspose.Email позволяет разработчикам настраивать слияния почты, включающие данные из различных источников данных.

Чтобы выполнить слияние писем с Aspose.Email, выполните следующие шаги:

  1. Создайте функцию с сигнатурой имени
  2. Создать экземпляр MailMessage класс.
  3. Укажите отправителя, получателя, тему и тело сообщения.
  4. Создайте подпись для конца письма.
  5. Создать экземпляр TemplateEngine классе и передайте её MailMessage экземпляр.
  6. Возьмите подпись в TemplateEngine экземпляр.
  7. Создайте экземпляр класса DataTable.
  8. Добавьте столбцы Receipt, FirstName и LastName в качестве источников данных в класс DataTable.
  9. Создайте экземпляр класса DataRow.
  10. Укажите адрес получателя, имя и фамилию в объекте DataRow.
  11. Создать экземпляр MailMessageCollection класс
  12. Укажите TemplateEngine  и экземпляры DataTable в MailMessageCollection экземпляр.
  13. Создать экземпляр SmtpClient класс и укажите сервер, порт, имя пользователя и пароль.
  14. Отправляйте письма, используя SmtpClient класс Отправить метод.

В примере ниже #FirstName# обозначает столбец DataTable, значение которого задаётся пользователем. Ниже показан фрагмент кода, демонстрирующий, как выполнить слияние почты.

public static void Run()
{
    // The path to the File directory.
    string dataDir = RunExamples.GetDataDir_SMTP();
    string dstEmail = dataDir + "EmbeddedImage.msg";

    // Create a new MailMessage instance
    MailMessage msg = new MailMessage();

    // Add subject and from address
    msg.Subject = "Hello, #FirstName#";
    msg.From = "sender@sender.com";

    // Add email address to send email also Add mesage field to HTML body
    msg.To.Add("your.email@gmail.com");
    msg.HtmlBody = "Your message here";
    msg.HtmlBody += "Thank you for your interest in <STRONG>Aspose.Email</STRONG>.";

    // Use GetSignment as the template routine, which will provide the same signature
    msg.HtmlBody += "<br><br>Have fun with it.<br><br>#GetSignature()#";

    // Create a new TemplateEngine with the MSG message,  Register GetSignature routine. It will be used in MSG.
    TemplateEngine engine = new TemplateEngine(msg);
    engine.RegisterRoutine("GetSignature", GetSignature);

    // Create an instance of DataTable and Fill a DataTable as data source
    DataTable dt = new DataTable();
    dt.Columns.Add("Receipt", typeof(string));
    dt.Columns.Add("FirstName", typeof(string));
    dt.Columns.Add("LastName", typeof(string));

    DataRow dr = dt.NewRow();
    dr["Receipt"] = "abc<asposetest123@gmail.com>";
    dr["FirstName"] = "a";
    dr["LastName"] = "bc";
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["Receipt"] = "John<email.2@gmail.com>";
    dr["FirstName"] = "John";
    dr["LastName"] = "Doe";
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["Receipt"] = "Third Recipient<email.3@gmail.com>";
    dr["FirstName"] = "Third";
    dr["LastName"] = "Recipient";
    dt.Rows.Add(dr);

    MailMessageCollection messages;
    try
    {
        // Create messages from the message and datasource.
        messages = engine.Instantiate(dt);

        // Create an instance of SmtpClient and specify server, port, username and password
        SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "your.email@gmail.com", "your.password");
        client.SecurityOptions = SecurityOptions.Auto;

        // Send messages in bulk
        client.Send(messages);
    }
    catch (MailException ex)
    {
        Debug.WriteLine(ex.ToString());
    }

    catch (SmtpException ex)
    {
        Debug.WriteLine(ex.ToString());
    }

    Console.WriteLine(Environment.NewLine + "Message sent after performing mail merge.");
}

// Template routine to provide signature
static object GetSignature(object[] args)
{
    return "Aspose.Email Team<br>Aspose Ltd.<br>" + DateTime.Now.ToShortDateString();
}

Как выполнить построчное слияние почты

Пользователь может объединять отдельные строки данных, а также получить полностью подготовленный MailMessage объект. The TemplateEngine.Merge метод можно использовать для выполнения пошагового слияния почты.

// Create message from the data in current row.
message = engine.Merge(currentRow);

Отправка почты с использованием DNS

Иногда отправка писем через настроенный SMTP‑сервер невозможна из‑за требований проекта. В таких случаях можно доставить сообщение напрямую серверам получателя, выполнив поиск MX‑записей домена получателя.

Aspose.Email предоставляет DnsClient класс для разрешения MX‑записей. Для каждого получателя код ниже определяет серверы обмена почтой их домена и пытается отправить сообщение одному из них, используя SmtpClient сконфигурирован без аутентификации (порт 25). Следующий фрагмент кода показывает, как отправлять письма, используя почтовые серверы домена получателя.

static void Main(string[] args)
{
    try
    {
        MailMessage msg = new MailMessage("add1@domain.com", "add1@domain.com", "test", "this is a test");
        msg.CC.Add(new MailAddress("add2@domain.com", "CC Display Name"));
        DnsSendMessage(msg);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

private static void DnsSendMessage(MailMessage msg)
{
    // Get all the recipients in To, CC and Bcc in one collection
    MailAddressCollection addresses = new MailAddressCollection();
    foreach (MailAddress to in msg.To)
    {
        addresses.Add(to);
    }

    foreach (MailAddress cc in msg.CC)
    {
        addresses.Add(cc);
    }

    foreach (MailAddress bcc in msg.Bcc)
    {
        addresses.Add(bcc);
    }

    // Send mail using DNS to each address
    foreach (MailAddress addr in addresses)
    {
        // Find mail exchange servers with the help of DnsClient
        DnsClient dnsClient = new DnsClient();
        Question mxQuestion = new Question(addr.Host, QueryType.MX);
        if (dnsClient.Resolve(mxQuestion))
        {
            // Try to send a message
            foreach (ResourceRecord record in dnsClient.ReceivedMessage.Answers)
            {
                MXResourceRecord cnRecord = record as MXResourceRecord;
                if (cnRecord != null)
                {
                    try
                    {
                        // Send message
                        SmtpClient client = new SmtpClient();
                        client.AuthenticationMethod = SmtpAuthentication.None;
                        client.Host = cnRecord.ExchangeName;
                        client.Port = 25;
                        client.Send(msg);
                        Console.WriteLine("Mail sent to " + addr.Address);
                    }
                    catch (SmtpException e)
                    {
                        Console.WriteLine(cnRecord.ExchangeName + ": " + e.Message + Environment.NewLine);
                        continue;
                    }
                }
            }
        }
    }
}

Получать уведомления о доставке для отправленных и неудачных сообщений

Чтобы получать уведомления о доставке как для успешно отправленных, так и для неудавшихся сообщений, используйте конвейер (|) оператор для объединения значений DeliveryNotificationOptions перечисление и присвоить их DeliveryNotificationOptions свойство MailMessage класс. Следующий фрагмент кода показывает, как получать уведомления как об успешно отправленных, так и о неудавшихся сообщениях.

// Create the message
MailMessage msg = new MailMessage();
msg.From = "sender@sender.com";
msg.To = "receiver@receiver.com";
msg.Subject = "the subject of the message";

// Set delivery notifications for success and failed messages and add the MIME headers
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.OnFailure;
msg.Headers.Add("Read-Receipt-To", "sender@sender.com");
msg.Headers.Add("Disposition-Notification-To", "sender@sender.com");

// Send the message
SmtpClient client = new SmtpClient("host", "username", "password");
client.Send(msg);

Использовать офисный документ в качестве тела сообщения

Aspose.Email работает с сетевыми протоколами и функциями Microsoft Outlook и не может самостоятельно отрисовывать документы Word или книги Excel. Однако, комбинируя Aspose.Email с другими продуктами Aspose, вы можете преобразовать офисный документ в HTML или MHTML и использовать результат в качестве тела письма.

Использовать документ Microsoft Word в качестве тела сообщения

Этот пример использует Aspose.Words для .NET для загрузки документа Word и преобразования его в формат MHTML. Aspose.Email затем загружает MHTML в MailMessage объект, который используется как тело письма и отправляется через SMTP. HTML‑форматирование и изображения сохраняются так же, как в исходном документе при просмотре в Outlook или веб‑клиенте почты.

  1. Загрузить документ Microsoft Word с помощью Aspose.Words Document класс.
  2. Сохранить его в поток в формате MHTML.
  3. Загрузить поток MHTML в MailMessage объект с использованием MhtmlLoadOptions.
  4. Установить остальные свойства сообщения.
  5. Отправить письмо, используя SmtpClient класс.
// Load a Word document from disk and save it to stream as MHTML
Document wordDocument = new Document(folderPath + "invoice.docx");
MemoryStream mhtmlStream = new MemoryStream();
wordDocument.Save(mhtmlStream, SaveFormat.Mhtml);

// Load the MHTML in a MailMessage object
mhtmlStream.Position = 0;
using (MailMessage message = MailMessage.Load(mhtmlStream, new MhtmlLoadOptions()))
{
    message.Subject = "Sending Invoice by Email";
    message.From = "sender@gmail.com";
    message.To = "recipient@gmail.com";

    // Save the message in MSG format to disk
    message.Save(folderPath + "WordDocAsEmailBody_out.msg", SaveOptions.DefaultMsgUnicode);

    // Send the email message
    using (SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "sender@gmail.com", "password"))
    {
        client.SecurityOptions = SecurityOptions.SSLExplicit;
        client.Send(message);
    }
}

Использовать лист Microsoft Excel в качестве тела сообщения

Этот пример использует Aspose.Cells для .NET для загрузки книги Excel и преобразования её в поток HTML. Aspose.Email затем использует HTML как тело MailMessage и отправить её через SMTP.

  1. Загрузить книгу Microsoft Excel с помощью Aspose.Cells Workbook класс.
  2. Сохранить загруженную книгу в MemoryStream в HTML‑формате.
  3. Прочитать HTML из потока как строку.
  4. Создать новый MailMessage объекта и установить его HtmlBody в HTML‑контент.
  5. Отправить письмо, используя SmtpClient класс.
// Load the desired workbook from disk
Workbook workbook = new Workbook(dataDir + "Data.xlsx");

// Save the workbook to a memory stream in HTML format
MemoryStream ms = new MemoryStream();
workbook.Save(ms, SaveFormat.Html);
ms.Position = 0;

// Define a StreamReader object with the above MemoryStream
StreamReader sr = new StreamReader(ms);

// Load the saved HTML from StreamReader into a string variable
string strHtmlBody = sr.ReadToEnd();

// Define a new MailMessage object and set its HtmlBody
MailMessage message = new MailMessage();
message.HtmlBody = strHtmlBody;
message.Subject = "Inline Excel Message";
message.From = "sender@abc.com";
message.To = "receiver@xyz.com";
message.IsBodyHtml = true;

SmtpClient client = new SmtpClient();
client.Host = "smtp.gmail.com";
client.Username = "Username";
client.Password = "Password";
client.Port = 587;
client.SecurityOptions = SecurityOptions.Auto;
client.Send(message);