Spring Java Mail发邮件


今天测试了下spring的发邮件的功能 下上代码 在说遇到的问题

首先在applicationContext.xml配置邮件信息

[html]  view plain copy
  1.  <bean id="mailSender"    
  2.  class="org.springframework.mail.javamail.JavaMailSenderImpl">    
  3.        <property name="host">    
  4.            <value>"smtp.163.com"</value>    
  5.        </property>    
  6.        <property name="javaMailProperties">    
  7.            <props>    
  8.                <prop key="mail.smtp.auth">true</prop>    
  9.                <prop key="mail.smtp.starttls.enable">true</prop>   
  10.                <prop key="mail.smtp.timeout">25000</prop>    
  11.            </props>    
  12.        </property>    
  13.        <property name="username">    
  14.            <value>xxxx@163.com</value>    
  15.        </property>    
  16.        <property name="password">    
  17.            <value>xxxxxx</value>    
  18.        </property>    
  19.    </bean>    
  20. <!-- mailbox.dxsport.com.cn, port: 25 -->  
  21. <!-- 文本邮件服务类 -->  
  22. <bean id="mailManager" class="com.wfy.email.MailManager">  
  23.     <property name="mailSender" ref="mailSender" />  
  24.     <property name="textTemplate">  
  25.         <value><![CDATA[ 
  26.         用戶%1$s在%2$tF被修改. 
  27.                 System Administrator. 
  28.         ]]></value>  
  29.     </property>  
  30. </bean>  

mailManager类

