发送和转发消息 - 使用 Java 程序发送 Outlook 电子邮件

SmtpClient 类允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件。

要发送电子邮件并在等待邮件传输到 SMTP 服务器期间阻塞,请使用同步 Send 方法之一。若希望程序主线程在邮件传输时继续执行,请使用 beginSend 方法。

同步发送电子邮件

可以使用…同步发送电子邮件 SmtpClientsend 方法。它通过 SMTP 服务器发送指定的电子邮件以进行投递。邮件的发件人、收件人、主题和正文使用 String 对象指定。要同步发送电子邮件,请按照以下步骤操作:

  1. 创建以下实例: MailMessage 类并设置其属性。
  2. 创建以下实例: SmtpClient 类并指定主机、端口、用户名和密码。
  3. 使用…发送消息 SmtpClient 类 send 方法并传递 MailMessage 实例。

下面的 Java 代码片段展示了如何同步发送 Outlook 邮件。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

// 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.setHost("mail.server.com");
client.setUsername("username");
client.setPassword("password");
client.setPort(587);
client.setSecurityOptions(SecurityOptions.SSLExplicit);

try {
    // Client.Send will send this message
    client.send(msg);
    System.out.println("Message sent");
} catch (Exception ex) {
    System.err.println(ex);
}

异步发送电子邮件

有时,您可能希望异步发送邮件。例如,如果通过应用程序发送大量邮件,同步方式可能无法工作。在这种情况下,您可以使用 beginSend。该 beginSend 方法的 SmtpClient 类将电子邮件发送到 SMTP 服务器进行投递。此方法不会阻塞调用线程,并允许调用方传递一个对象给方法,在操作完成时被调用。要在 Java 中异步发送 Outlook 邮件,请按照以下步骤:

  1. 创建以下实例: MailMessage 类并使用其不同的属性。
  2. 创建以下实例: SmtpClient 类并指定主机、端口、用户名和密码。
  3. 创建一个用户定义的实例,该实例将在异步操作完成时传递给方法并被调用。
  4. 使用…发送消息 beginSend 方法的 SmtpClient 类并传递 MailMessage 实例以及其中的用户自定义实例,同时在操作完成时调用的回调函数。

当电子邮件已发送或操作已取消时接收通知,需要将回调函数传递给 beginSend 方法被调用。调用之后的 SmtpClient 类 beginSend 方法是不必等待电子邮件完全发送完毕。我们可以调用另一个方法 beginSend 同时。当使用 beginSend 方法中,代码片段会打印一条消息("Message Sent")。下面的 Java 程序或代码片段展示了如何异步发送电子邮件。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

public static void run() {
    sendMail();
}

static SmtpClient getSmtpClient() {
    SmtpClient client = new SmtpClient();
    client.setHost("mail.server.com");
    // Specify your mail Username, Password, Port # and security option
    client.setUsername("username");
    client.setPassword("password");
    client.setPort(587);
    client.setSecurityOptions(SecurityOptions.SSLExplicit);
    return client;
}

static void sendMail() {
    try {

        // Declare msg as MailMessage instance
        MailMessage msg = new MailMessage("sender@gmail.com", "receiver@gmail.com", "Test subject", "Test body");
        SmtpClient client = getSmtpClient();
        Object state = new Object();
        IAsyncResult ar = client.beginSend(msg, callback, state);
        // If the user canceled the send, and mail hasn't been sent yet,
        client.cancelAsyncOperation(ar);

        msg.dispose();
        System.out.println("Goodbye.");
    } catch (Exception ex) {
        System.err.println(ex);
    }
}

static AsyncCallback callback = new AsyncCallback() {
    public void invoke(IAsyncResult ar) {
        IAsyncResultExt task = null;
        if (ar instanceof IAsyncResult)
            task = (IAsyncResultExt) ar;

        if (task != null && task.isCanceled()) {
            System.out.println("Send canceled.");
        }

        if (task != null && task.getErrorInfo() != null) {
            System.out.println(task.getErrorInfo());
        } else {
            System.out.println("Message Sent.");
        }
    }
};

从磁盘发送已存储的消息

EML 文件(Outlook Express 电子邮件文件)包含邮件头、正文以及任何附件。Aspose.Email 让开发者以多种方式处理 EML 文件。本文展示了如何从磁盘加载 EML 文件并使用 SMTP 将其作为电子邮件发送。您可以将 .eml 文件从磁盘或流加载到 MailMessage 类并使用 SmtpClient 类。该 MailMessage 类是用于创建新电子邮件、从磁盘或流加载电子邮件文件以及保存消息的主类。以下 Java 代码片段展示了如何从磁盘发送已存储的消息。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

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

// Send this message using SmtpClient
SmtpClient client = new SmtpClient("host", "username", "password");

