struts 2統合javamailでメールを送る例の詳細
9979 ワード
一、コードプレビューはこの二日間struts 2でメールを送ります.以前のプロジェクトはspringまで使っていましたが、springで提供されたメールサポート類はこの機能を完成するのに便利です.でも今はstruts 2だけを使うと、一連の問題にぶつかります.
まず自分でダウンロードしたmail.jarとactivation.jarをクラスパスに入れてください.
私はjavaee 5を使っています.jdk 1.6は現地で走ると、Class NotFoundのExceptionが現れますが、これらはmail.jarの中にもあります.この原因は私達自身が増加したjarカバンの中の類とjavaee 5の中の衝突のためです.私のオススメの解決方法はjavaee 5の中のactivationカバンとmailカバンを削除することです.
作り方は以下の通りです
eclipse引用のjavaee 5包を見つけて、rarソフトで開けて、activationとmailのカバンを見つけて、保存を削除してもいいです.(ガイドで参照カバンを更新してください)
2.2 javax.mail.MessagingException:501 Syntx:HELO hostname
ローカルテストに合格した後、linuxサーバーに配備しましたが、javax.mail.MessagingExceptionに会いました.501 Syntax:HELO hostname異常、googleが発見したのは以下の理由です.
Javamailは地元のhostnameを抽出する時digでhostnameを変えてipでメールを送ります.
hostname対応のipアドレスのため、linuxが解析できません.(windowsであればこの問題はありません.windowsはnetbiosプロトコルを利用してこのホストのipアドレスを取得します.).本機hostnameのipに行くと、javamailはip送信を呼び出すことができなくなります.Postfixはこのようなメールを受け取ると配達を拒否し、501のエラーが発生します.
オンラインでサーバーのhostsファイルを修正して解決できると言いましたが、直接コードの中で解決できます.つまりsetSmtpHost()方法で、次の行を追加します.
まず自分でダウンロードしたmail.jarとactivation.jarをクラスパスに入れてください.
package com.nerve.cloudoffice.common.util;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
public class EMailSender {
/**
*
*/
private static final long serialVersionUID = 1L;
private MimeMessage mimeMsg; // MIME
private Session session; //
private Properties props; //
private boolean needAuth = false; // smtp
private String username = ""; // smtp
private String password = "";
private Multipart mp; // Multipart , , ,
private String log;
public EMailSender() {
}
public EMailSender(String smtp) {
setSmtpHost(smtp);
createMimeMessage();
}
public void setSmtpHost(String hostName) {
System.out.println(" :mail.smtp.host = " + hostName);
if (props == null)
props = System.getProperties(); //
props.put("mail.smtp.host", hostName); // SMTP
props.put("mail.smtp.localhost", "localHostAdress");
}
public boolean createMimeMessage() {
try {
System.out.println(" !");
session = Session.getDefaultInstance(props, null); //
} catch (Exception e) {
log = " !" + e.toString();
System.err.println(log);
return false;
}
try {
mimeMsg = new MimeMessage(session); // MIME
mp = new MimeMultipart(); // mp multipart
// Multipart is a container that holds multiple body parts.
return true;
} catch (Exception e) {
log = " MIME !" + e;
System.err.println(log);
return false;
}
}
public void setNeedAuth(boolean need) {
System.out.println(" smtp :mail.smtp.auth = " + need);
if (props == null)
props = System.getProperties();
if (need) {
props.put("mail.smtp.auth", "true");
} else {
props.put("mail.smtp.auth", "false");
}
}
public void setNamePass(String name, String pass) {
System.out.println(" ");
username = name;
password = pass;
}
public boolean setSubject(String mailSubject) {
System.out.println(" !");
try {
mimeMsg.setSubject(MimeUtility.encodeText(mailSubject,"utf-8","B"));
return true;
} catch (Exception e) {
log = " !"+e;
System.err.println(log);
return false;
}
}
public boolean setBody(String mailBody) {
try {
System.out.println(" ");
BodyPart bp = new MimeBodyPart();
//
bp.setContent(
""
+ mailBody, "text/html;charset=utf-8");
mp.addBodyPart(bp);
return true;
} catch (Exception e) {
log = " !" + e;
System.err.println(log);
return false;
}
}
public boolean setFiles(List files){
try{
for(String s:files){
MimeBodyPart mbp=new MimeBodyPart();
FileDataSource fds=new FileDataSource(s); //
mbp.setDataHandler(new DataHandler(fds)); // BodyPart
mbp.setFileName(fds.getName()); // BodyPart
mp.addBodyPart(mbp);
}
return true;
}catch(Exception e){
log = " :"+e;
e.printStackTrace();
return false;
}
}
public boolean addFile(String path, String name){
try{
MimeBodyPart mbp=new MimeBodyPart();
FileDataSource fds=new FileDataSource(path); //
mbp.setDataHandler(new DataHandler(fds)); // BodyPart
mbp.setFileName(MimeUtility.encodeText(name,"utf-8","B"));
mp.addBodyPart(mbp);
return true;
}catch(Exception e){
log = " :"+e;
e.printStackTrace();
return false;
}
}
public boolean setFrom(String from) {
System.out.println(" !");
try {
mimeMsg.setFrom(new InternetAddress(from)); //
return true;
} catch (Exception e) {
log = " :"+e;
return false;
}
}
public boolean setTo(String to) {
System.out.println(" ");
if (to == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
.parse(to));
return true;
} catch (Exception e) {
return false;
}
}
public boolean setCopyTo(String copyto) {
if (copyto == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.CC,
(Address[]) InternetAddress.parse(copyto));
return true;
} catch (Exception e) {
return false;
}
}
public boolean sendout() {
try {
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println(" ....");
Session mailSession = Session.getInstance(props, null);
Transport transport = mailSession.getTransport("smtp");
transport.connect((String) props.get("mail.smtp.host"), username,
password);
transport.sendMessage(mimeMsg, mimeMsg
.getRecipients(Message.RecipientType.TO));
// transport.send(mimeMsg);
System.out.println(" !");
transport.close();
return true;
} catch (Exception e) {
log = " !" + e;
System.err.println(log);
return false;
}
}
public String getLog(){
return log;
}
}
二、問題のまとめ2.1 ローカル実行時報エラー私はjavaee 5を使っています.jdk 1.6は現地で走ると、Class NotFoundのExceptionが現れますが、これらはmail.jarの中にもあります.この原因は私達自身が増加したjarカバンの中の類とjavaee 5の中の衝突のためです.私のオススメの解決方法はjavaee 5の中のactivationカバンとmailカバンを削除することです.
作り方は以下の通りです
eclipse引用のjavaee 5包を見つけて、rarソフトで開けて、activationとmailのカバンを見つけて、保存を削除してもいいです.(ガイドで参照カバンを更新してください)
2.2 javax.mail.MessagingException:501 Syntx:HELO hostname
ローカルテストに合格した後、linuxサーバーに配備しましたが、javax.mail.MessagingExceptionに会いました.501 Syntax:HELO hostname異常、googleが発見したのは以下の理由です.
Javamailは地元のhostnameを抽出する時digでhostnameを変えてipでメールを送ります.
hostname対応のipアドレスのため、linuxが解析できません.(windowsであればこの問題はありません.windowsはnetbiosプロトコルを利用してこのホストのipアドレスを取得します.).本機hostnameのipに行くと、javamailはip送信を呼び出すことができなくなります.Postfixはこのようなメールを受け取ると配達を拒否し、501のエラーが発生します.
オンラインでサーバーのhostsファイルを修正して解決できると言いましたが、直接コードの中で解決できます.つまりsetSmtpHost()方法で、次の行を追加します.
props.put("mail.smtp.localhost", "localHostAdress");
2.3添付ファイルの中国語の名前が文字化けしていますが、添付ファイルに中国語の名前があれば、直接set Name()は文字化けします.以下の方法で解決できます.
mbp.setFileName(MimeUtility.encodeText(name,"utf-8","B"));