在没有邮件会话的情况下使用Java创建电子邮件
我想在我的应用程序中创建一个实用程序方法,该方法接受电子邮件作为参数并知道如何发送它。此实用程序方法将负责知道哪个SMTP服务器使用它应该使用的凭据来连接它。在没有邮件会话的情况下使用Java创建电子邮件
我快与javax.mail
的问题是javax.mail.Message
类和javax.mail.MimeMessage
类期待javax.mail.Session
对象作为参数传递给构造。因此,我不能有像
private static void sendMail(javax.mail.Message);
方法签名,因为我的客户端类将无法constuct消息都没有,我试图抽象掉的细节。他们必须知道如何通过连接到邮件服务器来创建会话。
有没有办法在没有会话的情况下创建消息,或者是封装不需要会话的电子邮件的类?
使用Apache Commons Email,可以将以下任何代码添加到sendMail方法,具体取决于您希望设置的位置。
HtmlEmail email = new HtmlEmail();
//email.setDebug(debugMode);
email.setBounceAddress("[email protected]");
email.setHostName("mySMTPHost");
email.setFrom("[email protected]");
email.addTo(emailAddress);
email.addBcc("bccAddres");
email.setSubject("Your Subject");
email.setAuthentication("[email protected]", "password");
email.setSSL(true);
email.setSmtpPort(465);
email.setHtmlMsg(html);
public static void sendMail(org.apache.commons.mail.HtmlEmail email)
{
email.send();
}
本示例中使用的库来自Apache Commons:http://commons.apache.org/。 HTMLEmail是这些库的commons-email组件中的一个类:http://commons.apache.org/proper/commons-email/ –
而不是让每个客户端自己创建消息类,让他们从您的实用程序类中获取消息对象。然后,实用程序类可以构造具有所需会话信息的消息对象。
是否有这样的消息实用程序对象已经在某个库中构建,或者这是我会必须创建? –
我认为你需要创建它。即使Spring使用JavaMailSenderImpl中的会话对象。 http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/mail/javamail/JavaMailSenderImpl.html – mmirwaldt
这个答案缺少一个代码示例,或者至少应该清楚地指出什么是实用程序你正在谈论的课程(-1) –
MimeMessage
类将接受空会话。如果您创建此类消息,Transport.send
可能无法发送您的MimeMessage
要解决您只需管理自己的会话和传输对象,然后使用非静态的Transport.sendMessage
方法。
public void forward(Session session, Message m) throws MessagingException {
Address[] all = m.getAllRecipients();
if (all == null) { //Don't pass null to sendMessage.
all = new InternetAddress[0];
}
Transport t;
try {
if (all.length != 0) {
t = session.getTransport(all[0]);
} else {
t = session.getTransport("smtp");
}
} catch (NoSuchProviderException tryDefault) {
try {
t = session.getTransport();
} catch (NoSuchProviderException fail) {
if (fail.setNextException(tryDefault)) {
throw fail;
} else {
tryDefault.setNextException(fail);
throw tryDefault;
}
}
}
m.saveChanges();
t.connect("host", 25, "user", "pass");
try {
t.sendMessage(m, all);
} finally {
try {
t.close();
} catch (MessagingException warning) {
}
}
}
你可以提供或指出任何示例代码? –
添加示例代码。 – jmehrens
如果你正在使用Spring框架/春天开机,你可以注入一个Spring JavaMailSenderImpl到类,并做(很明显,你将需要注入邮件发送者太SMTP服务器属性):
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
你需要以下依赖添加到您的应用程序这个工作:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
你有没有在Apache的通用电子邮件软件包看着这一切,或者是你在'javax.mail'设置? – thatidiotguy
我使用Apache公共。我对使用开源软件包的解决方案感到非常满意。 –