我正在开发一个应用程序,用户每当发生特定触发时都会收到电子邮件。
这是我用来发送电子邮件的功能:
public static void sendEmail(String host, String port, String useSSL, String useTLS, String useAuth, String user, String password, String subject, String content, String type, String recipients)
throws NoSuchProviderException, AddressException, MessagingException {
final Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.port", port);
if (useSSL != null && !useSSL.equals("false") && useSSL.equals("true")) {
props.setProperty("mail.smtp.ssl.enable", useSSL);
props.setProperty("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.port", port);
}
if (useTLS != null && !useTLS.equals("false") && useTLS.equals("true")) {
props.setProperty("mail.smtp.starttls.enable", useTLS);
props.setProperty("mail.smtp.socketFactory.fallback", "true");
}
props.setProperty("mail.smtp.auth", useAuth);
props.setProperty("mail.from", user);
props.setProperty("mail.smtp.user", user);
props.setProperty("mail.password", password);
Session mailSession = Session.getDefaultInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(props.getProperty("mail.smtp.user"), props
.getProperty("mail.password"));
}
});
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
message.setHeader("Subject", subject);
message.setContent(content, type);
StringTokenizer tokenizer = new StringTokenizer(recipients, ";");
while (tokenizer.hasMoreTokens()) {
String recipient = tokenizer.nextToken();
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(recipient));
}
transport.connect();
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
奇怪的是,每当我尝试使用main方法运行上述代码时,它都会成功发送SSL和TLS协议的电子邮件。
public static void main(String args[])
{
try {
Notifier.sendEmail("smtp.gmail.com", "587", "false", "true", "true","sender_email@gmail.com", "testpassword", "CHECKING SETTINGS", "CHECKING EMAIL FUNCTIONALITY", "text/html", "cc_email@gmail.com");
} catch (Exception ex) {
ex.printStackTrace();
}
}
但每当我尝试通过我的Web应用程序运行相同的代码时它就会失败。
通过SSL发送会引发此错误:
com.sun.mail.smtp.SMTPSendFailedException: 530-5.5.1 Authentication Required. Learn more at
jvm 1 | 530 5.5.1 https://support.google.com/mail/answer/14257 f12sm88286300pat.20 - gsmtp
jvm 1 |
jvm 1 | at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
通过TLS发送会抛出此错误:
javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;
jvm 1 | nested exception is:
jvm 1 | javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
jvm 1 | at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
感谢任何形式的帮助。
EDIT1:
这是来自前端的tpl文件
<div class="label1"><h3 class="label">Host:</h3></div>
<div class="field1"><input type="text" class="input1" name="host" size="20" value="$HOST$"></div>
<div class="port"><h3 class="label">Port:</h3></div>
<div class="fieldport"><input type="text" class="fieldport" name="port" size="5" value="$PORT$"></div>
<div class="ssl">
<input type="radio" name="sslEnable" value="$SSLENABLE$">
Enable SSL?
</div>
<div class="tls">
<input type="radio" name="tlsEnable" value="$TLSENABLE$">
Enable TLS?
</div>
<div class="auth">
<input type="checkbox" name="auth"$AUTH$>
Enable Authentication?
</div>
<div class="label2"><h3 class="label">User:</h3></div>
<div class="field2"><input type="text" class="input1" name="user" size="20" value="$USER$"></div>
<div class="label3"><h3 class="label">Password:</h3></div>
<div class="field3"><input type="password" class="input1" name="password" size="20" value="$PASSWORD$"></div>
<div class="label4"><h3 class="label">Recipient(s):</h3></div>
<div class="field4"><input type="text" class="input1" name="recipients" size="50" value="$RECIPIENTS$"></div>
值将保存在配置文件中,如下所示:
host=smtp.gmail.com
port=587
ssl=false
tls=true
auth=true
user=send_user_email@gmail.com
password=O0UbYboDfVFRaiA=
recipients=cc_user_email@gmail.com
trigger1=false
attempt=0
trigger2=false
percent=5
anyOrAll=ANY
trigger3=true
format=HTML
trigger4=true
trigger5=true
EDIT2:
public static void sendEmail(String message)
throws NoSuchProviderException, AddressException, MessagingException
{
if (message == null || message.trim().equals("")) return;
StringBuffer content = new StringBuffer();
content.append(getHeader());
content.append(message);
content.append(getFooter());
String format = NotifyProps.getFormat();
String type = "text/plain";
if (format.equals(NotifyProps.HTML)) type = "text/html";
sendEmail(NotifyProps.getHost(), NotifyProps.getPort(), Boolean.toString(NotifyProps.getUseAuth()), Boolean.toString(NotifyProps.getUseSSL()), Boolean.toString(NotifyProps.getUseTLS()),NotifyProps.getUser(), NotifyProps.getPassword(),
"Transaction Processor Auto Notification", content.toString(), type,
NotifyProps.getRecipients())
}
这是设置和获取属性的类:
谢谢。
答案 0 :(得分:2)
你的代码看起来还不错,至少有一个大问题。 您正尝试对TLS和SSL使用相同的端口(587)。我不确定TLS,但如果您将请求发送到端口465,则SSL代码应该正常工作。 {3}}:
在端口465(使用SSL)和端口587(使用TLS)上配置SMTP服务器[...]
他们有自己的特定端口。您获得SSL的错误:
BarWrapper
您的客户是否不理解它收到非SSL编码的响应(由于TLS端口未实现SSL)。
答案 1 :(得分:1)
我们为TLS设置了更多属性
props.put("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.ssl.enable", "true");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
对于Auth使用smtps而不是smtp
props.setProperty("mail.smtps.auth", useAuth);
获得运输时
session.getTransport("smtps");
连接时再次传递主机电子邮件和密码
transport.connect("smtp.gmail.com", "user@email", "password");
用于调试
session.setDebug(true);
答案 2 :(得分:0)
尝试以下适合我的代码。
public void sendEmail(){
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("senderEmail@gmail.com","secret");
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from-email@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("to-email@gmail.com"));
message.setSubject("This is testing message");
message.setText("Hi this is testing email....not spam");
Transport.send(message);
System.out.println("email successfully sent..");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
答案 3 :(得分:0)
最近,gmail中有一个更新安全性。您必须允许选项&#34;允许不太安全的应用程序访问&#34;在页面https://myaccount.google.com/security?pli=1中。然后,您可以毫无问题地从您的帐户发送邮件
答案 4 :(得分:0)
simple-java-mail有一个简单的枚举,可用于表示SSL或TLS。您不需要担心正确的属性:
Email email = new Email();
(...)
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);
如果您启用了双因素登录,则需要从Google帐户生成application specific password才能使此示例正常运行。