`
zhuyuanxiang
  • 浏览: 130531 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Apusic上用JavaMail发邮件

阅读更多

Apusic上用JavaMail发邮件
0. JavaMail基本介绍
 JavaMail是属于J2EE框架中的一部分,主要是为简化Mail部分开发工作。使用JavaMail发送邮件需要以下步骤:
 1)初始化Session实例;
 在初始化Session实例中有两种方式:使用JNDI初始化和在代码中自行完成初始化。
 ★ 如果SMTP不需要认证,则不再做其他工作;
 ★ 如果SMTP需要认证,则确定在Session中提供嵌入认证信息,还是由3)Transport完成认证过程。
 2)初始化Message实例,填充相关信息;
 3)初始化Transport实例,连接到远程SMTP服务器,发送邮件。
 在初始化Transport实例时也有两种情况:
 ★ 如果SMTP不需要认证,可以直接调用send()函数发送邮件,应用服务器会在后台调用connect()函数完成谁,进行邮件发送;
 ★ 如果SMTP需要认证,需要调用connect()函数,并提供认证需要的用户名/密码,才可以正确发送邮件。
 
1. javax.mail.Session的初始化
1.1. 使用JNDI初始化(配置JavaMail的JNDI)
在Apusic的J2EE应用中找到apusic-application.xml文件,增加<mail-session>部分,示例如下:
<apusic-application>
 <module uri="web.war">
  <web />
 </module>
 <mail-session>
  <jndi-name>javamail/myMail</jndi-name>
  <property name="mail.transport.protocol" value="smtp" />
  <property name="mail.smtp.host" value="smtp.163.com" />
  <property name="mail.smtp.user" value="user" />
  <property name="mail.smtp.password" value="password" />
  <property name="mail.smtp.auth" value="true" />
  <property name="mail.from" value="user@163.com" />
 </mail-session>
</apusic-application>

1.1.1. 通过JNDI找到JavaMail
1.1.1.1. 使用远程访问获得JavaMail
 Hashtable env=new Hashtable();
 env.put(Context.INITIAL_CONTEXT_FACTORY,"com.apusic.naming.jndi.CNContextFactory");
 env.put(Context.PROVIDER_URL,"iiop://localhost:6888");
 //插入相关验证信息
 env.put(Context.SECURITY_CREDENTIALS,"admin" ) ;
 env.put(Context.SECURITY_PRINCIPAL,"admin");
 Context initCtx=new InitialContext(env);
 System.out.println(initCtx.PROVIDER_URL);
 //通过RMI 取得
 Session myMailSession = (Session) initCtx.lookup("javamail/myMailNoAuth");
1.1.1.2. 使用Apusic默认方式获得JavaMail
 Context initCtx = new InitialContext();
 Session myMailSession = (Session) initCtx.lookup("javamail/myMailNoAuth");
 System.out.println(myMailSession.getProperty("mail.smtp.host"));
 
1.1.2. 通过资源注入配置JavaMail
 @Resource(mappedName = "javamail/myMailAuth", type = javax.mail.Session.class, shareable = true, authenticationType = Resource.AuthenticationType.CONTAINER, description = "my email with auth")
 private Session myAuthMailSession;
或者
 @Resource(mappedName = "javamail/myMailAuth")
 private Session myAuthMailSession;

1.2. 在代码中初始化
1.2.1. 无须认证的初始化
 final Properties props = new Properties();
 props.put("mail.transport.protocol", "smtp");
 props.put("mail.smtp.auth", "false");
 props.put("mail.smtp.host", "localhost");
 Session myMailSession = Session.getInstance(props);
1.2.2. 需要认证的初始化(Session实例构造时提供认证支持)
 final Properties props = new Properties();
 props.put("mail.transport.protocol", "smtp");
 props.put("mail.smtp.auth", "true");
 props.put("mail.smtp.host", "smtp.163.com");
 Session myMailSession = Session.getInstance(props, new Authenticator() {
  public PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication("user", "password");} });
1.2.3. 需要认证的初始化(Session配置参数提供认证支持)
 myMailSession.setPasswordAuthentication(
  new URLName(props.getProperty("mail.transport.protocol")+"://"+  
                 props.getProperty("mail.smtp.user")+"@"+  
                 props.getProperty("mail.smtp.host")),  
        new PasswordAuthentication(props.getProperty("mail.smtp.user"),  
                 props.getProperty("mail.smtp.password")));  

1.2.4. 需要认证的初始化(Transport配置参数提供认证支持)
  // 发送邮件
  javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
  myTransport.connect("smtp.163.com", "user", "password");
  myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
  myTransport.close();
   
1.4. 对Session调试的配置
● 可以在mail-session中加入<property name="mail.debug" value="true" />
● 可以在Session初始化前加入props.put("mail.debug", "true");
● 可以在Session初始化后,通过代码控制myMailSession.setDebug(true);

1.5. Properties的解释
◆ mail.store.protocol:用于检索邮件的协议
◆ mail.transport.protocol:用于传送邮件的协议
◆ mail.host:默认的主机名,默认是本地计算机。
◆ mail.user:默认的用户名。
◆ mail.from:默认的返回地址。
◆ mail.debug:是否输出DEBUG信息。默认为False。
◆ mail.protocol.host:指定协议的主机名,没有指定就用mail.host。例如:mail.smtp.host=smtp.163.com
◆ mail.protocol.user:指定协议的用户名,没有指定就用mail.user。例如:mail.smtp.user=user
◆ mail.protocol.from:指定协议的返回地址,没有指定就用mail.from。例如:mail.smtp.from=user@163.com
◆ mail.smtp.auth:如果是True,就会登录SMTP服务器,获得授权才能发送邮件。默认为False。


2. 通过JavaMail发送邮件
2.1. 通过无须认证的SMTP发邮件
  final Properties props = new Properties();
  props.put("mail.transport.protocol", "smtp");
  props.put("mail.smtp.auth", "false");
  props.put("mail.smtp.host", "localhost");
  try {
   Session myMailSession = Session.getInstance(props);
   myMailSession.setDebug(true); // 打开DEBUG模式
   Message msg = new MimeMessage(myMailSession);
   msg.setFrom(new InternetAddress("user@163.com"));
   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
   msg.setContent("I have a email test!", "text/plain");
   msg.setSentDate(new java.util.Date());
   msg.setSubject("Test");
   msg.setText("This is a test!\n");
   System.out.println("1.Please wait for sending one...");

   // 发送邮件
   // javax.mail.Transport.send(msg); // 与下面四行的功能一样
   javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
   myTransport.connect();
   myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
   myTransport.close();
   
   System.out.println("2.Your message had send!");
  } catch (Exception error) {
   System.out.println("*.I am sorry to tell you the fail for " + error);
  }

注:测试可以使用Microsft IIS SMTP 服务,安装好启动服务后,还需要进入“IIS管理器”,增加一个“远程域”,对于“远程域”的“出站安全性”需要把用户名和密码加上(就是平时发邮件时登录用的用户名/密码),否则邮件发不出去。

2.2. 通过需要认证的SMTP发邮件
2.2.1. 需要认证的初始化(Session实例构造时提供认证支持)
 final Properties props = new Properties();
 props.put("mail.transport.protocol", "smtp");
 props.put("mail.smtp.auth", "true");
 props.put("mail.smtp.host", "smtp.163.com");

 try {
  Session myMailSession = Session.getInstance(props, new Authenticator() {
   public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication("user", "password");
   }
  });
  myMailSession.setDebug(true); // 打开DEBUG模式
  InternetAddress address = new InternetAddress("user@163.com");
  String message = "I have a email test!";
  Message msg = new MimeMessage(myMailSession);
  msg.setFrom(address);
  msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
  msg.setContent(message, "text/plain");
  msg.setSentDate(new java.util.Date());
  msg.setSubject("Test");
  msg.setText("This is a test!\n");
  out.println("1.Please wait for sending...");
  
  // 发送邮件
  javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
  myTransport.connect();
  myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
  myTransport.close();
  // javax.mail.Transport.send(msg); // 注释上四行,打开这行代码,功能一样
  out.println("2.Your message had send!");
 } catch (Exception error) {
  out.println("*.I am sorry to tell you the fail for " + error);
 }

2.2.2. 需要认证的初始化(Session配置参数提供认证支持)
 final Properties props = new Properties();
 props.put("mail.transport.protocol", "smtp");
 props.put("mail.smtp.auth", "true");
 props.put("mail.smtp.host", "smtp.163.com");

 try {
  Session myMailSession = Session.getInstance(props);
  myMailSession.setDebug(true); // 打开DEBUG模式
  myAuthMailSession.setPasswordAuthentication(
   new URLName("smtp://user@host", new PasswordAuthentication("user","password")); 
  InternetAddress address = new InternetAddress("user@163.com");
  String message = "I have a email test!";
  Message msg = new MimeMessage(myMailSession);
  msg.setFrom(address);
  msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
  msg.setContent(message, "text/plain");
  msg.setSentDate(new java.util.Date());
  msg.setSubject("Test");
  msg.setText("This is a test!\n");
  out.println("1.Please wait for sending...");
  
  // 发送邮件
  javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
  myTransport.connect();
  myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
  myTransport.close();
  // javax.mail.Transport.send(msg); // 注释上四行,打开这行代码,功能一样
  out.println("2.Your message had send!");
 } catch (Exception error) {
  out.println("*.I am sorry to tell you the fail for " + error);
 }

2.2.3. 需要认证的初始化(Transport配置参数提供认证支持)
  final Properties props = new Properties();
  props.put("mail.transport.protocol", "smtp");
  props.put("mail.smtp.auth", "true");

  try {
   Session myMailSession = Session.getInstance(props);
   myMailSession.setDebug(true); // 打开DEBUG模式
   Message msg = new MimeMessage(myMailSession);
   msg.setFrom(new InternetAddress("user@163.com"));
   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
   msg.setContent("I have a email test!", "text/plain");
   msg.setSentDate(new java.util.Date());
   msg.setSubject("Test");
   msg.setText("This is a test!\n");
   System.out.println("1.Please wait for sending two...");

   // 发送邮件
   javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
   myTransport.connect("smtp.163.com", "user", "password");
   myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
   myTransport.close();
   // javax.mail.Transport.send(msg); // 这行不能使用。
   System.out.println("2.Your message had send!");
  } catch (Exception error) {
   System.out.println("*.I am sorry to tell you the fail for " + error);
  }
 }

注:资源注入的Session发送邮件时:
无须认证的SMTP,可以参考2.1.
需要认证的SMTP,可以参考2.2.1.

参考:
http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html
http://commons.apache.org/email/userguide.html
http://www.blogjava.net/Unmi/archive/2007/06/07/124179.html
http://unmi.blogcn.com/diary,117630488.shtml


Apusic Stduio打包的示例工程。
http://zhuyuanxiang.iteye.com/topics/download/d6f5c3a9-9cd9-30be-9b64-9e311900b304

备注:本文耗时1周完成。

  • sendEmail.rar (18.9 KB)
  • 描述: Apusic Studio打包的示例工程。
  • 下载次数: 23
1
0
分享到:
评论
1 楼 zhuyuanxiang 2008-09-16  
我对文章进行了修改,受到“隔叶黄莺”文章的启发,现在已经将Session配置参数进行认证的方式加入其中。
另:Apusic Studio工程没有更新,如果自己修改代码测试Session配置参数进行认证失败,可以在此继续交流。
对“隔叶黄莺”提供的无私帮助在此表示感谢。

相关推荐

    Apusic密码修改指引

    3. **登录Apusic控制台检查部署的应用,除EAS、EASWeb、fileserver、jportal等已知应用外,是否有其他未知应用部署。** **注意事项:** - 对于发现的可疑文件或应用,应及时进行隔离或删除,并进一步调查来源。 ##...

    Apusic应用服务器6.0使用手册(CHM格式)

    金蝶Apusic应用服务器6.0在5.0的基础上进行了大量扩充和优化,在产品功能、性能、安全性、扩展性及兼容性等方面得到显著提升。金蝶Apusic应用服务器6.0大大简化了创建和管理Java EE应用的任务,并为之提供了可伸缩、...

    管理Apusic Web服务器

    管理 Apusic Web 服务器 Apusic Web 服务器是 Apusic 应用服务器中内置的一个高效、安全、可靠的 Web 服务器,提供完整的 Web 服务器的功能,使 Apusic 应用服务器在提供对静态页面和图形的同时,提供对 JSP、...

    金蝶中间件Apusic-plugins.zip

    总之,金蝶中间件Apusic-plugins.zip提供的插件资源对于使用Eclipse或MyEclipse的开发者来说,是提升Apusic应用开发体验的重要工具,通过它们,开发者可以更加高效地进行中间件上的应用开发和管理工作。

    金蝶Apusic V10 应用服务器用户管理手册

    Apusic V10版本进一步优化了这些特性,旨在帮助用户更便捷地管理和使用应用服务器。 I. 快速开始指南 在这一部分,用户可以找到关于如何快速上手Apusic应用服务器的信息。指南从基础介绍开始,包括产品的核心功能和...

    Apusic--license

    金蝶中间件(Apusic)--license

    Windows2003+Apusic6.0安装部署手册

    本手册旨在指导用户在 Windows 2003 操作系统上安装和部署 Apusic 6.0,旨在帮助用户快速掌握安装和配置 Apusic 6.0 的步骤。 一、安装准备 在开始安装 Apusic 6.0 之前,需要检查硬件和软件要求是否满足以下条件...

    Apusic5.1域配置

    【Apusic5.1域配置】是针对Apusic5.1服务器的一项关键操作,它涉及到服务器的管理和应用部署。Apusic(全称Apsara Music)是阿里巴巴集团研发的企业级中间件,主要用于构建高可用、高性能的企业级服务系统。本指南将...

    apusic数据库连接攻略

    该攻略主要用于在apusic文件中配置数据库连接,以便在应用程序中使用数据库资源。 1. 配置数据源 在apusic文件中,配置数据源是实现数据库连接的第一步。数据源的配置包括两个部分:JNDI名称和驱动程序类名称。在...

    EAS Apusic2016年的临时许可

    安装或使用EAS Apusic时,正确配置和使用这个许可证文件是至关重要的,因为它决定了软件能否正常运行以及运行的合法期限。 总之,EAS Apusic 2016是一个功能强大的企业级应用服务器,它为企业提供了稳定、安全、...

    金蝶中间件Apusic MyEclipse10.x、MyEclipse9.x和Eclipse all-plugins

    Apusic的Eclipse插件使开发者能够在标准的Eclipse环境中享受到与MyEclipse类似的支持,这对于那些习惯使用Eclipse但又需要Apusic中间件功能的开发者来说非常有价值。 使用这些插件,开发者可以: 1. 创建和管理...

    Apusic服务器解决数据源的资源引用

    假设我们有一个Apusic服务器实例,需要在其上部署一个Web应用,并且该应用需要连接到名为`test`的数据库。下面是一些具体的配置步骤: 1. **在`datasources.xml`中定义数据源**: ```xml ...

    Apusic_license

    Apusic 7.0,2014,license,

    apusic license2017测试许可到2088.docx

    综上所述,Apusic License 2017 测试许可到2088年的文档提供了关于如何使用Apusic License 2017版本中的测试许可证的详细指导。这对于需要长时间测试软件功能稳定性的开发人员来说是非常有价值的资源。通过了解和...

    EAS apusic5.0 许可

    描述中提到“许可到期时间2088年”,这是一个非常长期的授权,意味着用户可以在相当长的时间内无顾虑地使用Apusic5.0进行业务运营,无需担心因许可问题而中断服务。 Apusic5.0的核心功能可能包括但不限于以下几点:...

    2021年通用apusic license——5用户数

    2021年通用apusic license,适用于apusic9.0以上EAS(EAS8.0以上版本一般都可用),有效期到2021年12月31日。此apusic为5个连接数

    金蝶中间件Apusic Eclipse/MyEclipse插件 all-plugins

    尽管较旧,但这个版本可能仍然适用于那些还在使用9.x版本的开发者,确保他们在旧版本的IDE上也能得到完整的Apusic支持。 总的来说,金蝶中间件Apusic Eclipse/MyEclipse插件是一个强大的开发工具,旨在提升Java EE...

    Linux环境下使用Apache搭建Apusic应用服务器集群

    ### Linux环境下使用Apache搭建Apusic应用服务器集群 在IT领域,构建高效稳定的应用服务器集群是企业级服务的关键一环。本文将深入解析如何在Linux环境下,利用Apache与Apusic搭建应用服务器集群,并实现负载均衡,...

    金蝶Apusic用户手册(一)

    金蝶Apusic企业服务总线V7.0用户手册

Global site tag (gtag.js) - Google Analytics