I have java program(Copied from google) to send emails using office365 SMTP, it is working fine as a stand java program but when I deploy this java program as jar file in web-inf/lib of a web application and calling the method from jsp it is throwing the below error: javax.mail.SendFailedException: Sending failed; nested exception is: javax.mail.MessagingException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM
我有java程序(从谷歌复制)来使用office365 SMTP发送电子邮件,它作为一个stand java程序运行良好,但是当我在web应用程序的web-inf/lib中部署这个java程序作为jar文件,并从jsp调用该方法时,它会抛出以下错误:javax.mail。SendFailedException:发送失败;嵌套的异常:javax.mail。MessagingException:530 5.7.57 SMTP;在邮件中,客户端未通过身份验证发送匿名邮件。
Can someone please share their views on this issue.
请大家分享一下他们对这个问题的看法。
The java code :
java代码:
import java.util.Properties;
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;
import org.apache.log4j.Logger;
public class SendEmailUsingSMTP {
public static boolean sendEmail(String toAddress, String fromAddress, String userName, String userPassword,String smtpHost, String portNumber, String emailSubject,String emailBody) {
// Recipient's email ID needs to be mentioned.
Logger log = Logger.getLogger(SendEmailUsingSMTP.class);
log.info("toAddress : "+toAddress);
log.info("fromAddress : "+fromAddress);
log.info("userName : "+userName);
log.info("userPassword : "+userPassword);
log.info("smtpHost : "+smtpHost);
log.info("portNumber : "+portNumber);
log.info("emailSubject : "+emailSubject);
log.info("emailBody : "+emailBody);
String to = toAddress;
// Sender's email ID needs to be mentioned
String from = fromAddress;//change accordingly
final String username = userName;//change accordingly
final String password = userPassword;//change accordingly
// Assuming you are sending email through relay.jangosmtp.net
String host = smtpHost;
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.port", portNumber);
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", portNumber);
// Get the Session object.
SMTPAuthenticator authenticator = new SMTPAuthenticator(username, password);
props.put("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
Session session = Session.getInstance(props, authenticator);
try {
// Create a default MimeMessage object.
Message message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
// Set Subject: header field
message.setSubject(emailSubject);
// Now set the actual message
message.setText(emailBody);
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
return true;
}
}
3 个解决方案
#1
4
You can try with the following configuration, as it works for me:
您可以尝试以下配置,因为它适用于我:
"mail.smtp.starttls.enable":"true"
“mail.smtp.starttls.enable”:“真正的”
Also, I used host:
另外,我使用的主机:
host = "Outlook.office365.com"
主机= " Outlook.office365.com "
Hope this helps you or someone else.
希望这能帮助你或其他人。
#2
0
Setting the smtp.starttls.enable
to true
and the host to smtp.office365.com
solved the similar problem for me.
设置smtp.starttls。com解决了类似的问题。
I tested it with your code using only these 3 properties:
我只使用了这三个属性对代码进行了测试:
props.put("mail.smtp.auth",true);
props.put("mail.smtp.starttls.enable",true);
props.put("mail.smtp.host", host);
the host: smtp.office365.com
and I could sent the emails from my account.
主机:smtp.office365.com,我可以从我的账户发送电子邮件。
The whole function:
整个功能:
public static boolean sendEmail(String toAddress, String fromAddress, String userName, String userPassword,String smtpHost, String emailSubject,String emailBody) {
// Recipient's email ID needs to be mentioned.
String to = toAddress;
// Sender's email ID needs to be mentioned
String from = fromAddress;//change accordingly
final String username = userName;//change accordingly
final String password = userPassword;//change accordingly
// Assuming you are sending email through relay.jangosmtp.net
String host = smtpHost;
Properties props = new Properties();
props.put("mail.smtp.auth",true);
props.put("mail.smtp.starttls.enable",true);
props.put("mail.smtp.host", host);
// Get the Session object.
SimpleMailAuthenticator authenticator = new SimpleMailAuthenticator(username, password);
Session session = Session.getInstance(props, authenticator);
try {
// Create a default MimeMessage object.
Message message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
// Set Subject: header field
message.setSubject(emailSubject);
// Now set the actual message
message.setText(emailBody);
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
return true;
}
and the authenticator
和身份验证
class SimpleMailAuthenticator extends Authenticator {
String userName;
String password;
PasswordAuthentication authentication;
public SimpleMailAuthenticator(String userName,String password) {
super();
this.userName = userName;
this.password = password;
authentication = new PasswordAuthentication(userName, password);
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return authentication;
}
}
#3
0
Please set the below X-Mailer as message.setHeader("X-Mailer", "Your application name");
请将下面的X-Mailer设置为消息。setHeader(“X-Mailer”、“应用程序名”);
#1
4
You can try with the following configuration, as it works for me:
您可以尝试以下配置,因为它适用于我:
"mail.smtp.starttls.enable":"true"
“mail.smtp.starttls.enable”:“真正的”
Also, I used host:
另外,我使用的主机:
host = "Outlook.office365.com"
主机= " Outlook.office365.com "
Hope this helps you or someone else.
希望这能帮助你或其他人。
#2
0
Setting the smtp.starttls.enable
to true
and the host to smtp.office365.com
solved the similar problem for me.
设置smtp.starttls。com解决了类似的问题。
I tested it with your code using only these 3 properties:
我只使用了这三个属性对代码进行了测试:
props.put("mail.smtp.auth",true);
props.put("mail.smtp.starttls.enable",true);
props.put("mail.smtp.host", host);
the host: smtp.office365.com
and I could sent the emails from my account.
主机:smtp.office365.com,我可以从我的账户发送电子邮件。
The whole function:
整个功能:
public static boolean sendEmail(String toAddress, String fromAddress, String userName, String userPassword,String smtpHost, String emailSubject,String emailBody) {
// Recipient's email ID needs to be mentioned.
String to = toAddress;
// Sender's email ID needs to be mentioned
String from = fromAddress;//change accordingly
final String username = userName;//change accordingly
final String password = userPassword;//change accordingly
// Assuming you are sending email through relay.jangosmtp.net
String host = smtpHost;
Properties props = new Properties();
props.put("mail.smtp.auth",true);
props.put("mail.smtp.starttls.enable",true);
props.put("mail.smtp.host", host);
// Get the Session object.
SimpleMailAuthenticator authenticator = new SimpleMailAuthenticator(username, password);
Session session = Session.getInstance(props, authenticator);
try {
// Create a default MimeMessage object.
Message message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
// Set Subject: header field
message.setSubject(emailSubject);
// Now set the actual message
message.setText(emailBody);
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
return true;
}
and the authenticator
和身份验证
class SimpleMailAuthenticator extends Authenticator {
String userName;
String password;
PasswordAuthentication authentication;
public SimpleMailAuthenticator(String userName,String password) {
super();
this.userName = userName;
this.password = password;
authentication = new PasswordAuthentication(userName, password);
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return authentication;
}
}
#3
0
Please set the below X-Mailer as message.setHeader("X-Mailer", "Your application name");
请将下面的X-Mailer设置为消息。setHeader(“X-Mailer”、“应用程序名”);