`
zhuyuanxiang
  • 浏览: 132990 次
  • 性别: 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配置参数进行认证失败,可以在此继续交流。
对“隔叶黄莺”提供的无私帮助在此表示感谢。

相关推荐

    AAS-V10.0用户手册.pdf

    资源管理章节解释了如何在Apusic服务器上添加和配置各种资源,例如JDBC连接、JavaMail会话、JMS资源和连接器等。它还介绍了如何配置JNDI资源和资源适配器。 配置部分为用户提供了对服务器上各种服务和组件的详细...

    AAS应用服务器用户手册

    - **JavaMail**:支持邮件发送功能。 - **JMX**:支持Java Management Extensions,实现系统管理和监控。 #### 第8章 WebServices - **WebServices引擎**: - **JAX-WS规范**:支持Java API for XML Web Services...

    Java EE规范各个版本的比较V1.0.doc

    - **JavaMail 1.2**:邮件和新闻协议的API。 - **JAF(JavaBeans Activation Framework)1.0**:用于识别和操作数据格式。 - **JAXP(Java API for XML Processing)1.1**:XML处理。 - **JNDI(Java Naming and...

    joblib-1.1.0-py2.py3-none-any.whl

    该资源为joblib-1.1.0-py2.py3-none-any.whl,欢迎下载使用哦!

    MATLAB/Simulink中Buck-Boost变换器开环与闭环控制仿真建模详解

    内容概要:本文详细介绍了如何使用MATLAB/Simulink R2015b搭建Buck-Boost变换器的开环和闭环控制仿真模型。首先,作者解释了Buck-Boost变换器的基本构成及其在电源设计中的重要性。接着,逐步指导读者构建开环模型,包括设置关键参数如PWM频率、占空比、输入电压等,并展示了开环控制下的输出特性。随后,引入了PID控制器进行闭环控制,强调了PID参数的选择与调整方法,以及如何通过增加电压采样和误差比较来提高系统的稳定性。此外,还分享了一些常见的仿真错误及解决方案,如电感值选取不当、二极管模型过于理想等问题。最后,提供了几个有趣的实验案例,如动态改变占空比、突变负载等,以展示闭环控制的优势。 适合人群:具有一定电力电子和MATLAB/Simulink基础的技术人员或学生。 使用场景及目标:适用于希望深入理解Buck-Boost变换器工作原理及其控制策略的研究者和技术爱好者。通过动手实践,掌握开环与闭环控制的区别,学会优化PID参数,提升电源设计能力。 其他说明:文中附有多处代码片段和实用技巧,有助于读者更好地理解和应用所学知识。同时提醒读者注意不同MATLAB版本间的兼容性问题。

    2023年上海市高等学校计算机等级考试.docx

    2023年上海市高等学校计算机等级考试.docx

    能检测死锁,输出相关代码便于排查

    能检测死锁,输出相关代码便于排查

    电子商务物流业务管理教材.pptx

    电子商务物流业务管理教材.pptx

    基于stm32的控制底层

    基于stm32的控制底层

    2023年全国计算机等级考试三级数据库试题.doc

    2023年全国计算机等级考试三级数据库试题.doc

    2023年计算机二级考试操作题真题.doc

    2023年计算机二级考试操作题真题.doc

    2023年自考管理系统中计算机应用试题及答案.doc

    2023年自考管理系统中计算机应用试题及答案.doc

    《基于YOLOv8的社区健身步道夜间照明故障检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    2023年电子科技秋网与网站设计在线作业.doc

    2023年电子科技秋网与网站设计在线作业.doc

    电机控制领域基于脉振高频电压注入的无速度传感器控制系统

    内容概要:本文详细介绍了基于脉振高频电压注入的无速度传感器控制系统。该方法通过向电机定子绕组注入高频电压信号(如2kHz),利用高频响应电流中的转子位置信息进行实时定位。文中展示了具体的代码实现,包括信号注入、带通滤波、正交锁相环以及位置跟踪观测器的设计。此外,讨论了参数整定、抗干扰措施(如伪随机频移键控)和实际调试过程中遇到的问题及其解决方案。该方法适用于低速或零速情况,能够显著提高位置估计的准确性。 适合人群:从事电机控制、自动化控制领域的工程师和技术研究人员。 使用场景及目标:①用于工业伺服系统中,特别是那些对成本敏感或安装空间有限的应用;②解决传统方法在低速或零速情况下无法准确估计转子位置的问题;③提供一种可靠的无速度传感器控制方案,减少硬件成本和维护难度。 其他说明:该方法虽然在低速时表现出色,但在高速时精度有所下降,可以通过混合观测策略进行优化。同时,实际应用中需要注意高频信号带来的额外损耗和参数敏感性问题。

    2023年计算机二级基础知识重点总结.docx

    2023年计算机二级基础知识重点总结.docx

    joblib-1.1.0.tar.gz

    该资源为joblib-1.1.0.tar.gz,欢迎下载使用哦!

    安-225大型运输机实体拼装模型

    An-225大型运输机实体装配模型由225个实体零件基元组成,分为21个子装配模块。 该模型是通过缩放一个基本的8.5英寸x11英寸三视图原理图而开发的。 因此,其精度有所降低。

    使用matlab编程GUI 实现WGS84-CGCS2000坐标转换.zip

    matlab

Global site tag (gtag.js) - Google Analytics