java写发邮件(email.jar)的方法

我想在公司每个项目中都会遇到发邮件的问题,这两周我都在公司做发邮件的东西,本以为很简单的东西,却遇到了很多问题,现总结到下面。
     发邮件我用的sun公司的email.jar和activation.jar。
     方法:
         1.写在一起用一个方法:
        public boolean SendEmailTest(String ToEmailStr,String Title,String Content,String FromEmail) throws AddressException
    {
  //ToEmailStr收件人地址
  //Title邮件标题
  //Content邮件内容
  //FromEmail发件人地址
   FromEmail="240195798@qq.com";
//  System.out.println(FromEmail);
   boolean fnt = false;
   Properties   props   =   new   Properties();  
         Session   sendMailSession;  
         Transport   transport;  
         sendMailSession   =   Session.getInstance(props,   null);  
         props.put("mail.smtp.host",   "smtp.qq.com");     //"202.106.187.180"   是“smtp.sohu.com”的IP!  
         props.put("mail.smtp.auth",   "true");     //允许smtp校验  
        
         try
         {
          transport   =   sendMailSession.getTransport("smtp");  
          transport.connect("smtp.qq.com","240195798","20070424chen");    //你在sohu的用户名,密码...........  
          Message   newMessage   =   new   MimeMessage(sendMailSession);  
    
          //设置mail主题  
          String   mail_subject=Title;  
          
          sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();  
          newMessage.setSubject("=?GB2312?B?"+enc.encode(mail_subject.getBytes())+"?=");
         // newMessage.setSubject(mail_subject);  //在winxp上只要在action中转成utf-8    
    
                        //设置发信人地址  
        //String   strFrom="service@jrsoft.com.cn";     //     <--------------  
       // strFrom=new   String(strFrom.getBytes(),"8859_1");  
      //  newMessage.setFrom(new   InternetAddress(strFrom));  
        Address address[] = {new InternetAddress(FromEmail)};//改变发件人地址
        newMessage.addFrom(address);
        //设置收件人地址  
        newMessage.setRecipient(Message.RecipientType.TO,   new   InternetAddress(ToEmailStr));  
    
                        //设置mail正文  
        newMessage.setSentDate(new   java.util.Date());  
        String   mail_text=Content;
                      
        newMessage.setContent(mail_text,"text/plain;charset=gb2312 ");
       // newMessage.setText("=?GB2312?B?"+enc.encode(mail_text.getBytes())+"?=");
       //newMessage.setText(mail_text);  
    
                        newMessage.saveChanges();     //保存发送信息  
        transport.sendMessage(newMessage,newMessage.getRecipients(Message.RecipientType.TO));     //发送邮件  
   fnt=true;
        transport.close();  
         }
         catch(Exception e)
         {
   fnt=false;
          System.out.println(e);
         }
         System.out.println("aaaaaaaaaaaaa");
  return fnt;
    }
如果想分开哪么可以写成

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class Email_Autherticator extends Authenticator {
String username = "hackboyo";//用户名

String password = "woyao025";//密码
public Email_Autherticator() {
  super();
}
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.SendFailedException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Mail {
private String host = "smtp.126.com";

private String mail_head_name = "this is head of this mail";

private String mail_head_value = "this is head of this mail";

private String mail_to = "254173774@qq.com";

private String mail_from = "hackboyo@126.com";

private String mail_subject = "this is the subject of this test mail";

private String mail_body = "this is mail_body of this test mail";

private String personalName = "我的邮件";
public void sendMail() throws SendFailedException{
  try {
   Properties props = new Properties();//获取系统环境
   Authenticator auth = new Email_Autherticator();//进行邮件服务用户认证
   props.put("mail.smtp.host", host);
   props.put("mail.smtp.auth", "true");
   System.out.println(props);
   Session session = Session.getDefaultInstance(props,auth);
   //设置session,和邮件服务器进行通讯
   MimeMessage message = new MimeMessage(session);
   message.setContent("Hello","text/plain");//设置邮件格式
   message.setSubject(mail_subject);//设置邮件主题
   message.setText(mail_body);//设置邮件内容
   message.setHeader(mail_head_name, mail_head_value);//设置邮件标题
   message.setSentDate(new Date());//设置邮件发送时期
   Address address = new InternetAddress(mail_from,personalName);
   message.setFrom(address);//设置邮件发送者的地址
   Address toaddress = new InternetAddress(mail_to);//设置邮件接收者的地址
   message.addRecipient(Message.RecipientType.TO,toaddress);
   System.out.println(message);
   Transport.send(message);
   System.out.println("Send Mail Ok!");
  } catch (Exception e) {
   e.printStackTrace();
  }
  //return flag;
}
}
public Email_Autherticator(String user,String pwd){
  super();
  username = user;
  password = pwd;
}
public PasswordAuthentication getPasswordAuthentication(){
  return new PasswordAuthentication(username,password);
}
}
====================其中遇到的问题以及解决方案=========================
1.发邮件收不到的问题
  其中如果发送失败,一般是因为你的密码,用户名或者是smtp设置错误
    smtp:QQ的是smtp.qq.com   163的是smtp.163.com   gmail的是smtp.gmail.com
   我觉得一般的邮箱应该都是 smtp.邮箱.com
2.props.put("mail.smtp.auth",   "true");     //允许smtp校验  
    以前的邮箱这个可以设成false但是现在的一般都不行的,都需要smtp校验
3.另外你有时用别的邮箱做代理会发现报错说使用 pop3的错误,因为现在很多邮箱的 pop3 协议默认是关闭的
如果pop3 协议关闭就不能用其做代理,我试着注册过163,gmail,雅虎,qq的邮箱,都是注册后几周后才开通,
而且qq的邮箱是邮箱开通后两周才能手懂开通pop3 协议,在个人设置里有
4.关于乱码的问题,特别是移植的问题,这个问题困惑了我好几天
  但最后还是找到了决绝方案
  在winxp下
    只要你的title和comtent在后台发送前有转码基本就没有问题的,我的项目页面是用utf-8,在后台我又做了一下
转码,发送时基本是没又乱码的
  在Linux下,
     我用的是在Linux下用的weblogic,在winxp下测试没问题的,但在Linux下会遇到很变态的乱码,大概是因为字符编码和传输编码(Content-Transfer-Encoding)的问题,最后看到一篇文章(http://www.javaresearch.org/html/article/64874.htm)才解决:解决方案
     邮件的标题乱码解决: //设置mail主题  
          String   mail_subject=Title;  
          
          sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();  
          newMessage.setSubject("=?GB2312?B?"+enc.encode(mail_subject.getBytes())+"?=");
       如果是在winxp上只需要newMessage.setSubject(mail_subject);就可以了,
     邮件的正文这样是不行的,解决方案是:String   mail_text=Content;
                             newMessage.setContent(mail_text,"text/plain;charset=gb2312 ");
              而在winxp上只需要newMessage.setText(mail_text);就可以了
  剩下的就没有什么问题了,其余的都是很简单的问题,有时还会遇到,你发的邮件有的邮箱可以收到
可是有的邮箱收不到,我们公司的邮件服务器就是这样的,qq邮箱是收不到的,但问题我们还不知道
最后没办法,我就只有用qq邮箱代理了,但是用别的邮箱代理还是有问题的,因为我用循环测试时发现
如果qq邮箱用10去循环只有前几条可以发出去,连续几封后就会有错,估计是qq邮箱的服务器发现异常暂时会
把你的邮箱关闭,但一会儿就正常了,如果是126的邮箱,我测试时用的100,但到快五十封邮件时就不行了
,原因估计是一样的。
       by  cju。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值