PDA

View Full Version : سوال: خطا در ارسال ایمیل با استفاده از کتابخانه JavaMail



imanEsmaeili
پنج شنبه 14 بهمن 1389, 19:15 عصر
با سلام

من از کتابخانه JavaMail API برای ارسال ایمیل در سایتم استفاده می کنیم و از کدهای زیر برای ارسال ایمیل نمونه استفاده می کنم.

من در ابتدا یک کلاس برای ارسال ایمیل نوشتم که بصورت زیر می باشد.



import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class EmailManagement {
private final String PROTOCOL="smtp";
private final String HOST="smtp.salekanpublishing.ir";
private final String USER="My Username";
private final String PASSWORD="My Password";

private Properties props;
private Session mailSession;
private MimeMessage message;

private String subject;
private String content;

public EmailManagement() throws NoSuchProviderException {
props = new Properties();
props.setProperty("mail.transport.protocol", PROTOCOL);
props.setProperty("mail.host", HOST);
props.setProperty("mail.mime.charset", "UTF-8");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.starttls.enable", "true");
SMTPAuthenticator auth = new SMTPAuthenticator();
mailSession=Session.getDefaultInstance(props, auth);
message=new MimeMessage(mailSession);
}

public boolean sendTextMessage(String recipients[],String subject, String content) throws MessagingException{
message.setFrom(new InternetAddress(USER));
Address addressTo[]=new Address[recipients.length];
for (int i = 0; i < addressTo.length; i++) {
addressTo[i]=new InternetAddress(recipients[i]);
}
message.setRecipients(Message.RecipientType.TO, addressTo);
this.subject=subject;
this.content=content;
boolean flag=false;
message.setSubject(this.subject);
message.setContent(this.content, "text/html; charset=UTF-8");
Transport.send(message);
flag=true;
return flag;
}


private class SMTPAuthenticator extends javax.mail.Authenticator{
public PasswordAuthentication getPasswordAuthentication()
{
String username = USER;
String password = PASSWORD;
return new PasswordAuthentication(username, password);
}
}
}



و سپس از کدهای زیر برای استفاده از کلاس فوق و ارسال ایمیل نمونه استفاده می کنم.



EmailManagement emailManagement=null;
try {
emailManagement = new EmailManagement();
} catch (NoSuchProviderException ex) {
ex.printStackTrace();
}
String subject="test mail";
String content="this is a test mail";
String recipients[]={"iman.esmaeili.14@gmail.com"};
try {
if(emailManagement.sendTextMessage(recipients, subject, content))
JOptionPane.showMessageDialog(this, "emails sent correctly");
} catch (MessagingException ex) {
JOptionPane.showMessageDialog(this, "Error in sending mail");
ex.printStackTrace();
}




که متاسفانه پس از اجرا با خطای زیر روبرو می شوم.


javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderE xception: unable to find valid certification path to requested target
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTrans port.java:1652)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SM TPTransport.java:534)
at javax.mail.Service.connect(Service.java:313)
at javax.mail.Service.connect(Service.java:172)
at javax.mail.Service.connect(Service.java:121)
at javax.mail.Transport.send0(Transport.java:190)
at javax.mail.Transport.send(Transport.java:120)
at tools.EmailManagement.sendTextMessage(EmailManagem ent.java:57)
at mainForm.jButton2ActionPerformed(mainForm.java:190 )
at mainForm.access$100(mainForm.java:35)
at mainForm$2.actionPerformed(mainForm.java:68)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:121)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderE xception: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLExceptio n(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(S SLSocketImpl.java:1520)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Ha ndshaker.java:182)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Ha ndshaker.java:176)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serv erCertificate(ClientHandshaker.java:975)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.proc essMessage(ClientHandshaker.java:123)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoo p(Handshaker.java:511)
at com.sun.net.ssl.internal.ssl.Handshaker.process_re cord(Handshaker.java:449)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRec ord(SSLSocketImpl.java:817)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.perform InitialHandshake(SSLSocketImpl.java:1029)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHa ndshake(SSLSocketImpl.java:1056)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHa ndshake(SSLSocketImpl.java:1040)
at com.sun.mail.util.SocketFetcher.configureSSLSocket (SocketFetcher.java:503)
at com.sun.mail.util.SocketFetcher.startTLS(SocketFet cher.java:443)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTrans port.java:1647)
... 35 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderE xception: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXV alidator.java:285)
at sun.security.validator.PKIXValidator.engineValidat e(PKIXValidator.java:191)
at sun.security.validator.Validator.validate(Validato r.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl. validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl. checkServerTrusted(X509TrustManagerImpl.java:209)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl. checkServerTrusted(X509TrustManagerImpl.java:249)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serv erCertificate(ClientHandshaker.java:954)
... 45 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderE xception: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder. engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathB uilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXV alidator.java:280)
... 51 more


از شما عزیزان صمیمانه تقاضا دارم که مورد من رابررسی و در صورت امکان نتیجه را به من انتقال دهید

m44miri
جمعه 22 بهمن 1389, 09:26 صبح
من دقیقا نمی دونم مشکلت چیه.خودم هم دارم یک برنامه می نویسم برای پروژه دانشگاه که از javaMail استفاده کنم.هنوز درگیر server Mail هستم.تحت لینوکس.یخورده باید costumize کنمش .اما یک توصیه .قبل از اینکه بخوای از javaMail استفاده کنی اول از یک application client مثل evolution برای تست استفاده من.شاید آدرس (mail.google) سرورت اشتباه باشه.این کار بی ضرره.ولی چون قبلا با javamail کار کردم میدونم که خیلی کار کردن باحاش سادست.

omidbizdotcom
چهارشنبه 10 فروردین 1390, 00:30 صبح
سلام
من به این exception برخورد نکردم تا حالا اما وقتی از ssl استفاده می کنی تمام smtp ها رو با smtps عوض کن غیر از پروتکل و هاست ترنسپورت هم بصورت زیر بگیر


Transport tr = session.getTransport("smtps");

امیدوارم کمک کنه


http://blog.omidbiz.com/omidplanet/entry/java_mail_api