我有java程序(从谷歌复制)使用office365 SMTP发送电子邮件,它作为一个站点java程序工作正常,但当我在Web应用程序的web-inf / lib中部署这个java程序作为jar文件并调用来自jsp的方法是抛出以下错误: javax.mail.SendFailedException:发送失败; 嵌套异常是: javax.mail.MessagingException:530 5.7.57 SMTP;客户端未通过身份验证,无法在MAIL FROM
期间发送匿名邮件有人可以就此问题分享他们的观点。
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;
}
}
答案 0 :(得分:8)
您可以尝试使用以下配置,因为它适用于我:
" mail.smtp.starttls.enable":"真"
另外,我使用了主持人:
host =" Outlook.office365.com"
希望这可以帮助你或其他人。
答案 1 :(得分:1)
将smtp.starttls.enable
设置为true
,将主机设置为smtp.office365.com
解决了类似的问题。
我仅使用这3个属性对您的代码进行了测试:
props.put("mail.smtp.auth",true);
props.put("mail.smtp.starttls.enable",true);
props.put("mail.smtp.host", host);
主持人:smtp.office365.com
我可以从我的帐户发送电子邮件。
整个功能:
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;
}
和验证者
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;
}
}
答案 2 :(得分:0)
请设置以下内容 X-Mailer为message.setHeader(" X-Mailer","您的应用程序名称");
答案 3 :(得分:0)
所以,如果有人遇到类似问题:---
" javax.mail.MessagingException:530 5.7.57 SMTP;客户端未经过身份验证,无法在MAIL FROM期间发送匿名邮件。
在Linux操作系统上使用时,只需执行以下步骤: - 使用sudo编辑默认的jenkins文件,因为它是只读文件。
sudo vim / etc / default / jenkins
并添加以下两行: -
JAVA_ARGS =" -Xmx2048m -XX:MaxPermSize = 512m -Djava.awt.headless = true"
JAVA_ARGS =" -Djava.awt.headless = true -Dmail.smtp.starttls.enable = true"
编辑/追加文件后,重新启动Jenkins。 命令: - sudo /etc/init.d/Jenkins restart
现在测试您的配置,希望您将成功发送电子邮件