【问题标题】:sending mail by android app using javamail api without user interaction使用 javamail api 通过 android 应用程序发送邮件,无需用户交互
【发布时间】:2015-08-24 06:03:49
【问题描述】:

我正在制作一个 android 应用程序,我必须在其中通过邮件发送一些文本,我尝试了很多代码,但它们在 java 项目中工作但不在 android 项目中,我在这里搜索并尝试了几乎所有的帖子,也在互联网上的任何地方但是没有人在工作,谁能给我在android中通过java邮件API发送邮件的工作代码,除了这个邮件部分,我几乎完成了我的应用程序。所以请帮我解决这个问题。

logcat错误如下:-

09-03 22:41:58.636: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol

有趣的是,我的应用在不同的设备上出现了不同的错误(打印堆栈错误), 当我在模拟器上运行应用程序时,我得到的错误为

“无法连接到 SMTP 主机:smtp.gamil.com,端口:587”

当我在我的 android 手机上运行该应用程序时,我收到以下错误:-

“权限被拒绝(缺少 INTERNET 权限?)”

我已经在清单文件中授予了 INTERNET 权限。

我已经尝试过的代码位于以下链接:-

访问Cant send mail from android app using java mail api

访问https://stackoverflow.com/questions/24088195/application-has-closed-unexpecteadly-forse-closed

【问题讨论】:

  • 我正在编写一个教程来展示如何做到这一点;同时,你应该下载commons-email.jar、mail.jar、activation.jar和additional.jar文件,然后编写你自己的客户端。
  • 是的,先生,我已经下载了 3 个 jar 文件并将它们添加到我的项目中,但我收到错误消息,因为“无法连接到 SMTP 主机:smtp.gamil.com,端口:587”在模拟器上和android手机上的“权限被拒绝(缺少INTERNET权限?)”
  • 是的,我给了 INTERNET 权限和 ACCESS_NETWORK_STATE 权限:)
  • 发布您的清单。看起来你拼错了。此外,发布您的电子邮件发送代码(只是基础知识以及调用)。我闻到了NetworkOnMainThreadException

标签: android email jakarta-mail


【解决方案1】:

你可以这样做:

一旦您下载并添加了这些 jar 文件:commons-email.jar、mail.jar、activation.jar 和 additional.jar,您应该可以在后台发送电子邮件了。

  1. 首先,创建一个 AsyncTask 以便您可以在后台发送电子邮件。然后在 doInBackground 中添加以下代码 - 根据需要替换值。

    public class EmailSenderAsync extends AsyncTask <String, Void, Boolean> {
    
      private HtmlEmail email;
    
    
      @Override
      protected Boolean doInBackground(String... params)
      {
        String textMsg;
        try {
           String userEmail = params[0];
           String message = param[1];
    
           email = new HtmlEmail();
    
           email.setAuthenticator(new DefaultAuthenticator("youremail@yahoo.com",   "yourpasswordhere"));
    
           email.setSmtpPort(587);
    
           email.setHostName("smtp.gmail.com");
    
           email.setDebug(true);
    
    
           email.addTo(userEmail, "Whatever you want here");
    
           email.setFrom("youremail@yahoo.com", "Your business name");
    
           email.setSubject("Your email subject here");
    
    
           email.getMailSession().getProperties().put("mail.smtps.auth", "true");
    
           email.getMailSession().getProperties().put("mail.debug", "true");
    
           email.getMailSession().getProperties().put("mail.smtps.port", "587");
    
           email.getMailSession().getProperties().put("mail.smtps.socketFactory.port", "587");
    
           email.getMailSession().getProperties().put("mail.smtps.socketFactory.class",  "javax.net.ssl.SSLSocketFactory");
    
           email.getMailSession().getProperties().put("mail.smtps.socketFactory.fallback", "false");
    
           email.getMailSession().getProperties().put("mail.smtp.starttls.enable", "true");
    
           email.setTextMsg(message);
    
           email.send();
    
    
           return true;
    
        } catch (Exception e){
    
           return false;
        }
    
    }
    

现在您可以通过执行以下操作从需要发送电子邮件的任何地方调用它:

new EmailSenderAsync().execute("useremail@gmail.com", "Thank you for contacting us this morning");

这会解决你的问题。

祝你好运,我希望这会有所帮助。

【讨论】:

  • 我认为“protected Boolean doInBackground(String... params)”,我们应该写成“protected Boolean doInBackground(String[] params)”,对吗?Eenvincible先生?或者如果我错了,那么将正确的值解释为参数
  • 嘿,它的工作,非常感谢老兄:) 你让我很开心
  • 通常情况下,如果它有效,您会通过接受它来标记它作为答案。谢谢,我也很高兴能提供帮助
  • 我将您的答案标记为最佳,但它说“投票需要 15 声望”:(
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2014-03-03
  • 1970-01-01
相关资源
最近更新 更多