try {
    client.send(message);
} catch (Exception ex) {
    System.out.println(ex.getMessage());
}

发送纯文本电子邮件

下面的编程示例展示了如何发送纯文本电子邮件。该 正文 属性,是 MailMessage 类用于指定消息正文的纯文本内容。要发送纯文本电子邮件,请按以下步骤操作:

以下代码片段展示了如何发送纯文本电子邮件。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

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

// Set From field, To field and Plain text body
message.setFrom(MailAddress.to_MailAddress("sender@sender.com"));
message.getTo().add("receiver@receiver.com");
message.setBody("This is Plain Text Body");

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

// And Specify your mailing host server, Username, Password and Port
client.setHost("smtp.server.com");
client.setUsername("Username");
client.setPassword("Password");
client.setPort(25);

try {
    // Client.Send will send this message
    client.send(message);
    System.out.println("Message sent");
} catch (Exception ex) {
    System.err.println(ex);
}

发送带有 HTML 正文的电子邮件

下面的编程示例展示了如何发送简易的 HTML 邮件。该 HtmlBody,是 MailMessage 类用于指定消息正文的 HTML 内容。要发送简易的 HTML 邮件,请按以下步骤操作:

本文中,电子邮件的 HTML 内容简陋:This is the HTML body 大多数 HTML 邮件会更复杂。以下 Java 程序片段展示了如何发送带有 HTML 正文的电子邮件。

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

    // Use MailMessage properties like specify sender, recipient, message and HtmlBody
    msg.setFrom(MailAddress.to_MailAddress("newcustomeronnet@gmail.com"));
    msg.setTo(MailAddressCollection.to_MailAddressCollection("asposetest123@gmail.com"));
    msg.setSubject("Test subject");
    msg.setHtmlBody("<html><body>This is the HTML body</body></html>");
    SmtpClient client = getSmtpClient();
    try {
        // Client will send this message
        client.send(msg);
        System.out.println("Message sent");
    } catch (Exception ex) {
        System.err.println(ex);
    }

    System.out.println("Email sent with HTML body.");
}

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

发送带有替代文本的电子邮件

下面的编程示例展示了如何发送带有替代内容的简易 HTML 邮件。使用 AlternateView 类中指定电子邮件消息的不同格式副本。例如,如果您以 HTML 发送消息,可能还希望为无法显示 HTML 内容的收件人提供纯文本版本。或者在发送简报时,您可能想为选择接收纯文本版本的收件人提供纯文本副本。要发送包含替代文本的电子邮件,请按以下步骤操作:

  1. 创建该类的实例 MailMessage 类。
  2. MailMessage 实例。
  3. 创建该类的实例 AlternateView 类。

这会使用字符串中指定的内容为电子邮件消息创建替代视图。

  1. 添加该类的实例 AlternateView 类发送到 MailMessage 对象。
  2. 创建该类的实例 SmtpClient 类并使用 send 方法。

以下代码片段展示了如何发送包含替代文本的电子邮件。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

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

// Creates AlternateView to view an email message using the content specified in the //String
AlternateView alternate = AlternateView.createAlternateViewFromString("Alternate Text");

// Adding alternate text
message.getAlternateViews().addItem(alternate);

批量发送电子邮件

批量发送电子邮件意味着在一条消息中发送一批邮件。我们可以使用 SmtpClient 类 send 接受 MailMessageCollection 类:

  1. 创建以下实例: SmtpClient 类。
  2. 指定 SmtpClient 类属性。
  3. 创建该类的实例 MailMessage 类。
  4. 在实例中指定发件人、收件人、邮件主题和内容 MailMessage 类。
  5. 如果想给其他人发送邮件,请再次重复以上两步。
  6. 创建以下实例: MailMessageCollection 类。
  7. 添加一个实例 MailMessage 类在对象的 MailMessageCollection 类。
  8. 现在使用 SmtpClientsend 方法通过传入 MailMessageCollection 其中的类。

以下代码片段展示了如何批量发送电子邮件。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

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

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

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

// Use client.BulkSend function to complete the bulk send task
try {
    // Send Message using BulkSend method
    client.send(manyMsg);
    System.out.println("Message sent");
} catch (Exception ex) {
    System.err.println(ex);
}

获取批量发送消息的信息

批量发送消息时,您可以获取成功发送的消息数量以及这些消息的列表。该 SucceededSending 事件用于此目的。

下面的代码示例展示了如何获取成功发送的消息数量信息:

try (SmtpClient client = new SmtpClient(host, SecurityOptions.Auto)) {
    final AtomicInteger messageCount = new AtomicInteger(0);

    client.setSucceededSending(new EventHandler<MailMessageEventArgs>() {
        public void invoke(Object sender, MailMessageEventArgs eventArgs) {
            System.out.println("The message " + eventArgs.getMessage().getSubject() + " was successfully sent.");
            messageCount.incrementAndGet();
        }
    });

    client.send(messages);

    System.out.println(messageCount + " messages were successfully sent.");
}

