熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java發郵件(email.jar)的方法

2013-11-23 19:24:45  來源: Java核心技術 

  我想在公司每個項目中都會遇到發郵件的問題這兩周我都在公司做發郵件的東西本以為很簡單的東西卻遇到了很多問題現總結到下面

  發郵件我用的sun公司的emailjar和activationjar

  方法

  寫在一起用一個方法

  public boolean SendEmailTest(String ToEmailStrString TitleString ContentString FromEmail) throws AddressException

  {

  //ToEmailStr收件人地址

  //Title郵件標題

  //Content郵件內容

  //FromEmail發件人地址

  FromEmail=;

  // Systemoutprintln(FromEmail);

  boolean fnt = false;

  Properties   props   =   new   Properties();

  Session   sendMailSession;

  Transport   transport;

  sendMailSession   =   SessiongetInstance(props   null);

  propsput(mailsmtphost   );     //   是的IP!

  propsput(mailsmtpauth   true);     //允許smtp校驗

  try

  {

  transport   =   sendMailSessiongetTransport(smtp);

  nnect(chen);    //你在sohu的用戶名密碼

  Message   newMessage   =   new   MimeMessage(sendMailSession);

  //設置mail主題

  String   mail_subject=Title;

  sunmiscBASEEncoder enc = new sunmiscBASEEncoder();

  newMessagesetSubject(=?GB?B?+encencode(mail_subjectgetBytes())+?=);

  // newMessagesetSubject(mail_subject); //在winxp上只要在action中轉成utf

  //設置發信人地址

  //String   strFrom=cn;     //     <

  // strFrom=new   String(strFromgetBytes()_);

  // newMessagesetFrom(new   InternetAddress(strFrom));

  Address address[] = {new InternetAddress(FromEmail)};//改變發件人地址

  newMessageaddFrom(address);

  //設置收件人地址

  newMessagesetRecipient(MessageRecipientTypeTO   new   InternetAddress(ToEmailStr));

  //設置mail正文

  newMessagesetSentDate(new   javautilDate());

  String   mail_text=Content;

  newMessagesetContent(mail_texttext/plain;charset=gb );

  // newMessagesetText(=?GB?B?+encencode(mail_textgetBytes())+?=);

  //newMessagesetText(mail_text);

  newMessagesaveChanges();     //保存發送信息

  transportsendMessage(newMessagenewMessagegetRecipients(MessageRecipientTypeTO));     //發送郵件

  fnt=true;

  transportclose();

  }

  catch(Exception e)

  {

  fnt=false;

  Systemoutprintln(e);

  }

  Systemoutprintln(aaaaaaaaaaaaa);

  return fnt;

  }

  如果想分開哪麼可以寫成

  import javaxmailAuthenticator;

  import javaxmailPasswordAuthentication;

  public class Email_Autherticator extends Authenticator {

  String username = hackboyo;//用戶名

  String password = woyao;//密碼

  public Email_Autherticator() {

  super();

  }

  import javautilDate;

  import javautilProperties;

  import javaxmailAddress;

  import javaxmailAuthenticator;

  import javaxmailMessage;

  import javaxmailSendFailedException;

  import javaxmailSession;

  import javaxmailTransport;

  import javaxmailinternetInternetAddress;

  import javaxmailinternetMimeMessage;

  public class Mail {

  private String host = ;

  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 = ;

  private String mail_from = ;

  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();//進行郵件服務用戶認證

  propsput(mailsmtphost host);

  propsput(mailsmtpauth true);

  Systemoutprintln(props);

  Session session = SessiongetDefaultInstance(propsauth);

  //設置session和郵件服務器進行通訊

  MimeMessage message = new MimeMessage(session);

  messagesetContent(Hellotext/plain);//設置郵件格式

  messagesetSubject(mail_subject);//設置郵件主題

  messagesetText(mail_body);//設置郵件內容

  messagesetHeader(mail_head_name mail_head_value);//設置郵件標題

  messagesetSentDate(new Date());//設置郵件發送時期

  Address address = new InternetAddress(mail_frompersonalName);

  messagesetFrom(address);//設置郵件發送者的地址

  Address toaddress = new InternetAddress(mail_to);//設置郵件接收者的地址

  messageaddRecipient(MessageRecipientTypeTOtoaddress);

  Systemoutprintln(message);

  Transportsend(message);

  Systemoutprintln(Send Mail Ok!);

  } catch (Exception e) {

  eprintStackTrace();

  }

  //return flag;

  }

  }

  public Email_Autherticator(String userString pwd){

  super();

  username = user;

  password = pwd;

  }

  public PasswordAuthentication getPasswordAuthentication(){

  return new PasswordAuthentication(usernamepassword);

  }

  }

  ====================其中遇到的問題以及解決方案=========================

  發郵件收不到的問題

  其中如果發送失敗一般是因為你的密碼用戶名或者是smtp設置錯誤

  smtp:QQ的是   的是   gmail的是

  我覺得一般的郵箱應該都是 smtp

  propsput(mailsmtpauth   true);     //允許smtp校驗

  以前的郵箱這個可以設成false但是現在的一般都不行的都需要smtp校驗

  另外你有時用別的郵箱做代理會發現報錯說使用 pop的錯誤因為現在很多郵箱的 pop 協議默認是關閉的

  如果pop 協議關閉就不能用其做代理我試著注冊過gmail雅虎qq的郵箱都是注冊後幾周後才開通

  而且qq的郵箱是郵箱開通後兩周才能手懂開通pop 協議在個人設置裡有

  關於亂碼的問題特別是移植的問題這個問題困惑了我好幾天

  但最後還是找到了決絕方案

  在winxp下

  只要你的title和comtent在後台發送前有轉碼基本就沒有問題的我的項目頁面是用utf在後台我又做了一下

  轉碼發送時基本是沒又亂碼的

  在Linux下

  我用的是在Linux下用的weblogic在winxp下測試沒問題的但在Linux下會遇到很變態的亂碼大概是因為字符編碼和傳輸編碼(ContentTransferEncoding)的問題最後看到一篇文章()才解決解決方案

  郵件的標題亂碼解決 //設置mail主題

  String   mail_subject=Title;

  sunmiscBASEEncoder enc = new sunmiscBASEEncoder();

  newMessagesetSubject(=?GB?B?+encencode(mail_subjectgetBytes())+?=);

  如果是在winxp上只需要newMessagesetSubject(mail_subject);就可以了

  郵件的正文這樣是不行的解決方案是String   mail_text=Content;

  newMessagesetContent(mail_texttext/plain;charset=gb );

  而在winxp上只需要newMessagesetText(mail_text);就可以了

  剩下的就沒有什麼問題了其余的都是很簡單的問題有時還會遇到你發的郵件有的郵箱可以收到

  可是有的郵箱收不到我們公司的郵件服務器就是這樣的qq郵箱是收不到的但問題我們還不知道

  最後沒辦法我就只有用qq郵箱代理了但是用別的郵箱代理還是有問題的因為我用循環測試時發現

  如果qq郵箱用去循環只有前幾條可以發出去連續幾封後就會有錯估計是qq郵箱的服務器發現異常暫時會把你的郵箱關閉但一會兒就正常了如果是的郵箱我測試時用的但到快五十封郵件時就不行了原因估計是一樣的


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26829.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.