• Rust lettre使用腾讯企业邮箱发送邮件参数配置

    邮件发送这个在Rust中总是有点问题,之前用lettre低版本测试没问题,后来腾讯企业邮箱升级做了一些限制调整,我调了好长时间,终于调通了。

    Cargo.toml

    [dependencies]
    lettre = "0.10"
    

    目前lettre最新版本就是0.10版本了。

    sample.rs

    use lettre::message::header::ContentType;
    use lettre::transport::smtp::authentication::{Credentials, Mechanism};
    use lettre::transport::smtp::client::{TlsParameters, Tls};
    use lettre::{Message, SmtpTransport, Transport};
    use log::{info, warn};
    use crate::router;
    
    fn send_mail(to_addr: &str, subject: &str, body: String) -> anyhow::Result<()> {
      let email: Message = Message::builder()
        .from("Qttc <blog@qttc.net>".parse()?)
        .reply_to("Qttc <blog@qttc.net>".parse()?)
        .to(to_addr.parse()?)
        .subject(subject)
        .header(ContentType::TEXT_HTML)
        .body(body)?;
    
      let creds: Credentials = Credentials::new(
        "[Account]".to_string(),
        "[Password]".to_string(),
      );
    
      let smtp_host: &str = "smtp.exmail.qq.com";
      let tls_params: TlsParameters = TlsParameters::new("exmail.qq.com".to_string())?;
      let tls: Tls = Tls::Wrapper(tls_params);
    
      let mailer: SmtpTransport = SmtpTransport::relay(smtp_host)?
        .port(465)
        .credentials(creds)
        .authentication(vec![Mechanism::Login])
        .tls(tls)
        .build();
    
      match mailer.send(&email) {
        Ok(_) => info!("Email sent {} successfully!", &to_addr),
        Err(e) => warn!("Error sending email {} was error: {}", &to_addr, e),
      };
    
      Ok(())
    }
    

    ...

    READ ALL

  • 用Github Copilot Chat写一个Node.js + H5文件上传的代码

    前两天我就介绍过Github的Copilot X系列,到现在VSCode扩展Copilot Chat已经stable了,可以运行在正常稳定蓝色版本的VSCode里了。

    如果你没有开通Copilot相关的服务的话,需要先到这里开通https://github.com/features/preview/copilot-x,其中Chat服务需要额外申请人工审批,有些人通过的快,有些人通过的慢,快的隔天就收到开通邮件,慢的比如我快两周。总之得收到开通的邮件之后才能在VSCode里安装Github Copilot Chat扩展使用。

    ...

    READ ALL

  • 用免费的GPT4快速帮你写一个剪刀石头布的游戏

    选择针对研发的免费GPT-4

    GPT-4大火让很多人恨不得赶紧订阅试一试,即使20美元一个月也无所谓。如果你今天还没买,并且看到这篇文章,那么我劝你别买了~

    首先第一个就是BitoAI的ChatGPT-4

    VSCode BitoAI ChatGPT-4

    因为OpenAI的ChatGPT-4并不适合研发,相比之下有比它更合适的工具,第一个是BitoAI的VSCode扩展ChatGPT GPT-4,引用一下它家的宣语

    ...

    READ ALL

  • ChatGPT会让码农失业吗?

    为什么会聊起ChatGPT

    今年,完全没有元宇宙了,两年前火的不行,而今年由OpenAI的ChatGPT把GPT推到了人尽皆知的地步。连我日常一些不在科技领域的朋友甚至会主动问我GPT各种问题,加上媒体为了流量火上浇油更是不得了,为了能回答也为了赶上潮流,我特意买了Plus用了一阵,以下说说感受和体会。

    它是一个很强大的语言模型

    对话的模式,以及能联系上下文的方式是干翻传统搜索引擎的核心能力,而要达到对话模式对语义的理解非常重要,首先要能从聊天室的文字中读出诉求,这一点我在测试GPT-3.5或者GPT-4感觉整体非常强大,基本上你正常文字表达与它沟通都没问题。

    ...

    READ ALL

  • 36岁重学编程还有竞争力吗?

    前段时间,有个朋友由于各种原因工作不顺利,36岁的他面临养家压力,他要重回深圳学习编程,问我意见。

    我和他年纪差不多,25岁入这行,做了12年的开发,自然是希望能给这位朋友一点有建设性的建议而不是空虚的客套话,于是我给他说年纪是大了一些,即使跟班学几个月出来投简历时会面临比他小更多的应届毕业生竞争压力,甚至大多数公司愿意招进来一个经验少,基础知识差的重新培养,也不会招一个年纪大的,有管理成本。但这个行业不挑剔,如果本着先就业再慢慢提升的目的,也还是存在机会的,需要比应届生付出更多倍的学习时间拉开与应届毕业生的差距,提升自己的竞争力。

    其实,换做是我,也未必有这么大勇气在36岁转行!

    ...

    READ ALL

  • Rust升级edition到2021

    2021年Rust发布了新的edition,叫做2021。此前的edition是2018年发布的,将近三年才更新了edition,但是如果在往前看的话,是2015,似乎都是三年一更新。

    如果现在项目是一个2018年或者更早的edition,推荐升级到最新的,升级的方法也很简单,先在项目下,执行以下语句

    cargo fix --edition
    

    如果不出错,就打开你的Cargo.toml文件,修改edition的值到2021

    Cargo.toml

    [package]
    name = "qttc"
    version = "1.0.3"
    authors = ["Nicholas Lee"]
    edition = "2021"
    

    ...

    READ ALL

  • Debian错误Can't locate Term/ReadLine.pm

    最近在构建Docker镜像时,总是失败在Can't locate Term/ReadLine.pm,日志如下

    Get:1 http://deb.debian.org/debian bullseye/main amd64 openssl amd64 1.1.1k-1+deb11u1 [851 kB]
    Get:2 http://deb.debian.org/debian bullseye/main amd64 ca-certificates all 20210119 [158 kB]
    debconf: delaying package configuration, since apt-utils is not installed
    Fetched 1009 kB in 25s (41.2 kB/s)
    Selecting previously unselected package openssl.
    (Reading database ... 6772 files and directories currently installed.)
    Preparing to unpack .../openssl_1.1.1k-1+deb11u1_amd64.deb ...
    Unpacking openssl (1.1.1k-1+deb11u1) ...
    Selecting previously unselected package ca-certificates.
    Preparing to unpack .../ca-certificates_20210119_all.deb ...
    Unpacking ca-certificates (20210119) ...
    Setting up openssl (1.1.1k-1+deb11u1) ...
    Setting up ca-certificates (20210119) ...
    debconf: unable to initialize frontend: Dialog
    debconf: (TERM is not set, so the dialog frontend is not usable.)
    debconf: falling back to frontend: Readline
    debconf: unable to initialize frontend: Readline
    debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.32.1 /usr/local/share/perl/5.32.1 /usr/lib/x86_64-linux-gnu/perl5/5.32 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.32 /usr/share/perl/5.32 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
    debconf: falling back to frontend: Teletype
    Updating certificates in /etc/ssl/certs...
    129 added, 0 removed; done.
    Processing triggers for ca-certificates (20210119) ...
    Updating certificates in /etc/ssl/certs...
    0 added, 0 removed; done.
    Running hooks in /etc/ca-certificates/update.d...
    done.
    Removing intermediate container a19d55490057
     ---> d439938bfcf5
    Step 9/10 : COPY --from=0 /usr/src/myapp/target/release/sso .
    invalid from flag value 0: No such image: sha256:d31713282fd49b05c2c5488678d25fc936b2abdde33bf4e71c869adbb419944f
    Build step 'Execute shell' marked build as failure
    Sending e-mails to: lizhong@uino.com
    Finished: FAILURE
    Cleaning up project directory and file based variables
    00:00
    ERROR: Job failed: command terminated with exit code 1
    

    ...

    READ ALL

  • 构建Docker镜像时全局安装NPM包提示permission denied无权限

    full Docker npm install permission denied

    使用NodeJS镜像node在构建Docker镜像时,总是在npm install -g <package_name>全局安装一些包会提权限被拒绝,虽然是以root用户构建,但仍然有这个错误。目前找到的解决方案就是把项目创建在宿主目录/root下,并多加一个环境变量ENV NPM_CONFIG_PREFIX=/root/.npm-global,然后重新构建镜像就不再提示没权限

    ...

    READ ALL

  • RxJS HTTP轮询拉取例子

    full RxJS http poll

    页面上经常需要每几秒钟轮询服务器接口更新页面状态,这种场景多发生在一些监控页面里,如果不用RxJS可能我们这写轮询代码

    const do_request = () => {
      fetch('https://www.qttc.net/api')
        .then((r) => {
          console.log(r);
        });
    };
    
    setInterval(do_request, 2000);
    

    ...

    READ ALL

  • Rust在VSCode中Debug一次经历

    full Rust debug in VSCode case

    当时正在紧张的编写一个快要必须要在下班前演示的程序,结果在读取Cookie信息时出错了,于是我使用VSCode的Debug模式调试程序,这是个灾难的开始。VSCode配置如下

    launch.json

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "(Windows) Boot",
          "type": "cppvsdbg",
          "request": "launch",
          "program": "${workspaceFolder}/target/debug/rust-debug.exe",
          "args": [],
          "stopAtEntry": false,
          "cwd": "${workspaceFolder}",
          "environment": [],
          "console": "externalTerminal"
        }
      ]
    }
    

    ...

    READ ALL