在没有邮件会话的情况下使用Java创建电子邮件

问题描述:

我想在我的应用程序中创建一个实用程序方法,该方法接受电子邮件作为参数并知道如何发送它。此实用程序方法将负责知道哪个SMTP服务器使用它应该使用的凭据来连接它。在没有邮件会话的情况下使用Java创建电子邮件

我快与javax.mail的问题是javax.mail.Message类和javax.mail.MimeMessage类期待javax.mail.Session对象作为参数传递给构造。因此,我不能有像

private static void sendMail(javax.mail.Message); 

方法签名,因为我的客户端类将无法constuct消息都没有,我试图抽象掉的细节。他们必须知道如何通过连接到邮件服务器来创建会话。

有没有办法在没有会话的情况下创建消息,或者是封装不需要会话的电子邮件的类?

+1

你有没有在Apache的通用电子邮件软件包看着这一切,或者是你在'javax.mail'设置? – thatidiotguy

+0

我使用Apache公共。我对使用开源软件包的解决方案感到非常满意。 –

使用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(); 
} 
+1

本示例中使用的库来自Apache Commons:http://commons.apache.org/。 HTMLEmail是这些库的commons-email组件中的一个类:http://commons.apache.org/proper/commons-email/ –

而不是让每个客户端自己创建消息类,让他们从您的实用程序类中获取消息对象。然后,实用程序类可以构造具有所需会话信息的消息对象。

+0

是否有这样的消息实用程序对象已经在某个库中构建,或者这是我会必须创建? –

+0

我认为你需要创建它。即使Spring使用JavaMailSenderImpl中的会话对象。 http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/mail/javamail/JavaMailSenderImpl.html – mmirwaldt

+0

这个答案缺少一个代码示例,或者至少应该清楚地指出什么是实用程序你正在谈论的课程(-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) { 
     } 
    } 
} 
+0

你可以提供或指出任何示例代码? –

+1

添加示例代码。 – jmehrens

如果你正在使用Spring框架/春天开机,你可以注入一个Spring JavaMailSenderImpl到类,并做(很明显,你将需要注入邮件发送者太SMTP服务器属性):

MimeMessage mimeMessage = javaMailSender.createMimeMessage(); 

你需要以下依赖添加到您的应用程序这个工作:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-mail</artifactId> 
    </dependency>