`

javaMail第一个测试

阅读更多
今天在研究javamail发信的过程中,出现了一些小问题,现总结如下,以免后来者走些不必要的弯路,先把完整的能够正常运行的代码示例粘贴如下:
发邮件源代码:
package com.hyq.test;

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class MailExample {

  public static void main (String args[]) throws Exception {
   
    String host = "smtp.163.com";   //发件人使用发邮件的电子信箱服务器
    String from = "你自己的电子信箱";    //发邮件的出发地(发件人的信箱)
    String to = "收件人信箱";   //发邮件的目的地(收件人信箱)

    // Get system properties
    Properties props = System.getProperties();

    // Setup mail server
    props.put("mail.smtp.host", host);

    // Get session
    props.put("mail.smtp.auth", "true"); //这样才能通过验证

    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");
    Session session = Session.getDefaultInstance(props, myauth);

//    session.setDebug(true);

    // Define message
    MimeMessage message = new MimeMessage(session);
   

    // Set the from address
    message.setFrom(new InternetAddress(from));

    // Set the to address
    message.addRecipient(Message.RecipientType.TO,
      new InternetAddress(to));

    // Set the subject
    message.setSubject("测试程序!");

    // Set the content
    message.setText("这是用java写的发送电子邮件的测试程序!");

    message.saveChanges();

      Transport.send(message);
   
  }
}

校验发信人权限的方法
package com.hyq.test;

import javax.mail.PasswordAuthentication;

class MyAuthenticator
      extends javax.mail.Authenticator {
    private String strUser;
    private String strPwd;
    public MyAuthenticator(String user, String password) {
      this.strUser = user;
      this.strPwd = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(strUser, strPwd);
    }
  }


注意:上面的事例仅为使用163信箱时发送电子邮件的方法,因为使用的host为:smtp.163.com,如源代码中:String host = "smtp.163.com";   //发件人使用发邮件的电子信箱服务器,如果使用其它的电子邮件发送,就必须在其邮件服务器上查找相应的电子邮件服务器,例如搜狐就要使用smtp.sohu.com,具体情况具体对待,都可以从所使用的邮件服务器上获得的。如果没有使用host ,也就是说,没有进行props.put("mail.smtp.host", host);设置,那么就会抛javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;的异常。当然了,如果你没有正确配置,这个异常仍然会被抛出的。

有些邮件服务系统是不需要验证发件人的授权的,所以可以很简单的使用
    Session session = Session.getDefaultInstance(props, null);
             而不必使用
    props.put("mail.smtp.auth", "true");
    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");
    Session session = Session.getDefaultInstance(props, myauth);

就可以发送电子邮件了,这个多为一些企事业单位的内部电子信箱系统。
但是对于很多门户网站上的电邮系统,如:163,sohu,yahoo等等,如果仍然简单的这样使用就会抛

com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxuAyCAfmnZE8BwtIA==.32705S2


at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

at javax.mail.Transport.send0(Transport.java:169)

at javax.mail.Transport.send(Transport.java:98)

这样的异常,要求你必须进行授权校验,它的目的就是阻止他人任意乱发邮件,也算是为了减少垃圾邮件的出现吧。这时候,我们就要使用
    props.put("mail.smtp.auth", "true");
    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");
    Session session = Session.getDefaultInstance(props, myauth);

这里还有一个特别注意的事情:在你使用Session.getDefaultInstance时,一定要将    props.put("mail.smtp.auth", "true"); 置为true,它默认的是false,如果你没有做这一步,虽然你使用了Session.getDefaultInstance(props, myauth);,你自己也确实    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");但是它仍然会抛出
com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxJA2SBrm3ZEFv0gIA==.40815S2


at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

at javax.mail.Transport.send0(Transport.java:169)

at javax.mail.Transport.send(Transport.java:98)
这样的异常。我就在这一步费了好长时间,后来才发现了这个问题,很是郁闷。不过还好,总算解决了。

其实上面的做法只是比较简单的一种,也有很多其它的写法,如:
Properties props = System.getProperties();可以使用
Properties props = new Properties();来代替。


Transport.send(message);可以使用下面的代码来代替
      String username = "你的电子信箱用户名";
      String password = "你的电子信箱密码";
      message.saveChanges(); //    implicit with send()
      Transport transport = session.getTransport("smtp");
      transport.connect("mail.htf.com.cn", username, password);
      transport.sendMessage(message, message.getAllRecipients());
      transport.close();
这种方法在同时发送多封电子邮件时比较有用。

还有一些具体的相关概念,可以查看相关的官方文档,在我查询资料时,发现了一篇文章写得相当仔细,可以加以参考:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html

另附上使用org.apache.commons.mail进行发电子邮件的示例:
import org.apache.commons.mail.SimpleEmail;
import org.apache.commons.mail.*;

public class TestCommon {
  public TestCommon() {
  }
  public static void main(String[] args){
    SimpleEmail email = new SimpleEmail();
    email.setHostName("smtp.163.com");//设置使用发电子邮件的邮件服务器
    try {
      email.addTo("收件人信箱");
      email.setAuthentication("发件人信箱","发件人信箱密码");
      email.setFrom("发件人信箱");
      email.setSubject("Test apache.commons.mail message");
      email.setMsg("This is a simple test of commons-email");
      email.send();
    }
    catch (EmailException ex) {
      ex.printStackTrace();
    }
  }
}





分享到:
评论

相关推荐

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    从Java走向Java+EE+.rar

    第1章 Java EE的基本知识 1 1.1 Java EE的出现及其特点 1 1.2 Java EE的分层模型和平台组成 4 1.2.1 Java EE的分层模型 4 1.2.2 Java EE的结构变形 5 1.2.3 Java EE平台的组成 7 1.3 Java EE参与人员的...

    《精通Spring2.X企业应用开发详解》随书源码1-15章

    图书简介 本书分为6大部分,其中第一部分为Spring概述性知识;第二部分讲解了Spring框架核心技术的内容;第三部分涵盖了在Spring中使用各种数据访问技术的内容;第四部分讲解业务层各种技术的知识;第五部分是...

    《精通Spring2.X企业应用开发详解》20-23

    图书简介 本书分为6大部分,其中第一部分为Spring概述性知识;第二部分讲解了Spring框架核心技术的内容;第三部分涵盖了在Spring中使用各种数据访问技术的内容;第四部分讲解业务层各种技术的知识;第五部分是...

    《精通Spring2.X企业应用开发详解》16-19章

    图书简介 本书分为6大部分,其中第一部分为Spring概述性知识;第二部分讲解了Spring框架核心技术的内容;第三部分涵盖了在Spring中使用各种数据访问技术的内容;第四部分讲解业务层各种技术的知识;第五部分是...

    精通Java网络编程光盘资料

    提供了本书第7章的一个代理服务器的实现实例的源程序; \char7\7-3\ 聊天程序的服务器端实现 提供了本书第7章的聊天程序的服务器端实现实例的源程序; \char9\9-1\ 一个邮件事务的过程 提供了本书第9章的...

    Spring Boot邮件发送(powernode document)(源代码)

    1.概述 2.最佳实践 2.1创建项目引入依赖(mail) 2.2修改yml配置文件 2.3编写测试发送邮件 2.4 测试结果 2.4.1 发送基本内容 2.4.2 发送复杂内容 我们使用java程序发送邮件,属于使用第三方客户端发送邮件 使用第三方...

    tomcat6.6+javamial

    第一章 绪论 1 1.1本系统研究意义及国内外发展概况 1 1.2本系统的目的、内容、要求 2 第二章 开发环境与技术的介绍 4 2.1 开发环境 4 2.1.1 硬件环境 4 2.1.2 软件环境 4 2.1.3 环境配置 4 2.2 技术的介绍 5...

    JSP网站开发典型模块与实例精讲

    本书的内容分为三部分:第一部分介绍了JSP的运行原理,开发运行环境的搭建及数据库连接和调试等JSP开发必备知识;第二部分介绍了构成网络系统的几个经典模块等。 目录: 第1章 JSP开发前奏  1.1 JSP基于服务器...

    Java数据库编程宝典1

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典2

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典4

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典3

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    网上商城需求报告

    第一步:数据库设计(详情见dangdang.sql) d_book:图书信息表 d_product:产品信息表(各种类型产品所具有的共同信息项) d_category:图书栏目(分类)表 d_category_product:栏目与产品对应关系表 d_order:订单...

    Java编程艺术 PDF

    第1章 Java精髓 1 1.1 简单数据类型和对象:完美的平衡 2 1.2 通过垃圾回收实现内存管理 3 1.3 完美的简单多线程模型 3 1.4 完全集成的异常机制 4 1.5 对多态性支持的改进 5 1.6 通过字节码保证可移植性和安全性 5 ...

    java 编程艺术

    第1章 Java精髓 1 1.1 简单数据类型和对象:完美的平衡 2 1.2 通过垃圾回收实现内存管理 3 1.3 完美的简单多线程模型 3 1.4 完全集成的异常机制 4 1.5 对多态性支持的改进 5 1.6 通过字节码保证可移植性和安全...

    dangdang和smartstruts2.rar

    第一步:数据库设计(详情见dangdang.sql) d_book:图书信息表 d_product:产品信息表(各种类型产品所具有的共同信息项) d_category:图书栏目(分类)表 d_category_product:栏目与产品对应关系表 d_order:订单...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

Global site tag (gtag.js) - Google Analytics