JavaサーブレットでのGmail送信プログラム
Javaサーブレットでメールを送信したいと思い、こちら(http://www.utilz.jp/wiki/JavaMail1)のサイトで公開されているソースコードを利用してプログラムを作成したのですがエラーが発生してしまいました。
公開されているプログラムだけで実行した際には動いたので動作環境に問題は無いと思います。
public class send_Gmail extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, MessagingException
{
send(
"*********", // gmail アカウント
"*********", // gmail パスワード
"*********", // 送信先
"subject", // サブジェクト
"body"); // 本文
// コンテンツタイプの設定
response.setContentType("text/html;charset=Windows-31J");
// 出力のためのPrintWriterオブジェクトを取得
PrintWriter out = response.getWriter();
// 一連のコンテンツを出力
out.println("<html><head>");
out.println("<title>スクリプトレット</title>");
out.println("</head><body>");
out.println("メールを送信しました<br />");
out.println("</body></html>");
}
private static final Properties PROP;
static {
PROP = new Properties();
PROP.put("mail.smtp.host", "smtp.gmail.com");
PROP.put("mail.smtp.port", "587");
PROP.put("mail.smtp.auth", "true");
PROP.put("mail.smtp.starttls.enable", "true");
}
public void send(
String user,
String password,
String to,
String subject,
String body) throws MessagingException {
Transport transport = null;
try {
Session sess = Session.getInstance(PROP);
MimeMessage mm = new MimeMessage(sess);
mm.setFrom(new InternetAddress(user));
mm.setSubject(subject);
mm.setRecipient(
Message.RecipientType.TO, new InternetAddress(to));
mm.setContent(body, "text/plain; charset=iso-2022-jp");
mm.setHeader("Content-Transfer-Encoding", "7bit");
transport = sess.getTransport("smtp");
transport.connect(user, password);
transport.sendMessage(mm, mm.getAllRecipients());
}
finally {
if (transport != null) {
transport.close();
}
}
}
コンパイルすると
send_Gmail.java:28: Gmail_test.send_Gmail のdoPost(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) は javax.servlet.http.HttpServlet の doPost(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) をオーバーライドできません。オーバーライドされたメソッドは javax.mail.MessagingException をスローしません。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
というエラーが出てしまいます。throwsにMessagingExceptionを記述しないと、今度は記述しろというエラーが出てしまい困っています…解決策を教えて下さい。よろしくお願いします。
補足
ありがとうございます.ですが,ちょっと私の使いかたが悪いのかもしれませんが Session session = Session.getInstance( props, new myAuth() ); の部分で型が違うとエラーが出てしまいます.ただ,デバッグモードでみてみると,connectは成功しているようですが,以下のように出力されます. DEBUG: setDebug: JavaMail version 1.3.3 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "smtp.***.***.jp", port 25, isSSL false 220 ***.***.***.**.jp ESMTP DEBUG SMTP: connected to host "smtp.***.***.jp", port: 25 EHLO KATANA2 250-***.***.***.***.jp 250-AUTH LOGIN PLAIN 250-PIPELINING 250 8BITMIME DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" DEBUG SMTP: Found extension "PIPELINING", arg "" DEBUG SMTP: Found extension "8BITMIME", arg "" DEBUG SMTP: Attempt to authenticate AUTH LOGIN 334 %%%%%%%%%%% ********* 334 %%%%%%%%%%% ********* 535 authorization failed (#5.7.0) javax.mail.AuthenticationFailedException また参考までに,現在自分の使っているプログラムを載せます.どうぞよろしくお願いいたします. ■呼び出し側■ import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class MailSendFile { private String smtp; private String sendfrom; private String sendto; private String name; private String title; private String filename; private String message; private boolean RET; MailSendFile(){} MailSendFile(String _smtp, String _sendfrom, String _sendto, String _name, String _title, String _filename, String _message){ smtp = _smtp; sendfrom = _sendfrom; sendto = _sendto; name = _name; title = _title; filename = _filename; message = _message; } public boolean sendFile(String user, String pass) throws MailSendFileException{ try { Properties props = new Properties(); props.put("mail.smtp.host",smtp); props.put("mail.smtp.auth","true"); Session session=Session.getDefaultInstance(props,null); MimeMessage mimeMessage=new MimeMessage(session); // 送信元メールアドレスと送信者名を指定 mimeMessage.setFrom(new InternetAddress(sendfrom,name,"iso-2022-jp")); mimeMessage.setRecipients(Message.RecipientType.TO,sendto); mimeMessage.setSubject(title,"iso-2022-jp"); /** 1つ目のボディパートを作成 **/ MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText(message, "iso-2022-jp"); mimeMessage.setHeader("Content-Type","text/html"); /** 2つ目のボディパートを作成 **/ MimeBodyPart mbp2 = new MimeBodyPart(); FileDataSource fds = new FileDataSource(filename); mbp2.setDataHandler(new DataHandler(fds)); mbp2.setFileName(MimeUtility.encodeWord(fds.getName())); // 複数のボディを格納するマルチパートオブジェクトを生成 Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); // マルチパートオブジェクトをメッセージに設定 mimeMessage.setContent(mp); // 送信日付を指定 mimeMessage.setSentDate(new Date()); // 送信 Transport transport = session.getTransport("smtp"); transport.connect(null, user, pass); //ユーザとパスワードを指定する transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); transport.close(); RET = true; } catch (Exception e) { System.out.println(e); RET = false; MailSendFileException msfe = new MailSendFileException(); throw msfe; } return RET; } public void setsmtp(String _smtp){ smtp = _smtp; } public void setsendfrom(String _sendfrom){ sendfrom = _sendfrom; } public void setsendto(String _sendto){ sendto = _sendto; } public void setname(String _name){ name = _name; } public void settitle(String _title){ title = _title; } public void setfilename(String _filename){ filename = _filename; } public void setmessage(String _message){ message = _message; } }