Bill the Lizard's code を使用して、Google Appsを使用してメールを送信しようとしています。このエラーが発生しています:
Exception in thread "main" javax.mail.SendFailedException: Sending failed;
nested exception is:
javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74
at javax.mail.Transport.send0(Transport.Java:219)
at javax.mail.Transport.send(Transport.Java:81)
at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.Java:81)
at SendMailUsingAuthentication.main(SendMailUsingAuthentication.Java:44)
Billのコードには次の行が含まれており、エラーに関連しているようです。
props.put("mail.smtp.starttls.enable","true");
しかし、それは役に立ちません。
これらは私のインポートステートメントです。
import Java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
誰もこのエラーについて知っていますか?
問題が見つかりました。以前は、j2ee.jarを使用してjavax.mailをインポートしていました。
クラスパスからj2ee.jarを削除し、 JavaMail 1.4.1をダウンロードして、クラスパスに2つのjar、smtp.jarおよびmailapi.jarを入れました。代わりにsmtpsを代わりに使用しますsmtp
Transport transport = session.getTransport("smtps");
これで、Bill the Lizardのコードが機能します。
以下のタグを設定します。それが動作します。
props.put("mail.smtp.user","username");
props.put("mail.smtp.Host", "smtp.gmail.com");
props.put("mail.smtp.port", "25");
props.put("mail.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.EnableSSL.enable","true");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
JavaメールAPIのバージョンです。この問題に直面していたので、JavaメールAPIを1.4.3に更新しました。
ありがとう!
メール転送にSMTPではなくSMTPSを使用することに関係していると思います。 JavaMail FAQ Gmailへのアクセス時 。をモデルにした別のバージョンです。わかりやすくするために、より細かいレベルの例外処理はすべて省略しています。
private static void send(
final String username,
final String password,
final String recipients,
final String subject,
final String body)
throws Exception
{
final Session session = Session.getInstance(System.getProperties(), null);
final Message msg = new MimeMessage(session);
final String senderEmail = username.contains("@") ? username : (username + "@gmail.com");
msg.setFrom(new InternetAddress(senderEmail));
final Address[] recipientAddresses = InternetAddress.parse(recipients);
msg.setRecipients(Message.RecipientType.TO, recipientAddresses);
msg.setSentDate(new Date());
msg.setSubject(subject);
msg.setText(body);
final Transport transport = session.getTransport("smtps");
transport.connect(GMAIL_SMTP_Host, GMAIL_SMTP_PORT, username, password);
transport.sendMessage(msg, recipientAddresses);
transport.close();
}
これは私を夢中にさせていたので、自分に合ったものを追加したかっただけです。これが機能するためには、JavaMail(1.4.5)のバージョンを更新する必要がありました-以前に使用されていたバージョンが不明です。
JavaMailの新しいバージョンに更新すると、次のコードが機能しました(デバッグ行のコメントを解除して、追加のデバッグ情報を取得できます-ポートは587
およびホストはsmtp.gmail.com
):
public void sendMailWithAuth(String Host, String user, String password,
String port, List<String> toList, String htmlBody,
String subject) throws Exception {
Properties props = System.getProperties();
props.put("mail.smtp.user",user);
props.put("mail.smtp.password", password);
props.put("mail.smtp.Host", Host);
props.put("mail.smtp.port", port);
//props.put("mail.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.EnableSSL.enable","true");
Session session = Session.getInstance(props, null);
//session.setDebug(true);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
// To get the array of addresses
for (String to: toList) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
}
message.setSubject(subject);
message.setContent(htmlBody, "text/html");
Transport transport = session.getTransport("smtp");
try {
transport.connect(Host, user, password);
transport.sendMessage(message, message.getAllRecipients());
} finally {
transport.close();
}
}