[java]  view plain copy
  1. package com.wfy.email;  
  2.   
  3.   
  4. import org.springframework.mail.SimpleMailMessage;  
  5. import org.springframework.mail.javamail.JavaMailSender;  
  6.   
  7. public class MailManager {  
  8.       
  9.     private JavaMailSender mailSender;  
  10.       
  11.     private  String textTemplate;//要发送的文本信息  
  12.       
  13.     private static final String  EMAIL_FROM = "xxxx@163.com";  
  14.   
  15.     public void setMailSender(JavaMailSender mailSender) {  
  16.         this.mailSender = mailSender;  
  17.     }  
  18.       
  19.       
  20.     public void setTextTemplate(String textTemplate) {  
  21.         this.textTemplate = textTemplate;  
  22.     }  
  23.   
  24.     /** 
  25.      * 发送纯文本的用户修改通知邮件. 
  26.      */  
  27.     public void sendNotificationMail(String subject , String  content , String  toEmail) {  
  28.         SimpleMailMessage msg = new SimpleMailMessage();//SimpleMailMessage只能用来发送text文本  
  29.         msg.setFrom(EMAIL_FROM);//此处用QQ测试必须和xml中发送端保持的一致否则报错(但是网上说发送者,这里还可以另起Email别名,不用和xml里的username一致??)   
  30.         msg.setTo(toEmail);//接受者  
  31.         msg.setSubject(subject);//主题  
  32.         msg.setText(content);//正文内容  
  33.         try {  
  34.             mailSender.send(msg);//发送邮件  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39.   
  40. }  

测试代码:

[java]  view plain copy
  1. /** 
  2.      * @param args 
  3.      */  
  4.     public static void main(String[] args) {  
  5.         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");     
  6.         MailManager mailManager=(MailManager) ctx.getBean("mailManager");  
  7.         mailManager.sendNotificationMail("test""测试spring发邮件功能!!!!""11111111@qq.com");  
  8.         System.out.println("已发送!!!");  
  9.   
  10.     }  

遇到问题: 1报了java.lang.NoClassDefFoundError: javax/mail/MessagingException的错误

网上解决方法:

把j2ee1.4中的activation.jar和mail.jar包拷贝到项目中,重新部署,问题解决。

Spring发送邮件实际上使用的是Java Mail 类库,这是JavaEE标准类库中德一部分,Spring只对Java Mail做了封装。不过JDK5以上的环境中,java EE5自带的Java Mail类库是有问题的,因此要使用J2EE1.4中的java Mail.于是添加J2EE1.4中邮件相关的包,即:activation.jar、mail.jar.

                   2。Could not connect to SMTP host: "smtp.163.com ", port: 25;

            暂时不知道怎么回事,ping smtp.163.com 是可以ping通的。网上一查有说关杀毒软件的,关防火墙的,邮箱问题的 我都试了都没管用。我用qq  163 试了下都不行最后用我们公司的邮箱发送成功了 。据说是邮箱为了防止垃圾邮件据说2006年之后申请的163邮箱,都不开通STMP的服务,即无法通过客户端来发送邮件。不知道真假

还有说把McAfee关掉就可以了 ,McAfee不知什么东东没有测试。

                   3.java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误

           网上解决办法:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
当出现以上错误时,恭喜您已经离接收邮件不远了,否则请您解决好所有的异常后再来看这个帖子。

javax.mail和javax.activation这两个包已经在javaEE5当中属于基础包了,就是JDK中自带了已经,但是里面的方法与现在外面的mail.jar和activation.jar有一些出入,所以初学者在直接copy别人代码的时候往往会出现上面的错误。
废话不多说下面是解决方法 
进到

X:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5

这个路径里,可以看到javaee.jar,用rar把这个文件打开,然后进到javax文件夹里,删除mail.jar和activation.jar(我的javaee.jar里,这两个东西是文件夹,总之删掉就OK,不过要注意备份一下)    此问题说按照上面说的没有解决 (我用的MyEclipse 8.5路径不太一样可能删错了吧!)后来 改为J2EE1.4问题解决

      COPY 别人的一些资料

    163邮箱  
  POP3服务器:pop3.163.com  
  SMTP服务器:smtp.163.com  
Yahoo邮箱  
   POP3服务器:pop.mail.yahoo.com.cn  
   SMTP服务器:smtp.mail.yahoo.com  
搜狐邮箱  
  POP3服务器:pop3.sohu.com   
  SMTP服务器:smtp.sohu.com  
新浪邮箱  
  POP3服务器:pop.sina.com.cn 或pop3.sina.com.cn   
  SMTP服务器:smtp.sina.com.cn  
     请选择smtp服务器要求身份验证选项  
139邮箱  
  POP3服务器:pop3.139.com   
  SMTP服务器:smtp.139.com  
Gmail邮箱  
    POP3服务器:pop.gmail.com  端口:995  开启ssl  
    SMTP服务器:smtp.gmail.com  端口:465 或者587  开启ssl  
    帐号即用户名,密码相同,邮件地址为username@gmail.com  
QQ邮箱  
  POP3服务器:pop.qq.com   
  SMTP服务器:smtp.qq.com  
   SMTP服务器需要身份验证

java.lang.ClassNotFoundException: javax.mail.MessagingException
tomcat没有识别到JavaMail的API类的原因,现在不庆幸当时自带的方便了。本来以为所有的API都可以在javaee.jar中找到所以把这个jar包拷贝到WEB-INF下的lib目录下,结果不行。拷贝到tomcat的lib目录中,报错如下
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath ()Ljava/lang/String;
其实是jar冲突问题,所以把tomcat目录下的lib目录中刚拷贝的javaee.jar删除,可以启动服务器。但是还是没有解决tomcat无法找到JavaMail API的问题,只有去下载了一个mail.jar放到WEB-INF下的lib目录中,结果就可以了

      追加 又查了一下用QQ的邮箱设置下可以发送了     设置步骤如下  :

    1.进入邮箱 -->设置-->账户-->pop3/SMTP服务 勾选上(还有个不知道选哪个具体没测试我都选上了)然后保存OK;

   2.application.xml中 的host属性设置为smtp.qq.com      另外注意

[java]  view plain copy
  1. msg.setFrom(EMAIL_FROM);//要和xml文件中指定到qq邮箱一样 否则发不出去汇报如下错  
  2. //javax.mail.MessagingException: 501 mail from address must be same as authorization user  

  经过如上修改决定可以发送邮件(目前只是文本 也可以发送附件和图片)不过貌似发送的邮件数量有限制。

  源码下载地址:download.csdn.net/detail/nn955/4655282

发送html格式并带有附件的邮件:

[java]  view plain copy
  1. public class SendMail {  
  2.  public ApplicationContext ctx = null;  
  3.  public SendMail() {  
  4.   //获取上下文  
  5.   ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
  6.  }  
  7.  public void send() {  
  8.   //获取JavaMailSender bean  
  9.   JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");  
  10.   JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();  
  11.   MimeMessage mailMessage = senderImpl.createMimeMessage();  
  12.   //设置utf-8或GBK编码,否则邮件会有乱码  
  13.   MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true,"utf-8");  
  14.   try {  
  15.    messageHelper.setTo(email.getEmail());//接受者     
  16.    messageHelper.setFrom("xxx@163.com");//发送者  
  17.    messageHelper.setSubject("测试邮件");//主题  
  18.    //邮件内容,注意加参数true  
  19.    messageHelper.setText("<html><head></head><body><h1>hello!!chao.wang</h1></body></html>",true);  
  20.    //附件内容  
  21.    messageHelper.addInline("a"new File("E:/xiezi.jpg"));  
  22.    messageHelper.addInline("b"new File("E:/logo.png"));   
  23.    File file=new File("E:/测试中文文件.rar");    
  24.    // 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题  
  25.    messageHelper.addAttachment(MimeUtility.encodeWord(file.getName()), file);   
  26.    sender.send(mailMessage);  
  27.   } catch (Exception e) {  
  28.    e.printStackTrace();  
  29.   }  
  30.  }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值