Теперь он работал для меня, я изменил настройку своей учетной записи google, как показано ниже:
System.out.println("Start");
final String username = "myemail@gmail.com";
final String password = "************";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "465");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Transport transport=session.getTransport();
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("myemail@gmail.com"));//formBean.getString("fromEmail")
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("myemail@gmail.com"));
message.setSubject("subject");//formBean.getString(
message.setText("mailBody");
transport.connect();
transport.send(message, InternetAddress.parse("myemail@gmail.com"));//(message);
System.out.println("Done");
} catch (MessagingException e) {
System.out.println("e="+e);
e.printStackTrace();
throw new RuntimeException(e);
}
Хотя я включил SSL и TSL во время запуска программы в этой ссылке того же поста. Я провожу много времени, но я понял и нашел эту ссылку. И сделали 2 следующих шага и установили контроль в google. :
Теперь я могу отправлять почту, используя указанную выше программу.
Возможно, более короткая и, по общему признанию, более ленивая / менее рекомендуемая альтернатива ответа Бена будет использовать JSON для сравнения:
let s = new Set()
arr.forEach(obj => (
!s.has(JSON.stringify(obj)) && s.add(JSON.stringify(obj))
))
s = new Set([...s].map(o => JSON.parse(o)))
Стоит отметить, что это будет работать, только если ключ -значные пары находятся в одном порядке.
Объекты передаются по ссылке, а это значит, что если вы добавите их в набор, даже если они будут точно такими же, они не будут одинаковыми, если вы проверите их с помощью ===
.
var a = {val1: 'hello', val2: 'there'}
var b = {val1: 'hello', val2: 'there'}
console.log(a === b) // false
console.log(a == b) // false
Чтобы решить эту проблему, вы можете написать что-то вроде следующего, взятого из этой статьи .
var a = {val1: 'hello', val2: 'there'};
var b = {val1: 'hello', val2: 'there'};
function isEquivalent(a, b) {
// Create arrays of property names
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// If number of properties is different,
// objects are not equivalent
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (a[propName] !== b[propName]) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
}
console.log(a === b); // false
console.log(a == b); // false
console.log(isEquivalent(a, b)); // true
Использование этого алгоритма будет проверять фактические значения объектов, а не ссылки.
console.log(isEquivalent(a, b)) // true