JavaMailは、SMTP接続を構成するために設定できる一連のプロパティを指定します。 STARTTLSを使用するには、次のプロパティを設定する必要があります
_mail.smtp.starttls.enable=true
_
Smtpサービスを使用するためのユーザー名/パスワードはどこで指定しますか?以下を指定するだけで十分ですか?
_mail.smtp.user=me
mail.smtp.password=secret
_
または、次を使用して明示的にログインする必要がありますか?
_transport.connect(server, userName, password)
_
はい、すでにこれを試みましたが、transport.connect(..)
を使用して接続する必要があるようです。しかし、はいの場合、_mail.smtp.user
_とは何のプロパティですか? starttls
でsmtpを使用するには不十分ですか?
STARTTLSでGMail smtp(JavaMail)を使用しているsendEmailメソッドを次に示します。
public void sendEmail(String body, String subject, String recipient) throws MessagingException,
UnsupportedEncodingException {
Properties mailProps = new Properties();
mailProps.put("mail.smtp.from", from);
mailProps.put("mail.smtp.Host", smtpHost);
mailProps.put("mail.smtp.port", port);
mailProps.put("mail.smtp.auth", true);
mailProps.put("mail.smtp.socketFactory.port", port);
mailProps.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
mailProps.put("mail.smtp.socketFactory.fallback", "false");
mailProps.put("mail.smtp.starttls.enable", "true");
Session mailSession = Session.getDefaultInstance(mailProps, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(login, password);
}
});
MimeMessage message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(from));
String[] emails = { recipient };
InternetAddress dests[] = new InternetAddress[emails.length];
for (int i = 0; i < emails.length; i++) {
dests[i] = new InternetAddress(emails[i].trim().toLowerCase());
}
message.setRecipients(Message.RecipientType.TO, dests);
message.setSubject(subject, "UTF-8");
Multipart mp = new MimeMultipart();
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(body, "text/html;charset=utf-8");
mp.addBodyPart(mbp);
message.setContent(mp);
message.setSentDate(new Java.util.Date());
Transport.send(message);
}
Authenticatorをサブクラス化し、ログインするenvプロパティとともにSessionのPasswordAuthenticationオブジェクトを作成する必要があります
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user-name", "user-password");
}
});
ユーザー名は、Gmailなどの一部のサーバーの完全なメールIDである場合があります。お役に立てれば。
セッションを作成するときに認証子を提供する必要があります
Authenticator authenticator = new PasswordAuthentication("username", "password");
Session session = Session.getInstance(properties, authenticator);
次に、セッションを使用してメッセージを送信します(簡潔にするため、try/catchをスキップします)。
SMTPTransport tr = (SMTPTransport) session.getTransport("smtps");
tr.connect();
tr.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
次のようにユーザーを指定できます
[email protected]
(またはmail.smtp.user
使用しない場合mail.transport.protocol=smtps
)セッションに使用するプロパティ内。
知る限りでは、パスワードを指定することはできません。しかし、あなたは確かに小道具に入れて自分でそれを取り出すことができます。または、他の方法で取得します。ユーザーにプロンプトを表示します。
持っている場合、セッションに提供する方法は2つあります。より簡単なものは使用することです
Transport tr = session.getTransport();
tr.connect(null, password);
tr.sendMessage(message, message.getRecipients());
または、指摘したように、オーセンティケーターを使用できます。ただし、小道具のユーザーは無視され、PasswordAuthentication
に明示的に渡す必要があります。そうした場合、あなたの報酬は、静的Transport.send
。
Simple Java Mail を使用すると簡単です:
Email email = new Email();
email.setFromAddress("lollypop", "[email protected]");
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO);
email.setText("We should meet up!");
email.setTextHTML("<b>We should meet up!</b>");
email.setSubject("hey");
new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);
2要素ログインを有効にしている場合、Googleアカウントから アプリケーション固有のパスワード を生成する必要があります。
それでもこれを自分で行いたい場合は、 この背後にあるコード ライブラリは非常に簡単です。どの TransportStrategy が渡されたか(プレーン、ssl、またはtls)に応じてセッションに特定のプロパティを設定し、認証を使用して認証を実行します。
"mail.transport.protocol" : "smtp"
"mail.smtp.starttls.enable" : "true"
"mail.smtp.Host" : Host
"mail.smtp.port" : port
"mail.smtp.username" : username
"mail.smtp.auth" : "true"
そして
return Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});