使用多连接发送电子邮件

SmtpClient 提供了一个 UseMultiConnection 属性可用于在繁重操作时创建多个连接。您也可以通过使用 SmtpClient.ConnectionsQuantity。以下代码片段演示了使用多连接模式发送多条消息。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

SmtpClient smtpClient = new SmtpClient();
smtpClient.setHost("<HOST>");
smtpClient.setUsername("<USERNAME>");
smtpClient.setPassword("<PASSWORD>");
smtpClient.setPort(587);
smtpClient.setSupportedEncryption(EncryptionProtocols.Tls);
smtpClient.setSecurityOptions(SecurityOptions.SSLExplicit);

List<MailMessage> messages = new ArrayList<MailMessage>();
for (int i = 0; i < 20; i++) {
    MailMessage message = new MailMessage("<EMAIL ADDRESS>", "<EMAIL ADDRESS>", "Test Message - " + UUID.randomUUID().toString(),
            "SMTP Send Messages with MultiConnection");
    messages.add(message);
}

smtpClient.setConnectionsQuantity(5);
smtpClient.setUseMultiConnection(MultiConnectionMode.Enable);
smtpClient.send(messages);

以 TNEF 发送消息

TNEF 邮件具有特殊格式,如果使用标准 API 发送可能会丢失。Aspose.Email 提供以 TNEF 发送邮件的能力,从而保留格式。该 SmtpClient 类 UseTnef 属性可以设置为以 TNEF 形式发送电子邮件。以下代码片段展示了如何以 TNEF 发送消息。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

String emlFileName = dataDir + "Message.eml"; // A TNEF Email

// Load from eml
MailMessage eml1 = MailMessage.load(emlFileName, new EmlLoadOptions());
eml1.setFrom(MailAddress.to_MailAddress("somename@gmail.com"));
eml1.getTo().clear();
eml1.getTo().addItem(new MailAddress("first.last@test.com"));
eml1.setSubject("With PreserveTnef flag during loading");
eml1.setDate(new Date());
SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "somename", "password");
client.setSecurityOptions(SecurityOptions.Auto);
client.setUseTnef(true); // Use this flag to send as TNEF
client.send(eml1);

发送会议请求

Microsoft Outlook 提供日历功能以及电子邮件管理。当用户打开含有活动邀请的电子邮件时,Outlook 会提示他们接受或拒绝邀请。Aspose.Email 让开发者能够向您的电子邮件添加日历功能。

通过电子邮件发送请求

要通过电子邮件发送会议请求,请按以下步骤操作:

|iCalendar 会议请求通过电子邮件发送| | :- | |todo:image_alt_text| 以下代码片段展示了如何通过电子邮件发送请求。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

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

// Set the sender, recipient, who will receive the meeting request. Basically, the recipient is the same as the meeting attendees
msg.setFrom(MailAddress.to_MailAddress("newcustomeronnet@gmail.com"));
msg.setTo(MailAddressCollection.to_MailAddressCollection("person1@domain.com, person2@domain.com, person3@domain.com, asposetest123@gmail.com"));

// Create Appointment instance
Calendar cal = Calendar.getInstance();
cal.set(2015, Calendar.JULY, 17, 13, 0, 0);
Date startDate = cal.getTime();
cal.set(2015, Calendar.JULY, 17, 14, 0, 0);
Date endDate = cal.getTime();
Appointment app = new Appointment("Room 112", startDate, endDate, msg.getFrom(), msg.getTo());
app.setSummary("Release Meetting");
app.setDescription("Discuss for the next release");

// Add appointment to the message and Create an instance of SmtpClient class
msg.addAlternateView(app.requestApointment());
SmtpClient client = getSmtpClient();

try {
    // Client.Send will send this message
    client.send(msg);
    System.out.println("Message sent");
} catch (Exception ex) {
    System.err.println(ex);
}

iCalendar 对 IBM Lotus Notes 的支持

Aspose.Email 日历功能基于 iCalendar 标准,这是日历数据交换的标准(RFC 2445 或 RFC2445 语法参考)。因此,它不仅支持 Microsoft Outlook,还支持 IBM Lotus Notes。要在 Lotus Notes 中发送会议请求,请遵循上述相同步骤。

使用 SMTP 客户端转发电子邮件

使用 SMTP 客户端转发电子邮件

转发电子邮件是日常数字通信中的常见做法。已收到的邮件可以转发给特定收件人,而不与原始发送者共享。Aspose.Email API SmtpClient 提供将电子邮件转发给特定收件人的能力。其 转发 方法可用于将已接收或已保存的电子邮件转发给所需收件人,如本文所示。以下代码片段展示了如何使用 SMTP 客户端转发电子邮件。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

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

