簡體   English   中英

我無法使用 Java Mail API 發送電子郵件 已發送電子郵件但未收到或未在發送的電子郵件中顯示

[英]I cannot send an Email using the Java Mail API the email is sent but is not received or displayed in the emails sent

當我單擊發送按鈕時,電子郵件已發送且未顯示任何錯誤,但未收到電子郵件,也未出現在發送的電子郵件中。 歡迎任何幫助。

我的代碼配置電子郵件類:

public class Email {

    public static void sendEmail(){
        final String username = "my_email@gmail.com";;
        final String password = "my_password";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }});
        try {

            final Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("my_email@gmail.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("my_receive_email@gmail.com"));
            message.setSubject("Subject");
            message.setText("Message");

            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try  {
                        Transport.send(message);
                        System.out.println("Done");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

            thread.start();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

我的發送按鈕代碼:

btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "SEND", Toast.LENGTH_SHORT).show();
                new Email();
                Email.sendEmail();   
            }
        });

這是我使用的課程:

public class GMailSender extends javax.mail.Authenticator {

    private String mailhost = "smtp.gmail.com";
    private String user;
    private String password;
    private Session session;

    static {
        Security.addProvider(new JSSEProvider());
    }

    public GMailSender(String user, String password, String host) {
        this.user = user;
        this.password = password;

        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        if (host != null) mailhost = host;
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.socketFactory.port", "587");

        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");

        session = Session.getDefaultInstance(props, this);
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }

    public synchronized void sendMail(String subject, String body, String sender, String recipients, String absolutePath, String fileName) throws Exception {
        try{
            MimeMessage message = new MimeMessage(session);
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
            message.setSender(new InternetAddress(sender));
            message.setSubject(subject);
            //message.setContent(body, "text/plain");
           // message.setDataHandler(handler);
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(body);
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(mbp1);


            if (absolutePath != null) {
                MimeBodyPart mbp2 = new MimeBodyPart();

                String file = absolutePath;
                String name = "podpis";
                if (fileName != null) name = fileName;
                name += ".jpg";
                DataSource source = new FileDataSource(file);
                mbp2.setDataHandler(new DataHandler(source));
                mbp2.setFileName(name);
                multipart.addBodyPart(mbp2);

            }
            message.setContent(multipart);

            if (recipients.indexOf(',') > 0)
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
            else
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            Transport.send(message);
        }catch(Exception e){
            Log.e("GMAIL SENDER", e.getMessage());
        }
    }

    public class ByteArrayDataSource implements DataSource {
        private byte[] data;
        private String type;

        public ByteArrayDataSource(byte[] data, String type) {
            super();
            this.data = data;
            this.type = type;
        }

        public ByteArrayDataSource(byte[] data) {
            super();
            this.data = data;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getContentType() {
            if (type == null)
                return "application/octet-stream";
            else
                return type;
        }

        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }

        public String getName() {
            return "ByteArrayDataSource";
        }

        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Not Supported");
        }
    }
}

我給它附加了一個文件,所以你不需要兩個MimeBodyParts

這就是電話:

String email = "email_adress_TO";

            if (email != null && email.length() > 2 && email.contains("@")) {
                final GMailSender sender = new GMailSender("your_email/name", "password", "hostname");
                try {
                    sender.sendMail("Title",
                                    "message",
                                    "email_adress_FROM",
                                    email,
                                    null,
                                    null);
                } catch (Exception e) {
                    Log.e("SendMail", e.getMessage(), e);
                }

當然它在AsyncTask里面。

抱歉,我完全忘記了JSSEProvider 你去吧:

import java.security.AccessController;
import java.security.Provider;

public class JSSEProvider extends Provider {

    private static final long serialVersionUID = 1L;

    public JSSEProvider() {
        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
        AccessController
                .doPrivileged(new java.security.PrivilegedAction<Void>() {
                    public Void run() {
                        put("SSLContext.TLS",
                                "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                        put("Alg.Alias.SSLContext.TLSv1", "TLS");
                        put("KeyManagerFactory.X509",
                                "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                        put("TrustManagerFactory.X509",
                                "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                        return null;
                    }
                });
    }
}
public class EmailSender {
    private JavaMailSender javaMailSender = new JavaMailSender();

    public void sendEmail(String to, String from, String subject, String text) {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(to);
        mailMessage.setSubject(subject);
        mailMessage.setFrom(from);
        mailMessage.setText(text);

        javaMailSender.send(mailMessage);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM