More .NET libraries
-
Rebex Mail Pack
IMAP, MS Graph, EWS, POP3, SMTP, MIME, S/MIME, MSG
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
Sending e-mails
On this page:
- Sending with a single line of code
- Sending a mail message
- Sending from stream
- Sending multiple messages in a single session
- Sending e-mail directly to recipient's SMTP server
- Sending e-mail using IIS mail pickup directory
- Sending e-mail on behalf of another user
- Instructing the receiver to send replies to another address
- Setting and getting a client domain
- Delivery status notifications (DSN)
- Sending replies
- Forwarding messages
Sending with a single line of code
The easiest way to send an e-mail message is this:
// send mail Rebex.Net.Smtp.Send("from@example.org", "to@example.org", "Subject", "Body", "smtp.example.org");
' send mail Rebex.Net.Smtp.Send("from@example.org", "to@example.org", "Subject", "Body", "smtp.example.org")
If you need to send a more complex message than this, or if your server requires authentication, it's simple as well.
Just construct an instance of Rebex.Mail.MailMessage
(see MIME and MailMessage),
and configure the SMTP server and its credentials in your application's configuration file.
// send mail, use SMTP configuration from Application config file Rebex.Net.Smtp.Send(mail, SmtpConfiguration.Default);
' send mail, use SMTP configuration from Application config file Rebex.Net.Smtp.Send(mail, SmtpConfiguration.Default)
Your application's configuration file (Web.config
in case of ASP.NET web apps) might look like this:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.net> <mailSettings> <smtp deliveryMethod="Network"> <network host="smtp.example.org" enableSsl="true" userName="username" password="password" /> </smtp> </mailSettings> </system.net> </configuration>
Sending a mail message
If you need more control about your SMTP session, or if simply you prefer your code
to consist of multiple steps to ease debugging, create an instance of Smtp
object first,
then connect and authenticate before sending the message:
// create SMTP client, connect, log in // ... // create new mail message var mail = new Rebex.Mail.MailMessage(); mail.From = "joe@example.org"; mail.To = "john@example.org"; mail.Subject = "Test"; mail.BodyText = "Hello World!"; mail.BodyHtml = "<strong>Hello World!</strong>"; // send mail smtp.Send(mail);
' create SMTP client, connect, log in ' ... ' create new mail message Dim mail = New Rebex.Mail.MailMessage() mail.From = "joe@example.org" mail.To = "john@example.org" mail.Subject = "Test" mail.BodyText = "Hello World!" mail.BodyHtml = "<strong>Hello World!</strong>" ' send mail smtp.Send(mail)
When sending multiple e-mail messages, you can save lot of overhead by sending all of them in a single SMTP session.
Sending from stream
To send a message in MIME format from a stream, use the Smtp.Send
method:
// create SMTP client instance, connect, log in // ... // open file in MIME format using (FileStream input = File.OpenRead(@"C:\MyData\mail.eml")) { // send mail from stream smtp.Send(input); }
' create SMTP client instance, connect, log in ' ... ' open file in MIME format Using input As FileStream = File.OpenRead("C:\MyData\mail.eml") ' send mail from stream smtp.Send(input) End Using
There is also an overload of Smtp.Send
method that accepts a file path instead of Stream
.
Sending multiple messages in a single session
You can send multiple messages in a single SMTP session. This significantly reduces the overhead involved in establishing new sessions.
// create SMTP client instance, connect, log in // ... // send all "*.eml" files from "MyData" directory foreach (string file in Directory.GetFiles(@"C:\MyData", "*.eml")) { smtp.Send(file); }
' create SMTP client instance, connect, log in ' ... ' send all "*.eml" files from "MyData" directory For Each file As String In Directory.GetFiles("C:\MyData", "*.eml") smtp.Send(file) Next
Sending e-mail directly to recipient's SMTP server
If you don't have any outgoing SMTP server, you might try using Smtp.SendDirect
method to send e-mail directly to the recipient's SMTP server.
// send the mail directly to recipient SMTP server SmtpRejectedRecipient[] rejected = Rebex.Net.Smtp.SendDirect(mail); // print info about rejected recipients foreach (SmtpRejectedRecipient recipient in rejected) { Console.WriteLine("Rejected: {0}", recipient.Address); }
' send the mail directly to recipient SMTP server Dim rejected As SmtpRejectedRecipient() = Rebex.Net.Smtp.SendDirect(mail) ' print info about rejected recipients For Each recipient As SmtpRejectedRecipient In rejected Console.WriteLine("Rejected: {0}", recipient.Address) Next
However, this means you are actually simulating an SMTP server. Don't use this unless you have to.
Also, many organizations block outgoing connection to port 25, which blocks the Smtp.SendDirect
as well.
Sending e-mail using IIS mail pickup directory
To send an e-mail using IIS pickup directory, use the static Smtp.Send
method and set SmtpConfiguration.DeliveryMethod
to SmtpDeliveryMethod.IisPickupDirectory
:
// create new configuration and specify desired delivery method var config = new SmtpConfiguration(); config.DeliveryMethod = SmtpDeliveryMethod.IisPickupDirectory; config.PickupDirectoryPath = path; // send the mail using IIS pickup directory Rebex.Net.Smtp.Send(mail, config);
' create new configuration and specify desired delivery method Dim config = New SmtpConfiguration() config.DeliveryMethod = SmtpDeliveryMethod.IisPickupDirectory config.PickupDirectoryPath = path ' send the mail using IIS pickup directory Rebex.Net.Smtp.Send(mail, config)
Sending e-mail on behalf of another user
To send an e-mail on behalf of another address,
specify the MailMessage.Sender
property in addition to MailMessage.From
:
// prepare mail message mail.From = "joe@example.org"; mail.Sender = "bob@example.org"; // create SMTP client instance, connect, log in // ... // Bob sends mail on behalf of Joe smtp.Send(mail);
' prepare mail message mail.From = "joe@example.org" mail.Sender = "bob@example.org" ' create SMTP client instance, connect, log in ' ... ' Bob sends mail on behalf of Joe smtp.Send(mail)
Instructing the receiver to send replies to another address
When you would like the replies to be delivered to an address different from the sender,
specify the MailMessage.ReplyTo
property in addition to MailMessage.From
:
// prepare mail message mail.From = "joe@example.org"; mail.ReplyTo = "bob@example.org"; // create SMTP client instance, connect, log in // ... // send mail from Joe, but request that replies go to Bob smtp.Send(mail);
' prepare mail message mail.From = "joe@example.org" mail.ReplyTo = "bob@example.org" ' create SMTP client instance, connect, log in ' ... ' send mail from Joe, but request that replies go to Bob smtp.Send(mail)
Setting and getting a client domain
Many SMTP servers require the client machine domain announced by the client to be valid.
The Smtp
object tries detecting the domain automatically, but it's not always possible.
In such cases, set the client domain explicitly using the Smtp.ClientDomain
property.
// create SMTP client instance using (var smtp = new Rebex.Net.Smtp()) { // set the client domain smtp.ClientDomain = "domain.example.org"; // connect smtp.Connect(hostname); // write info about client and server domain Console.WriteLine(smtp.ClientDomain); Console.WriteLine(smtp.ServerDomain); }
' create SMTP client instance Using smtp = New Rebex.Net.Smtp() ' set the client domain smtp.ClientDomain = "domain.example.org" ' connect smtp.Connect(hostname) ' write info about client and server domain Console.WriteLine(smtp.ClientDomain) Console.WriteLine(smtp.ServerDomain) End Using
Delivery status notifications (DSN)
You can ask your SMTP server to generate delivary status notifications (DSN) for you. Use the following properties to configure various aspects of this:
Smtp.DeliveryStatusNotificationConditions
Smtp.DeliveryStatusNotificationOriginalMessageMethod
To be able to match the DSN replies with your messages, use MailMessage
object's EnvelopeID
property.
// generate DSN on Failure or Unusual Delay (default is Failure only) smtp.DeliveryStatusNotificationConditions = DeliveryStatusNotificationConditions.Failure | DeliveryStatusNotificationConditions.Delay; // include full original message to DSN smtp.DeliveryStatusNotificationOriginalMessageMethod = DeliveryStatusNotificationOriginalMessageMethod.FullMessage; // generate and/or assign a unique envelope ID // (although it is convenient to assign the same unique ID to both MessageId // and EnvelopeId, these headers are not required to be the same) mail.MessageId = new MessageId(); mail.EnvelopeId = mail.MessageId.Id; // send the email // ...
' generate DSN on Failure or Unusual Delay (default is Failure only) smtp.DeliveryStatusNotificationConditions = DeliveryStatusNotificationConditions.Failure Or DeliveryStatusNotificationConditions.Delay ' include full original message to DSN smtp.DeliveryStatusNotificationOriginalMessageMethod = DeliveryStatusNotificationOriginalMessageMethod.FullMessage ' generate and/or assign a unique envelope ID ' (although it is convenient to assign the same unique ID to both MessageId ' and EnvelopeId, these headers are not required to be the same) mail.MessageId = New MessageId mail.EnvelopeId = mail.MessageId.Id ' send the email ' ...
Sending replies
To create a reply to a message, use
MailMessage.CreateReply
method.
Then, send the message using Smtp.Send
.
Forwarding messages
To forward a message to another address, copy the required fields and add the original message as an attachment:
// download a message to forward MailMessage original = imap.GetMailMessage(uniqueId); // prepare forwarded message MailMessage forward = new MailMessage(); forward.From = "joe@example.org"; forward.To = "john@example.org"; forward.Subject = "FW: " + original.Subject; forward.BodyText = "Hello, I am forwarding this to you:\n\n" + original.BodyText; // include original message as attachment forward.Attachments.Add(new Attachment(original)); // send it smtp.Send(forward);
' download a message to forward Dim original As MailMessage = imap.GetMailMessage(uniqueId) ' prepare forwarded message Dim forward As New MailMessage() forward.From = "joe@example.org" forward.To = "john@example.org" forward.Subject = "FW: " + original.Subject forward.BodyText = "Hello, I am forwarding this to you:" & vbLf & vbLf & original.BodyText ' include original message as attachment forward.Attachments.Add(New Attachment(original)) ' send it smtp.Send(forward)
Back to feature list...