mailtoの文字化け

mailto でメーラを起動して件名と本文をプリセットさせてみる。


<a href="mailto:ymotoba@gmail.com?subject=けんめいです&cc=hogehogehoge@hoge.com&body=本文です">TEST</a>


これは問題なし。
ダブルクォーテーションとかどーすんだって話なのでgoogle先生に聞いてみると・・・
URLエンコードすれば大丈夫のようだ。

http://shimax.cocolog-nifty.com/search/2007/02/vistawindows_ma_c78c.html

が参考させて頂いたURL。
でもURLエンコードするとメーラによっては文字化けする模様。
上記URLでの結論にもあるが、プリセットでどんなメーラでも文字化けしないようにするのは無理なようです。
ってことなので、Javaでメールクラスを公開してみます。
結局これでも無理な気がするなー。おいらのPCのThunderBirdでしか試してないから問題あるのかどうかわからん・・・。まぁ、今回のところはこれでいいや。
 
Java Mail API が必要なので、以下からDLして下さい。m(__)m
http://java.sun.com/products/javamail/



import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* メールユーティリティクラス
*/
public class Mail {

/** メール文字コード */
private static final String SEND_MAIL_CHARSET = "iso-2022-jp";

/** SMTPサーバ */
private String smtpserver;

/** 送信元メールアドレス */
private String mailaddrfrom;

/** 送信者の名前 */
private String namefrom;

/** 送信先メールアドレス */
private String mailaddrto;

/** メールタイトル */
private String subject;

/** 本文 */
private String body;

/**
*


* メール送信のパラメータチェック
*


*
* @return true or false
*/
private boolean validateSendParam() {

if (this.smtpserver == null || this.mailaddrfrom == null
|| this.mailaddrto == null || this.subject == null
|| this.body == null) {

return false;
}

if (this.smtpserver.isEmpty() || this.mailaddrfrom.isEmpty()
|| this.mailaddrto.isEmpty() || this.subject.isEmpty()
|| this.body.isEmpty()) {

return false;
}

return true;
}

/**
*


* メールを送信します

* SMTPサーバの情報、送信元メールアドレス等々送信に必要な情報は

* 本メソッドのクラス変数に設定して下さい

* クラス変数に必要な情報が設定されていない場合、IllegalArgumentExceptionが発生します
*


*
* @throws MessagingException MessagingException
*/
public void send() throws MessagingException {

// パラメータチェック
if (!validateSendParam()) {

throw new IllegalArgumentException();
}

Session session = Session.getDefaultInstance(new Properties(), null);
session.setDebug(true);
MimeMessage mimeMessage = new MimeMessage(session);

// 送信元メールアドレスと送信者名を指定
try {

mimeMessage.setFrom(new InternetAddress(this.mailaddrfrom,
this.namefrom, SEND_MAIL_CHARSET));

} catch (UnsupportedEncodingException e) {

// エンコーディング固定なので発生しません
// 念の為エラーログだけ出力しておきます
System.out.println(e.getMessage());
}

// 送信先メールアドレスを指定
mimeMessage.setRecipients(Message.RecipientType.TO, this.mailaddrto);

// メールのタイトルを指定
mimeMessage.setSubject(this.subject, SEND_MAIL_CHARSET);

// メール本文を設定
mimeMessage.setText(this.body + "\n", SEND_MAIL_CHARSET);

// メールの形式を指定
mimeMessage.setHeader("Content-Type", "text/plain; charset=\""
+ SEND_MAIL_CHARSET + "\"");
mimeMessage.setHeader("Content-Transfer-Encoding", "7bit");

// 送信日付を指定
mimeMessage.setSentDate(new Date());

// TODO
// とりあえずユーザ、パスワードは未設
Transport transport = session.getTransport("smtp");
transport.connect(this.smtpserver, "", "");
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
transport.close();
}

public String getSmtpserver() {
return smtpserver;
}

public void setSmtpserver(String smtpserver) {
this.smtpserver = smtpserver;
}

public String getMailaddrfrom() {
return mailaddrfrom;
}

public void setMailaddrfrom(String mailaddrfrom) {
this.mailaddrfrom = mailaddrfrom;
}

public String getNamefrom() {
return namefrom;
}

public void setNamefrom(String namefrom) {
this.namefrom = namefrom;
}

public String getMailaddrto() {
return mailaddrto;
}

public void setMailaddrto(String mailaddrto) {
this.mailaddrto = mailaddrto;
}

public String getSubject() {
return subject;
}

public void setSubject(String subject) {
this.subject = subject;
}

public String getBody() {
return body;
}

public void setBody(String body) {
this.body = body;
}
}

0 コメント: