Java项目涉及收发邮件

来源:互联网 发布:王珮瑜 冯蕴 知乎 编辑:程序博客网 时间:2024/05/21 09:53

 我想在公司每个项目中都会遇到发邮件的问题,这两周我都在公司做发邮件的东西,本以为很简单的东西,却遇到了很多问题,现总结到下面。

  发邮件我用的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,但到快五十封邮件时就不行了,原因估计是一样的。

原创粉丝点击