// Specify your mailing host server, Username, Password, Port and SecurityOptions
client.setHost("mail.server.com");
client.setUsername("username");
client.setPassword("password");
client.setPort(587);
client.setSecurityOptions(SecurityOptions.SSLExplicit);
MailMessage message = MailMessage.load(dataDir + "Message.eml");
client.forward("Recipient1@domain.com", "Recipient2@domain.com", message);

在不使用 MailMessage 转发电子邮件

该 API 还支持在未先加载到 MailMessage。这在系统内存资源有限的情况下很有用。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java

String host = "mail.server.com";
String username = "username";
String password = "password";
int smtpPort = 587;
String sender = "Sender@domain.com";
MailAddressCollection recipients = new MailAddressCollection();
recipients.add("recepient1@domain.com, recepient2@domain.com");

try (SmtpClient client = new SmtpClient(host, smtpPort, username, password, SecurityOptions.Auto)) {
    String fileName = "test.eml";
    try (FileInputStream fs = new FileInputStream(new File(dataDir + fileName))) {
        client.forward(sender, recipients, fs);
    }
}

执行邮件合并

邮件合并帮助您创建并发送一批相似的电子邮件。邮件的核心内容相同,但可以对内容进行个性化。通常使用收件人的联系信息(名、姓、公司等)来个性化邮件。

|邮件合并工作示意:| | :- | |todo:image_alt_text| Aspose.Email 让开发者能够设置包含多种数据源数据的邮件合并。

要使用 Aspose.Email 执行邮件合并,请执行以下步骤:

  1. 创建一个具有以下签名的函数
  2. 创建该类的实例 MailMessage 类。
  3. 指定发件人、收件人、主题和正文。
  4. 为电子邮件末尾创建签名。
  5. 创建该类的实例 TemplateEngine 类中获取签名并传递给 MailMessage 实例。
  6. TemplateEngine 实例。
  7. 创建该类的实例 DataTable 类。
  8. 在…中将列 ReceiptFirstNameLastName 添加为数据源 DataTable 类。
  9. 创建该类的实例 DataRow 类。
  10. 在…中指定收件地址、名和姓 DataRow 对象。
  11. 创建该类的实例 MailMessageCollection 类
  12. 指定 TemplateEngine  和 DataTable 实例在 MailMessageCollection 实例。
  13. 创建该类的实例 SmtpClient 类并指定服务器、端口、用户名和密码。
  14. 使用以下方式发送电子邮件: SmtpClient 类 send 方法。

在下面的示例中,#FirstName# 表示一个 DataTable 列,由用户设置其值。以下代码片段展示了如何执行邮件合并。

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
    // The path to the File directory.
    String dstEmail = dataDir + "EmbeddedImage.msg";

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

    // Add subject and from address
    msg.setSubject("Hello, #FirstName#");
    msg.setFrom(MailAddress.to_MailAddress("sender@sender.com"));

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

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

    msg.setHtmlBody(htmlBody);

    // 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", new TemplateRoutine() {
        public Object invoke(Object[] args) {
            return getSignature(args);
        }
    });

    // Create an instance of DataTable and Fill a DataTable as data source
    DataTable dt = new DataTable();
    dt.getColumns().add("Receipt");
    dt.getColumns().add("FirstName");
    dt.getColumns().add("LastName");

    DataRow dr;
    dr = dt.newRow();
    dr.set("Receipt", "Nancy&lt;Nancy@somedomain.com&gt;");
    dr.set("FirstName", "Nancy");
    dr.set("LastName", "Doe");
    dt.getRows().add(dr);
    dr = dt.newRow();
    dr.set("Receipt", "Andrew&lt;Andrew@somedomain.com&gt;");
    dr.set("FirstName", "Andrew");
    dr.set("LastName", "Doe");
    dt.getRows().add(dr);
    dr = dt.newRow();
    dr.set("Receipt", "Janet&lt;Janet@somedomain.com&gt;");
    dr.set("FirstName", "Janet");
    dr.set("LastName", "Doe");
    dt.getRows().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.setSecurityOptions(SecurityOptions.Auto);

        // Send messages in bulk
        client.send(messages);
    } catch (MailException ex) {
        System.err.println(ex);
    }

    catch (SmtpException ex) {
        System.err.println(ex);
    }

    System.out.println("Message sent after performing mail merge.");
}

// Template routine to provide signature
static Object getSignature(Object[] args) {
    return "Aspose.Email Team<br>Aspose Ltd.<br>" + new Date().toString();
}

执行逐行邮件合并

用户也可以合并单独的数据行,以获取完整且已准备好的 MailMessage 对象。该 TemplateEngine.merge 方法可用于执行逐行邮件合并。

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