【问题标题】:Send email in android using JavaMail API with smtp but without SSL使用带有 smtp 但没有 SSL 的 JavaMail API 在 android 中发送电子邮件
【发布时间】:2012-04-22 10:28:18
【问题描述】:

我已经解决了this 的问题,它适用于自己使用 SSL 的案例

我也尝试了this 一个,它在某种程度上适合我的需要,但它不适用于我的情况。

我还阅读了this 主题,但在我的代码中不使用 SSL 时仍然无法发送电子邮件。

每次我发送邮件时,它都会显示“例外 554,邮件被拒绝”

我真正需要的是使用::

邮件主机:“smtpout.secureserver.net”

端口号:25

谢谢,

哈哈。

【问题讨论】:

    标签: android smtp jakarta-mail


    【解决方案1】:

    首先在你的项目中使用Mail.jar、activation.jar、Additional.jar文件上传

    使用这个邮件类

    package com.technosoft.AkashEmailAddress;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Date;
    import java.util.Properties;
    import javax.activation.CommandMap;
    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.activation.MailcapCommandMap;
    import javax.mail.BodyPart;
    import javax.mail.Multipart;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    
    import android.util.Log;
    
    
    public class Mail extends javax.mail.Authenticator { 
      private String _user; 
      private String _pass; 
    
      private String[] _to; 
      private String _from; 
    
      private String _port; 
      private String _sport; 
    
      private String _host; 
    
      private String _subject; 
      private String _body; 
    
      private boolean _auth; 
    
      private boolean _debuggable; 
    
      private Multipart _multipart; 
    
    
      public Mail() { 
        _host = "smtp.gmail.com"; // default smtp server 
        _port = "465"; // default smtp port 
        _sport = "465"; // default socketfactory port 
    
        _user = ""; // username 
        _pass = ""; // password 
      _from = ""; // email sent from 
        _subject = ""; // email subject 
        _body = ""; // email body 
    
        _debuggable = false; // debug mode on or off - default off 
        _auth = true; // smtp authentication - default on 
    
        _multipart = new MimeMultipart(); 
    
        // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
        CommandMap.setDefaultCommandMap(mc); 
      } 
    
      public Mail(String user, String pass) { 
        this(); 
    
        _user = user; 
        _pass = pass; 
      } 
    
      public boolean send() throws Exception { 
        Properties props = _setProperties(); 
    
        if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
    
            Session session = Session.getInstance(props, this); 
         DataHandler handler = new DataHandler(new ByteArrayDataSource(_body.getBytes(), "text/plain")); 
          MimeMessage msg = new MimeMessage(session); 
    
          msg.setFrom(new InternetAddress(_from)); 
          msg.setDataHandler(handler);
          InternetAddress[] addressTo = new InternetAddress[_to.length]; 
          for (int i = 0; i < _to.length; i++) { 
            addressTo[i] = new InternetAddress(_to[i]); 
          } 
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
    
          msg.setSubject(_subject); 
          msg.setSentDate(new Date()); 
    
          // setup message body 
          BodyPart messageBodyPart = new MimeBodyPart(); 
          messageBodyPart.setText(_body); 
        _multipart.addBodyPart(messageBodyPart); 
    
          // Put parts in message 
        msg.setContent(_multipart); 
    
          // send email 
          Transport.send(msg); 
          Log.v("mas", "Email was  send");
          return true; 
        } else { 
             Log.v("mas", "Email was  not send");
          return false; 
    
        } 
      } 
      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");   
          }   
      }   
    
      @Override 
      public PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(_user, _pass); 
      } 
    
      private Properties _setProperties() { 
        Properties props = new Properties(); 
    
        props.put("mail.smtp.host", _host); 
    
        if(_debuggable) { 
          props.put("mail.debug", "true"); 
        } 
    
        if(_auth) { 
          props.put("mail.smtp.auth", "true"); 
        } 
    
        props.put("mail.smtp.port", _port); 
        props.put("mail.smtp.socketFactory.port", _sport); 
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 
    
        return props; 
      } 
    
      // the getters and setters 
      public String getBody() { 
        return _body; 
      } 
    
      public void setBody(String _body) { 
        this._body = _body; 
      }
    
    public void setTo(String[] toArr) {
        // TODO Auto-generated method stub
        this._to=toArr;
    }
    
    public void setFrom(String string) {
        // TODO Auto-generated method stub
        this._from=string;
    }
    
    public void setSubject(String string) {
        // TODO Auto-generated method stub
        this._subject=string;
    } 
    
      // more of the getters and setters ….. 
    }  
    

    Mail 类在你的 Main 类中有 send() 方法使用

    Main class extends Activity{
        Mail m=new Mail("DefultUserID@gmail.com","XXXXXXX");
        @SuppressWarnings("static-access")
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.email);
     String[] toArr = {"UserEmailID_1@gmail.com","UserEmail_ID@Yahoo.co.in"}; 
            m.setTo(toArr);
            m.setFrom("AKASH"); 
            m.setSubject("Your Subject"); 
            m.setBody("Your Message body");
    
            try {
                boolean i= m.send();
                if(i==true){
                    Toast.makeText(getApplicationContext(),"Email was sent successfully ",2000).show();
    
                }
                else
                {
                    Toast.makeText(getApplicationContext(),"Email was not sent successfully ",2000).show();
    
                }
    
            } catch (Exception e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
    
    }
    }
    

    【讨论】:

    • 感谢代码@Akash,但您的示例也是使用 SSL,我想不使用 SSL。对不起。:P
    • 如果您对此有任何提示,请告诉我们。 :)
    • 出现类似错误:03-08 14:58:15.341: E/AndroidRuntime(12229): java.lang.NoClassDefFoundError: javax.activation.DataHandler 03-08 14:58:15.341: E/ AndroidRuntime(12229): 在 com.cslbd.android.cattendence.app.Mail.send(Mail.java:91) 03-08 14:58:15.341: E/AndroidRuntime(12229): 在 com.cslbd.android.cattendence .app.BugActivity.onClick(BugActivity.java:76)
    【解决方案2】:

    这是我为您的错误而得到的,这意味着从您的 IP 发送邮件被阻止。 以下答案来自此链接 http://postmaster.bluetie.com/subcontent/smtpCodes.php

    554 - BL0002:邮件被拒绝 - IP 地址 xxx.xxx.xxx.xxx 已列入黑名单 - 请参阅 http://www.spamcop.net/w3m?action=checkblock&ip=xxx.xxx.xxx.xxx 此错误消息表明在 SpamCop 黑名单中找到了发送 IP 地址。发送方必须发出删除/重置请求。 BlueTie 无法从黑名单中删除发送 IP 地址。您可能希望与您的 ISP 联系以获取有关此类错误的进一步帮助。

    【讨论】:

    • @Haps -- 如果你正确地遵循第一个示例链接,我认为你不会遗漏任何代码,因为就在两天前,我使用相同的链接发送邮件并且它工作得很好......你需要查看您的 Internet 提供商或系统管理员
    猜你喜欢
    • 2013-06-13
    • 2012-03-16
    • 2012-10-16
    • 2012-03-03
    • 2011-10-16
    • 2017-10-17
    • 2021-03-26
    相关资源
    最近更新 更多