发送和转发消息 - 使用 Java 程序发送 Outlook 电子邮件
该 SmtpClient 类允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件。
- 该 SmtpClient 类是开发者发送邮件的唯一主要入口。
- 该 SmtpClient 类还提供其他常见的邮件投递方式,包括将邮件写入文件系统、消息队列等。
- 该 SmtpClient 类完全支持这两种编程模型:
- 该 SmtpClient 类还支持 以 TNEF 发送消息
要发送电子邮件并在等待邮件传输到 SMTP 服务器期间阻塞,请使用同步 Send 方法之一。若希望程序主线程在邮件传输时继续执行,请使用 beginSend 方法。
同步发送电子邮件
可以使用…同步发送电子邮件 SmtpClient 类 send 方法。它通过 SMTP 服务器发送指定的电子邮件以进行投递。邮件的发件人、收件人、主题和正文使用 String 对象指定。要同步发送电子邮件,请按照以下步骤操作:
- 创建以下实例: MailMessage 类并设置其属性。
- 创建以下实例: SmtpClient 类并指定主机、端口、用户名和密码。
- 使用…发送消息 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 邮件,请按照以下步骤:
- 创建以下实例: MailMessage 类并使用其不同的属性。
- 创建以下实例: SmtpClient 类并指定主机、端口、用户名和密码。
- 创建一个用户定义的实例,该实例将在异步操作完成时传递给方法并被调用。
- 使用…发送消息 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 类用于指定消息正文的纯文本内容。要发送纯文本电子邮件,请按以下步骤操作:
- 创建该类的实例 MailMessage 类。
- 在 MailMessage 实例。
- 指定 正文 内容,用于纯文本消息。
- 创建该类的实例 SmtpClient 类并发送邮件。
以下代码片段展示了如何发送纯文本电子邮件。
// 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 邮件,请按以下步骤操作:
- 创建该类的实例 MailMessage 类。
- 在 MailMessage 实例。
- 指定 HtmlBody 内容。
- 创建该类的实例 SmtpClient 类并使用 send 方法。
本文中,电子邮件的 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 内容的收件人提供纯文本版本。或者在发送简报时,您可能想为选择接收纯文本版本的收件人提供纯文本副本。要发送包含替代文本的电子邮件,请按以下步骤操作:
- 创建该类的实例 MailMessage 类。
- 在 MailMessage 实例。
- 创建该类的实例 AlternateView 类。
这会使用字符串中指定的内容为电子邮件消息创建替代视图。
- 添加该类的实例 AlternateView 类发送到 MailMessage 对象。
- 创建该类的实例 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 类:
- 创建以下实例: SmtpClient 类。
- 指定 SmtpClient 类属性。
- 创建该类的实例 MailMessage 类。
- 在实例中指定发件人、收件人、邮件主题和内容 MailMessage 类。
- 如果想给其他人发送邮件,请再次重复以上两步。
- 创建以下实例: MailMessageCollection 类。
- 添加一个实例 MailMessage 类在对象的 MailMessageCollection 类。
- 现在使用 SmtpClient 类 send 方法通过传入 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 让开发者能够向您的电子邮件添加日历功能。
通过电子邮件发送请求
要通过电子邮件发送会议请求,请按以下步骤操作:
- 创建该类的实例 MailMessage 类。
- 使用…的实例指定发件人和收件人地址 MailMessage 类。
- 初始化…的实例 Appointment 类并传递其值。
- 在…中指定摘要和描述 Calendar 实例。
- 添加 Calendar) 到 MailMessage 实例并传递给它 Appointment 实例。
|iCalendar 会议请求通过电子邮件发送| | :- | |
| 以下代码片段展示了如何通过电子邮件发送请求。
// 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);
}
}
执行邮件合并
邮件合并帮助您创建并发送一批相似的电子邮件。邮件的核心内容相同,但可以对内容进行个性化。通常使用收件人的联系信息(名、姓、公司等)来个性化邮件。
|邮件合并工作示意:| | :- | |
| Aspose.Email 让开发者能够设置包含多种数据源数据的邮件合并。
要使用 Aspose.Email 执行邮件合并,请执行以下步骤:
- 创建一个具有以下签名的函数
- 创建该类的实例 MailMessage 类。
- 指定发件人、收件人、主题和正文。
- 为电子邮件末尾创建签名。
- 创建该类的实例 TemplateEngine 类中获取签名并传递给 MailMessage 实例。
- 在 TemplateEngine 实例。
- 创建该类的实例 DataTable 类。
- 在…中将列 Receipt、FirstName 和 LastName 添加为数据源 DataTable 类。
- 创建该类的实例 DataRow 类。
- 在…中指定收件地址、名和姓 DataRow 对象。
- 创建该类的实例 MailMessageCollection 类
- 指定 TemplateEngine 和 DataTable 实例在 MailMessageCollection 实例。
- 创建该类的实例 SmtpClient 类并指定服务器、端口、用户名和密码。
- 使用以下方式发送电子邮件: 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<Nancy@somedomain.com>");
dr.set("FirstName", "Nancy");
dr.set("LastName", "Doe");
dt.getRows().add(dr);
dr = dt.newRow();
dr.set("Receipt", "Andrew<Andrew@somedomain.com>");
dr.set("FirstName", "Andrew");
dr.set("LastName", "Doe");
dt.getRows().add(dr);
dr = dt.newRow();
dr.set("Receipt", "Janet<Janet@somedomain.com>");
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);