精华内容
下载资源
问答
  • 搞了一上午终于搞定了腾讯云企业邮箱发送,话说腾讯云的东西就是繁琐,但是好用,还是得认真看文档啊,不然真的摸不着北。腾讯企业邮箱官网:http://exmail.qq.com点击开通你跟着步骤走就行了,没啥难的,如果你...

    搞了一上午终于搞定了腾讯云企业邮箱的发送,话说腾讯云的东西就是繁琐,但是好用,还是得认真看文档啊,不然真的摸不着北。

    腾讯企业邮箱官网:http://exmail.qq.com


    点击开通




    你跟着步骤走就行了,没啥难的,如果你没有域名,你就去买一个呗,也花不了多少钱的。

    注册成功后,是这个页面,并且会有一个弹窗告诉你一些信息


    现在你点击添加成员,因为你不添加成员的话你是无法发送邮件的。


    完成后是这样


    然后你打开腾讯企业邮箱登录界面,输入你刚才增加的成员邮箱的:登录名 + 密码,进去后是一个类似于普通QQ邮箱的界面


    第一次进去会要求重新设置密码,设置一下就好了。默认的已经开通了SSL协议;

    如何设置IMAP、POP3/SMTP及其SSL加密方式?

     
    如果您的电子邮件客户端支持SSL,可以在设置中选择使用SSL。
     
    通用配置参数:
    (我们已经默认都支持这些协议,用户无需自己手动开启这些服务器与端口)
     
    POP3/SMTP协议
    接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
    发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
    海外用户可使用以下服务器
    接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
    发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
     
    IMAP协议
    接收邮件服务器:imap.exmail.qq.com  ,使用SSL,端口号993
    发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
    海外用户可使用以下服务器
    接收邮件服务器:hwimap.exmail.qq.com ,使用SSL,端口号993
    发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
     
    账户名:您的企业邮箱账户名,账户名需要填写完整的邮件地址
    密码:您的企业邮箱密码
    电子邮件地址:您的企业邮箱的完整邮件地址
     
    使用SSL协议之前,请您先参考常用客户端的一般配置方式

    使用java代码发送邮箱

    package com.xiets.javamaildemo;
    
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上(必须)
     */
    public class Main {
    
        // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
        // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), 
        //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
        public static String myEmailAccount = "xxxxxxxxx@163.com";
        public static String myEmailPassword = "xxxxxxxxx";
    
        // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
        // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
        public static String myEmailSMTPHost = "smtp.163.com";
    
        // 收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxxxxxxxx@qq.com";
    
        public static void main(String[] args) throws Exception {
            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    // 参数配置
            props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
    
            // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
            //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
            //     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
            /*
            // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
            //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
            //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
            final String smtpPort = "465";
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            */
    
            // 2. 根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getDefaultInstance(props);
            session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
    
            // 3. 创建一封邮件
            MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
    
            // 4. 根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();
    
            // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
            // 
            //    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
            //           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
            //           类型到对应邮件服务器的帮助网站上查看具体失败原因。
            //
            //    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
            //           (1) 邮箱没有开启 SMTP 服务;
            //           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
            //           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
            //           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
            //           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
            //
            //    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
            transport.connect(myEmailAccount, myEmailPassword);
    
            // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
    
            // 7. 关闭连接
            transport.close();
        }
    
        /**
         * 创建一封只包含文本的简单邮件
         *
         * @param session 和服务器交互的会话
         * @param sendMail 发件人邮箱
         * @param receiveMail 收件人邮箱
         * @return
         * @throws Exception
         */
        public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
            // 1. 创建一封邮件
            MimeMessage message = new MimeMessage(session);
    
            // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
            message.setFrom(new InternetAddress(sendMail, "某宝网", "UTF-8"));
    
            // 3. To: 收件人(可以增加多个收件人、抄送、密送)
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
    
            // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
            message.setSubject("打折钜惠", "UTF-8");
    
            // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
            message.setContent("XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");
    
            // 6. 设置发件时间
            message.setSentDate(new Date());
    
            // 7. 保存设置
            message.saveChanges();
    
            return message;
        }
    
    }

    一封复杂的邮件内容可以看做是由很多节点(或者可以说是“片段”/“部分”/“零件”)组成,文本、图片、附件等都可以看成是邮件内容中的一个节点。这些节点之间又可以相互关联组合成一个节点。最终组合成一个大节点就是邮件的正文内容。

    package com.xiets.javamaildemo;
    
    import java.util.Date;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message.RecipientType;
    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 javax.mail.internet.MimeUtility;
    
    /**
     * 创建并发送一封包含文本、图片、附件的复杂邮件
     * 
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上(必须)
     * 
     * @author xietansheng
     */
    public class Main {
    
        // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
        public static String myEmailAccount = "xxxxxxxx@163.com";
        public static String myEmailPassword = "xxxxxxxx";
    
        // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
        // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
        public static String myEmailSMTPHost = "smtp.163.com";
    
        // 收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxxxxxxxx@qq.com";
    
        public static void main(String[] args) throws Exception {
            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    // 参数配置
            props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
    
            // 开启 SSL 连接, 以及更详细的发送步骤请看上一篇: 基于 JavaMail 的 Java 邮件发送:简单邮件发送
    
            // 2. 根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getDefaultInstance(props);
            session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
    
            // 3. 创建一封邮件
            MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
    
            // 也可以保持到本地查看
            // message.writeTo(file_out_put_stream);
    
            // 4. 根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();
    
            // 5. 使用 邮箱账号 和 密码 连接邮件服务器
            //    这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错
            transport.connect(myEmailAccount, myEmailPassword);
    
            // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
    
            // 7. 关闭连接
            transport.close();
        }
    
        /**
         * 创建一封复杂邮件(文本+图片+附件)
         */
        public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
            // 1. 创建邮件对象
            MimeMessage message = new MimeMessage(session);
    
            // 2. From: 发件人
            message.setFrom(new InternetAddress(sendMail, "我的测试邮件_发件人昵称", "UTF-8"));
    
            // 3. To: 收件人(可以增加多个收件人、抄送、密送)
            message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, "我的测试邮件_收件人昵称", "UTF-8"));
    
            // 4. Subject: 邮件主题
            message.setSubject("TEST邮件主题(文本+图片+附件)", "UTF-8");
    
            /*
             * 下面是邮件内容的创建:
             */
    
            // 5. 创建图片“节点”
            MimeBodyPart image = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("FairyTail.jpg")); // 读取本地文件
            image.setDataHandler(dh);                   // 将图片数据添加到“节点”
            image.setContentID("image_fairy_tail");     // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
    
            // 6. 创建文本“节点”
            MimeBodyPart text = new MimeBodyPart();
            //    这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
            text.setContent("这是一张图片<br/><img src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");
    
            // 7. (文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
            MimeMultipart mm_text_image = new MimeMultipart();
            mm_text_image.addBodyPart(text);
            mm_text_image.addBodyPart(image);
            mm_text_image.setSubType("related");    // 关联关系
    
            // 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
            //    最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
            //    上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
            MimeBodyPart text_image = new MimeBodyPart();
            text_image.setContent(mm_text_image);
    
            // 9. 创建附件“节点”
            MimeBodyPart attachment = new MimeBodyPart();
            DataHandler dh2 = new DataHandler(new FileDataSource("妖精的尾巴目录.doc"));  // 读取本地文件
            attachment.setDataHandler(dh2);                                             // 将附件数据添加到“节点”
            attachment.setFileName(MimeUtility.encodeText(dh2.getName()));              // 设置附件的文件名(需要编码)
    
            // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text_image);
            mm.addBodyPart(attachment);     // 如果有多个附件,可以创建多个多次添加
            mm.setSubType("mixed");         // 混合关系
    
            // 11. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
            message.setContent(mm);
    
            // 12. 设置发件时间
            message.setSentDate(new Date());
    
            // 13. 保存上面的所有设置
            message.saveChanges();
    
            return message;
        }
    
    }





    展开全文
  • php实现发送邮件,ssl版,QQ邮箱可用,有些同学的实现不...现在我们先贴上邮箱发送的类代码 &lt;?php /** * 一个简单的PHP SMTP 发送邮件类 */ class Lib_Smtp { /** * @var string 邮件传输代理用户名 *...

    php实现发送邮件,ssl版,QQ邮箱可用,有些同学的实现不了是因为端口用的默认的25,阿里云服务器屏蔽了25端口,现在我们用465端口,亲测可用,已经解决各种问题

    现在我们先贴上邮箱发送的类代码

    <?php
    /**
     * 一个简单的PHP SMTP 发送邮件类
     */
    
    class Lib_Smtp {
        /**
         * @var string 邮件传输代理用户名
         * @access private
         */
        private $_userName;
    
        /**
         * @var string 邮件传输代理密码
         * @access private
         */
        private $_password;
    
        /**
         * @var string 邮件传输代理服务器地址
         * @access private
         */
        private $_sendServer;
    
        /**
         * @var int 邮件传输代理服务器端口
         * @access private
         */
        private $_port;
    
        /**
         * @var string 发件人
         * @access protected
         */
        protected $_from;
    
        /**
         * @var string 收件人
         * @access protected
         */
        protected $_to;
    
        /**
         * @var string 抄送
         * @access protected
         */
        protected $_cc;
    
        /**
         * @var string 秘密抄送
         * @access protected
         */
        protected $_bcc;
    
        /**
         * @var string 主题
         * @access protected
         */
        protected $_subject;
    
        /**
         * @var string 邮件正文
         * @access protected
         */
        protected $_body;
    
        /**
         * @var string 附件
         * @access protected
         */
        protected $_attachment;
    
        /**
         * @var reource socket资源
         * @access protected
         */
        protected $_socket;
    
        /**
         * @var reource 是否是安全连接
         * @access protected
         */
        protected $_isSecurity;
    
        /**
         * @var string 错误信息
         * @access protected
         */
        protected $_errorMessage;
    
        protected $_debug = false;
        /*输出调试信息*/
        private function debug($msg){
            if($this->_debug){
                echo $msg ,'<br>',"\n";
            }
        }
        public function setDebug($val=true){
            $this->_debug=$val;
        }
    
        /**
         * 设置邮件传输代理,如果是可以匿名发送有邮件的服务器,只需传递代理服务器地址就行
         * @access public
         * @param string $server 代理服务器的ip或者域名
         * @param string $username 认证账号
         * @param string $password 认证密码
         * @param int $port 代理服务器的端口,smtp默认25号端口
         * @param boolean $isSecurity 到服务器的连接是否为安全连接,默认false
         * @return boolean
         */
        public function setServer($server, $username="", $password="", $port=25, $isSecurity=false) {
            $this->_sendServer = $server;
            $this->_port = $port;
            $this->_isSecurity = $isSecurity;
            $this->_userName = empty($username) ? "" : base64_encode($username);
            $this->_password = empty($password) ? "" : base64_encode($password);
            return true;
        }
    
        /**
         * 设置发件人
         * @access public
         * @param string $from 发件人地址
         * @return boolean
         */
        public function setFrom($from) {
            $this->_from = $from;
            return true;
        }
    
        /**
         * 设置收件人,多个收件人,调用多次.
         * @access public
         * @param string $to 收件人地址
         * @return boolean
         */
        public function setReceiver($to) {
            if(isset($this->_to)) {
                if(is_string($this->_to)) {
                    $this->_to = array($this->_to);
                    $this->_to[] = $to;
                    return true;
                }
                elseif(is_array($this->_to)) {
                    $this->_to[] = $to;
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                $this->_to = $to;
                return true;
            }
        }
    
        /**
         * 设置抄送,多个抄送,调用多次.
         * @access public
         * @param string $cc 抄送地址
         * @return boolean
         */
        public function setCc($cc) {
            if(isset($this->_cc)) {
                if(is_string($this->_cc)) {
                    $this->_cc = array($this->_cc);
                    $this->_cc[] = $cc;
                    return true;
                }
                elseif(is_array($this->_cc)) {
                    $this->_cc[] = $cc;
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                $this->_cc = $cc;
                return true;
            }
        }
    
        /**
         * 设置秘密抄送,多个秘密抄送,调用多次
         * @access public
         * @param string $bcc 秘密抄送地址
         * @return boolean
         */
        public function setBcc($bcc) {
            if(isset($this->_bcc)) {
                if(is_string($this->_bcc)) {
                    $this->_bcc = array($this->_bcc);
                    $this->_bcc[] = $bcc;
                    return true;
                }
                elseif(is_array($this->_bcc)) {
                    $this->_bcc[] = $bcc;
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                $this->_bcc = $bcc;
                return true;
            }
        }
    
        /**
         * 设置邮件附件,多个附件,调用多次
         * @access public
         * @param string $file 文件地址
         * @return boolean
         */
        public function addAttachment($file) {
            if(!file_exists($file)) {
                $this->_errorMessage = "file " . $file . " does not exist.";
                return false;
            }
            if(isset($this->_attachment)) {
                if(is_string($this->_attachment)) {
                    $this->_attachment = array($this->_attachment);
                    $this->_attachment[] = $file;
                    return true;
                }
                elseif(is_array($this->_attachment)) {
                    $this->_attachment[] = $file;
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                $this->_attachment = $file;
                return true;
            }
        }
    
        /**
         * 设置邮件信息
         * @access public
         * @param string $body 邮件主题
         * @param string $subject 邮件主体内容,可以是纯文本,也可是是HTML文本
         * @return boolean
         */
        public function setMail($subject, $body) {
            $this->_subject = $subject;
            $this->_body = base64_encode($body);
            return true;
        }
    
        /**
         * 发送邮件
         * @access public
         * @return boolean
         */
        public function send() {
            $command = $this->getCommand();
    
            $this->_isSecurity ? $this->socketSecurity() : $this->socket();
    
            foreach ($command as $value) {
                $result = $this->_isSecurity ? $this->sendCommandSecurity($value[0], $value[1]) : $this->sendCommand($value[0], $value[1]);
                if($result) {
                    continue;
                }
                else{
                    return false;
                }
            }
    
            //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放
            $this->_isSecurity ? $this->closeSecutity() : $this->close();
            return true;
        }
    
        /**
         * 返回错误信息
         * @return string
         */
        public function error(){
            if(!isset($this->_errorMessage)) {
                $this->_errorMessage = "";
            }
            return $this->_errorMessage;
        }
    
        /**
         * 返回mail命令
         * @access protected
         * @return array
         */
        protected function getCommand() {
            $separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); //分隔符
    
            $command = array(
                array("HELO sendmail\r\n", 250)
            );
            if(!empty($this->_userName)){
                $command[] = array("AUTH LOGIN\r\n", 334);
                $command[] = array($this->_userName . "\r\n", 334);
                $command[] = array($this->_password . "\r\n", 235);
            }
    
            //设置发件人
            $command[] = array("MAIL FROM: <" . $this->_from . ">\r\n", 250);
            $header = "FROM: <" . $this->_from . ">\r\n";
    
            //设置收件人
            if(is_array($this->_to)) {
                $count = count($this->_to);
                for($i=0; $i<$count; $i++){
                    $command[] = array("RCPT TO: <" . $this->_to[$i] . ">\r\n", 250);
                    if($i == 0){
                        $header .= "TO: <" . $this->_to[$i] .">";
                    }
                    elseif($i + 1 == $count){
                        $header .= ",<" . $this->_to[$i] .">\r\n";
                    }
                    else{
                        $header .= ",<" . $this->_to[$i] .">";
                    }
                }
            }
            else{
                $command[] = array("RCPT TO: <" . $this->_to . ">\r\n", 250);
                $header .= "TO: <" . $this->_to . ">\r\n";
            }
    
            //设置抄送
            if(isset($this->_cc)) {
                if(is_array($this->_cc)) {
                    $count = count($this->_cc);
                    for($i=0; $i<$count; $i++){
                        $command[] = array("RCPT TO: <" . $this->_cc[$i] . ">\r\n", 250);
                        if($i == 0){
                            $header .= "CC: <" . $this->_cc[$i] .">";
                        }
                        elseif($i + 1 == $count){
                            $header .= ",<" . $this->_cc[$i] .">\r\n";
                        }
                        else{
                            $header .= ",<" . $this->_cc[$i] .">";
                        }
                    }
                }
                else{
                    $command[] = array("RCPT TO: <" . $this->_cc . ">\r\n", 250);
                    $header .= "CC: <" . $this->_cc . ">\r\n";
                }
            }
    
            //设置秘密抄送
            if(isset($this->_bcc)) {
                if(is_array($this->_bcc)) {
                    $count = count($this->_bcc);
                    for($i=0; $i<$count; $i++){
                        $command[] = array("RCPT TO: <" . $this->_bcc[$i] . ">\r\n", 250);
                        if($i == 0){
                            $header .= "BCC: <" . $this->_bcc[$i] .">";
                        }
                        elseif($i + 1 == $count){
                            $header .= ",<" . $this->_bcc[$i] .">\r\n";
                        }
                        else{
                            $header .= ",<" . $this->_bcc[$i] .">";
                        }
                    }
                }
                else{
                    $command[] = array("RCPT TO: <" . $this->_bcc . ">\r\n", 250);
                    $header .= "BCC: <" . $this->_bcc . ">\r\n";
                }
            }
    
            //主题
            $header .= "Subject: " . $this->_subject ."\r\n";
            if(isset($this->_attachment)) {
                //含有附件的邮件头需要声明成这个
                $header .= "Content-Type: multipart/mixed;\r\n";
            }
            elseif(false){
                //邮件体含有图片资源的需要声明成这个
                $header .= "Content-Type: multipart/related;\r\n";
            }
            else{
                //html或者纯文本的邮件声明成这个
                $header .= "Content-Type: multipart/alternative;\r\n";
            }
    
            //邮件头分隔符
            $header .= "\t" . 'boundary="' . $separator . '"';
            $header .= "\r\nMIME-Version: 1.0\r\n";
            $header .= "\r\n--" . $separator . "\r\n";
            $header .= "Content-Type:text/html; charset=utf-8\r\n";
            $header .= "Content-Transfer-Encoding: base64\r\n\r\n";
            $header .= $this->_body . "\r\n";
            $header .= "--" . $separator . "\r\n";
    
            //加入附件
            if(isset($this->_attachment) && !empty($this->_attachment)){
                if(is_array($this->_attachment)){
                    $count = count($this->_attachment);
                    for($i=0; $i<$count; $i++){
                        $header .= "\r\n--" . $separator . "\r\n";
                        $header .= "Content-Type: " . $this->getMIMEType($this->_attachment[$i]) . '; name="' . basename($this->_attachment[$i]) . '"' . "\r\n";
                        $header .= "Content-Transfer-Encoding: base64\r\n";
                        $header .= 'Content-Disposition: attachment; filename="' . basename($this->_attachment[$i]) . '"' . "\r\n";
                        $header .= "\r\n";
                        $header .= $this->readFile($this->_attachment[$i]);
                        $header .= "\r\n--" . $separator . "\r\n";
                    }
                }
                else{
                    $header .= "\r\n--" . $separator . "\r\n";
                    $header .= "Content-Type: " . $this->getMIMEType($this->_attachment) . '; name="' . basename($this->_attachment) . '"' . "\r\n";
                    $header .= "Content-Transfer-Encoding: base64\r\n";
                    $header .= 'Content-Disposition: attachment; filename="' . basename($this->_attachment) . '"' . "\r\n";
                    $header .= "\r\n";
                    $header .= $this->readFile($this->_attachment);
                    $header .= "\r\n--" . $separator . "\r\n";
                }
            }
    
            //结束邮件数据发送
            $header .= "\r\n.\r\n";
    
    
            $command[] = array("DATA\r\n", 354);
            $command[] = array($header, 250);
            $command[] = array("QUIT\r\n", 221);
    
            return $command;
        }
    
        /**
         * 发送命令
         * @access protected
         * @param string $command 发送到服务器的smtp命令
         * @param int $code 期望服务器返回的响应吗
         * @return boolean
         */
        protected function sendCommand($command, $code) {
            //debug('Send command:' . $command . ',expected code:' . $code );
            //发送命令给服务器
            try{
                if(socket_write($this->_socket, $command, strlen($command))){
    
                    //当邮件内容分多次发送时,没有$code,服务器没有返回
                    if(empty($code))  {
                        return true;
                    }
    
                    //读取服务器返回
                    $data = trim(socket_read($this->_socket, 1024));
                    //debug( 'response:' . $data);
    
                    if($data) {
                        $pattern = "/^".$code."/";
                        if(preg_match($pattern, $data)) {
                            return true;
                        }
                        else{
                            $this->_errorMessage = "Error:" . $data . "|**| command:";
                            return false;
                        }
                    }
                    else{
                        $this->_errorMessage = "Error:" . socket_strerror(socket_last_error());
                        return false;
                    }
                }
                else{
                    $this->_errorMessage = "Error:" . socket_strerror(socket_last_error());
                    return false;
                }
            }catch(Exception $e) {
                $this->_errorMessage = "Error:" . $e->getMessage();
            }
        }
    
        /**
         * 发送命令
         * @access protected
         * @param string $command 发送到服务器的smtp命令
         * @param int $code 期望服务器返回的响应吗
         * @return boolean
         */
        protected function sendCommandSecurity($command, $code) {
            //debug('Send command:' . $command . ',expected code:' . $code );
            try {
                if(fwrite($this->_socket, $command)){
                    //当邮件内容分多次发送时,没有$code,服务器没有返回
                    if(empty($code))  {
                        return true;
                    }
                    //读取服务器返回
                    $data = trim(fread($this->_socket, 1024));
                    //debug( 'response:' . $data );
    
                    if($data) {
                        $pattern = "/^".$code."/";
                        if(preg_match($pattern, $data)) {
                            return true;
                        }
                        else{
                            $this->_errorMessage = "Error:" . $data . "|**| command:";
                            return false;
                        }
                    }
                    else{
                        return false;
                    }
                }
                else{
                    $this->_errorMessage = "Error: " . $command . " send failed";
                    return false;
                }
            }catch(Exception $e) {
                $this->_errorMessage = "Error:" . $e->getMessage();
            }
        }
    
        /**
         * 读取附件文件内容,返回base64编码后的文件内容
         * @access protected
         * @param string $file 文件
         * @return mixed
         */
        protected function readFile($file) {
            if(file_exists($file)) {
                $file_obj = file_get_contents($file);
                return base64_encode($file_obj);
            }
            else {
                $this->_errorMessage = "file " . $file . " dose not exist";
                return false;
            }
        }
    
        /**
         * 获取附件MIME类型
         * @access protected
         * @param string $file 文件
         * @return mixed
         */
        protected function getMIMEType($file) {
            if(file_exists($file)) {
                $mime = mime_content_type($file);
                if(! preg_match("/gif|jpg|png|jpeg/", $mime)){
                    $mime = "application/octet-stream";
                }
                return $mime;
            }
            else {
                return false;
            }
        }
    
        /**
         * 建立到服务器的网络连接
         * @access private
         * @return boolean
         */
        private function socket() {
            //创建socket资源
            $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
    
            if(!$this->_socket) {
                $this->_errorMessage = socket_strerror(socket_last_error());
                return false;
            }
    
            socket_set_block($this->_socket);//设置阻塞模式
    
            //连接服务器
            if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {
                $this->_errorMessage = socket_strerror(socket_last_error());
                return false;
            }
            $str = socket_read($this->_socket, 1024);
            if(!strpos($str, "220")){
                $this->_errorMessage = $str;
                return false;
            }
    
            return true;
        }
    
        /**
         * 建立到服务器的SSL网络连接
         * @access private
         * @return boolean
         */
        private function socketSecurity() {
            $remoteAddr = "tcp://" . $this->_sendServer . ":" . $this->_port;
            $this->_socket = stream_socket_client($remoteAddr, $errno, $errstr, 30);
            if(!$this->_socket){
                $this->_errorMessage = $errstr;
                return false;
            }
    
            //设置加密连接,默认是ssl,如果需要tls连接,可以查看php手册stream_socket_enable_crypto函数的解释
            stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
    
            stream_set_blocking($this->_socket, 1); //设置阻塞模式
            $str = fread($this->_socket, 1024);
            if(!strpos($str, "220")){
                $this->_errorMessage = $str;
                return false;
            }
    
            return true;
        }
    
        /**
         * 关闭socket
         * @access private
         * @return boolean
         */
        private function close() {
            if(isset($this->_socket) && is_object($this->_socket)) {
                $this->_socket->close();
                return true;
            }
            $this->_errorMessage = "No resource can to be close";
            return false;
        }
    
        /**
         * 关闭安全socket
         * @access private
         * @return boolean
         */
        private function closeSecutity() {
            if(isset($this->_socket) && is_object($this->_socket)) {
                stream_socket_shutdown($this->_socket, STREAM_SHUT_WR);
                return true;
            }
            $this->_errorMessage = "No resource can to be close";
            return false;
        }
    }
    

    下面贴出咱的引用发送邮箱类代码

    public function channelMail()
        {
            $mail = new Lib_Smtp();
    
            $mail->setServer("smtp.qq.com", "123456@qq.com", "mima",465,true); //参数1(qq邮箱使用smtp.qq.com,qq企业邮箱使用smtp.exmail.qq.com),参数2(邮箱登陆账号),参数3(邮箱登陆密码,也有可能是独立密码,就是开启pop3/smtp时的授权码),参数4(默认25,腾云服务器屏蔽25端口,所以用的465),参数5(是否开启ssl,用465就得开启)//$mail->setServer("XXXXX", "joffe@XXXXX", "XXXXX", 465, true);
            $mail->setFrom("123456@qq.com"); //发送者邮箱
            $mail->setReceiver("123456789@qq.com"); //接收者邮箱
            $mail->addAttachment(""); //Attachment 附件,不用可注释
            $mail->setMail("测试一下", "<b>测试</b>"); //标题和内容
            $mail->send();//可以var_dump一下,发送成功会返回true,失败false
        }
    

    小结:
    使用QQ邮箱的话,需要开启POP3和SMTP服务。开启方式如下
    QQ邮箱 > 设置 > 账户>开启服务:POP3和SMTP服务

    需要 PHP 的 sockets 扩展支持,而登录 QQ 邮箱 SMTP 服务器则必须通过 SSL 加密,故 PHP 还得包含 openssl 的支持。

    展开全文
  • CAN为什么会发送失败

    千次阅读 2017-10-28 09:54:21
    CAN总线调试过程中出现报文发送失败,很工程师都对此只知其一不知其二,这里就CAN报文发送失败的问题我们来做一探讨。 在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样...

    CAN总线调试过程中出现报文发送失败,很多工程师都对此只知其一不知其二,这里就CAN报文发送失败的问题我们来做一次探讨。


    在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样的,表1是一个正常标准数据帧的报文组成。

    表 1 标准数据帧报文格式组成

    图 1 标准数据帧格式

    CAN总线是一种基于广播的通讯方式,为了保证总线上的每一个正常节点都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前要作出应答,这也是报文里ACK存在的原因。


    一帧CAN报文中ACK段长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimter)。在应答场里,发送站发送两个隐性位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)期间(发送ACK信号)向发送器发送一“显性”的位以示应答。


    应答间隙:所有接收到匹配CRC序列(CRC SEQUENCE)的站会在应答间隙(ACK Slot)期间用一显性的位写入发送器的隐性位来作出回答。


    应答界定符:ACK界定符是ACK场的第二个位,并且是一个必须为隐性的位。因此,应答间隙(ACK Slot)被两个隐性的位所包围,也就是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。

    图 2 正常ACK段报文

    而如果总线上没有ACK应答(即应答间隙为隐性),发送器就会发送一个错误标志,并且发送错误计数器值加8,节点就会对报文进行自动重发,若自动重发依然收不到ACK,则在发送错误计数器计数满128后(即出现16帧错误帧),由错误主动转为错误被动状态,如图3所示。

    那导致ACK段出错的原因有哪些呢?

    · 总线上只有一个有效节点:发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。所以,当总线上只有一个有效节点时,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK Slot没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。


    · 波特率不匹配或者节点没有初始化,导致没有ACK;

    · 总线线缆短路,断路,接反;

    · 高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。

    图 3 应答界定符错误帧

    图 4 没有ACK的报文

    当你在调试CAN总线时出现节点发送报文失败的情况时,一定要检查是不是以上几点疏漏导致你的总线上ACK异常。而借助恰当的仪器,可以在查找CAN总线错误时事半功倍。图4即采用致远电子的CANScope来对错误帧进行标记,同时找到错误帧对应的波形来查找出错误情况。CANScope还可以对CAN总线物理层、数据链路层、应用层做一系列的测试,为CAN工程师解决测试难题。


    图 5 CANScope测试项目


    转载自:http://www.eeworld.com.cn/qrs/article_2017072036072.html

    展开全文
  • 配置邮箱主要有三种 三大发送模式: 1、简单发送(mail.catchall.domain不设置) 直接用发送账号发出,发件人需要与发送账号相同或者是其同一账号下的其他别名,否则会被邮件系统拒绝,如SMTPSenderRefused: 501 ...

    配置邮箱主要有三种

    三大发送模式:
    1、简单发送(mail.catchall.domain不设置)
    直接用发送账号发出,发件人需要与发送账号相同或者是其同一账号下的其他别名,否则会被邮件系统拒绝,如SMTPSenderRefused: 501 mail from address must be same as authorization user test@renjie.me。接收方也直接回复该真实地址,非常容易理解,属于最原始的模式,最适合做邮件通知这种只集成发送不用集成接收的情况

    2、代理发送(mail.catchall.domain设置,mail.bounce.alias不设置)
    间接用postmaster-odoo账号代发出,发送账号需要具有该名称授权,否则也会被邮件系统拒绝,如SMTPSenderRefused: 501 mail from address must be same as authorization user postmaster-odoo@renjie.me。接收方默认回复catchall专用地址,由于属于代发,且发件地址、代发地址、回复地址都可以不相同,第一次使用还会有些颠覆邮箱观,甚至某些客户端出于谨慎还会出现欺诈提醒,但这确是目前国内用的最多的务实模式,大部分教程都是以此展开详解

    3、反弹发送(mail.catchall.domain设置,mail.bounce.alias设置)
    间接用bounce地址代发出,如bounce+5-res.users-2@renjie.me或者bounce+5@renjie.me,其中+5为邮件流水号,-2为单据流水号,可见前者还是单据相关邮件,接收方也默认回复catchall专用地址,因为其涉及到邮件接收等相关知识,而且国内免费邮箱服务基本没有完美支持,本文将不深入探讨,待以后ODOO邮件接收集成的时候在讨论如何配合Postfix实现完美收发自如

    现在我们公司的需求:1,新建立有用户,邀请用户等系统相关邮箱是统一配置邮箱代发,(如:crmadmin@xx.com)

                                        2,创建订单时,销售人员发送给客户或者其他用户,要选择联系人或者用户(新建时必须填写邮箱)

                                        3,发送后,用户查看直接回复到发送人(如果没有配置好,默认是catchall@xx.com)

    处理邮箱问题

    1)修改程序代码,这里路径是按照默认安装的的,如你有改掉自己换路径

    打开: cd /opt/odoo12/odoo/odoo/addons/base/models/

    先备份一下

    cp  ir_mail_server.py ir_mail_server.py_bak
    vi ir_mail_server.py 

    找到:smtp_from = from_rfc2822

    主要缩进和英文符号

    修改成:smtp_from = "crmadmin@xx.com"  

    系统页面有一处也要对于的修改,把代码修改完后,启动修改相关参数

    页面修改: 应用---》设置----》-----》常规设置-----》邮件发送服务器

    新增一个邮箱:crmadmin@xx.com(这里和上面代码修改的邮箱要一致,如果有多个,系统默认选择第一个和代码去对比,不然报错)

    注意:阿里的邮箱默认是开通smtp,163要登录开通,QQ要短信开通

    测试是否能拼接成功,

    2)如果还想要回复邮箱是发送人,不是catchall@xx.com

    打开: cd /opt/odoo12/odoo/odoo/addons/base/models/
    vi ir_mail_server.py 

    查找: _get_default_bounce_address

    把整个发放都替换了

    '''Compute the default bounce address.
    
    The default bounce address is used to set the envelop address if no
    envelop address is provided in the message.  It is formed by properly
    joining the parameters "mail.bounce.alias" and
    "mail.catchall.domain".
    
    If "mail.bounce.alias" is not set it defaults to "postmaster-odoo".
    
    If "mail.catchall.domain" is not set, return None.
    
    
    
    get_param = self.env['ir.config_parameter'].sudo().get_param
    postmaster = get_param('mail.bounce.alias', default='postmaster-odoo')
    domain = get_param('mail.catchall.domain')
    if postmaster and domain:
        return '%s@%s' % (postmaster, domain)
     '''
    email_from =tools.config.get('email_from')
    return  email_from

    你也可以把以前的注释起来,后面添加,注意缩进

    email_from =tools.config.get('email_from')

    return email_from

    页面修改: 设置---》激活开发者模式---》刷新应用-----》技术----》系统参数

    删除:mail.catchall.domain  , mail.bounce.alias ,mail.bounce.alias (一共三个)

     

     

     

     

     

     

     

     

     

     

    展开全文
  • C# 谷歌邮箱发送邮件

    千次阅读 2021-03-27 15:53:45
    C# 谷歌邮箱发送邮件1.介绍2.谷歌账号及邮箱配置过程3.代码4.本地调试以及发布生产后可能出现的问题 1.介绍 记录一下,那些年踩过的坑! 2.谷歌账号及邮箱配置过程 第一步:设置gmail邮箱账号,登录进google.com谷歌...
  • python通过163邮箱发送email邮件

    千次阅读 2018-04-11 14:55:23
    发送邮件代码 # !/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方 SMTP 服务 mail_host = "smtp.163.c.....
  • 发送邮箱实现找回密码

    千次阅读 2015-08-15 10:07:25
    2.登录你的邮箱手动开启STMP服务,这个服务默认是关闭的,一定要去邮箱->设置里去手动开启,开启时要求你设置一个独立密码,这个密码就是写在 'MAIL_PASSWORD'=>' ', // 邮箱密码,的密码而不是邮箱登录密码 3、...
  • Contact Form 7邮件发送失败的解决办法

    千次阅读 2017-02-24 19:45:35
    Contact Form 7邮件发送失败的解决办法 一、contact form 7无法发送邮件的原因 对mail()函数的不支持。 Contact Form 7表单提交失败在使用过程中会出现,归根结底原因在于wordpress主机问题,由于国 内很...
  • PHPMailer向QQ邮箱发送邮件

    万次阅读 2017-09-24 12:00:28
    PHPMailer向QQ邮箱发送邮件
  • 1、首先开通POP3/SMTP服务,qq邮箱——帐号——设置,找到POP3/SMTP点开启,输入短信会有授权码,复制好,发送邮件需要用到 2、下载phpmailer:https://github.com/PHPMailer/PHPMailer 下载后只取用到的: ...
  • 最近几天有人需要帮忙做一个关于发送验证码的功能,之前没有做过,于是我鼓捣一阵子,记录一下关于web项目中注册登录常用的手机验证码和邮箱验证码的发送。 作为一个演示项目,我没有使用任何框架,用了一个简单的...
  • 使用 PHPMailer 配合 QQ邮箱 发送邮件

    千次阅读 2017-02-19 20:02:18
    phpMailer QQ邮箱
  • 解决Python发送邮件失败问题

    千次阅读 2020-07-04 09:50:20
    Python 实现简单的邮件发送 python菜鸟教程中邮件发送代码如下: sender = '1507376157@qq.com' receivers = ['429240967@qq.com'] # 接收邮件 # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 ...
  • 其实PHP邮箱发送功能并非每个项目都一定用得到,但其实每个完整的项目,一般都会包含一个PHP邮箱发送功能。 一般邮箱发送功能普遍用于注册激活,密码找回,以及留言回复等等功能上。而且这也是很多人头疼的问题,...
  • 网站发送邮箱验证实现找回密码

    千次阅读 2018-10-13 20:07:05
    邮件发送程序将把邮件发送给自己网站的SMTP服务器,该SMTP服务器收到邮件后,将根据收件人的地址在将邮件的目的地,要么是投递到本地域管理的收件人邮箱中,要么是转交给管理收件人地址域的其他SMTP服务器 ...
  • 作为PHP入门开发者,常常有这种述求:自己的网站中需要添加一个使用自己的域名作为发件人邮件地址的自动发送邮件的方法,用于诸如给用户发送验证码、通知信息等。比如:我的某个用户注册模块,需要使用register@...
  • 1、首先开通POP3/SMTP服务,qq邮箱——帐号——设置,找到POP3/SMTP点开启,输入短信会有授权码,复制好,发送邮件需要用到2、下载phpmailer:https://github.com/PHPMailer/PHPMailer下载后只取用到的:class....
  • 邮件发送协议SMTP问题排查

    千次阅读 2019-04-08 09:24:28
    项目中需要用到smtp协议来发送邮件告警,后端的技术栈主要是Java和C++,Java项目里直接在网上找的现成的类完美实现,163邮箱,腾讯邮箱和阿里邮箱均测试通过,不幸的是C++的项目也需要使用smtp协议来发送邮件,惯例...
  • 本人第一在thinkphp3.2中使用phpmailer,依据查到的信息,线下配置可用,但是传到线上时就出了问题,各种调试都不起作用,在搁置一段时间后重新查找问题,找到解决方法。现在讲方法写出来供大家参考。 一:下载...
  • 小编公司所有的是腾讯企业邮箱,因为公司自动化 所以总是自动给邮箱发送多余的邮件,但是有必须需要接收,于是小编写了一个脚本,定时清理这个邮件。 二、思路 首先,登录肯定是破不了的,于是小编采用的是...
  • 转眼间博客竟然这么久没更新了,罪过罪过…这两天在用Volley框架,但是当我使用JsonObjectRequest发送Post请求时,竟然失效了。服务器一直响应失败,搞了半天,在StackOverFlow上找到了类似的问题,终于解决掉了。 ...
  • thinkcmf 邮箱获取发送的邮件(验证码)

    千次阅读 2017-10-06 16:33:37
    可运行在任何平台之上支持SMTP验证发送邮时指定个收件人,抄送地址,暗送地址和回复地址;注:添加抄送、暗送仅win平台下smtp方式支持支持多种邮件编码包括:8bit,base64,binary和quoted-printable支持冗余SMTP...
  • .net发送邮件失败的部分解决方法

    千次阅读 2006-08-01 19:10:00
    最近使用.net的System.Web.Mail发送邮件在服务器上失败,经过多次尝试,终于解决了这个问题:一般System.Web.Mail是.net自带的发送邮件的库.但发现失败的原因有几种,贴出来给大家参考一下: void Page_Load() { // 使用...
  • 【Web技术】网站留言系统开发,及留言信息实时发送至指定邮箱 关键字:HTML PHP JavaScript CSS 文章目录【Web技术】网站留言系统开发,及留言信息实时发送至指定邮箱0 简述1 背景及需求分析2 可行性研究3 基础...
  • 与普通进行大面积邮件发送营销的不同,QQ群邮件的发送成本很低,一次发送,就可以使得群里面成千上百的人都收到邮件,比普通邮件发送的模式和准确率都好很。用手工登录QQ邮箱发送邮件是一种无奈的选择,效率并不高...
  • 实现向邮箱发送随机生成验证码,修改用户密码的功能; JavaScript实现ajax异步请求; 动态判断两密码是否一致; 使用session存储验证码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,164
精华内容 9,265
关键字:

企业邮箱多次发送失败