esp8266发送邮件

qq邮箱smtp设置

这里我用qq邮箱作为smtp服务器。开启smtp服务和获取qq授权码参照qq邮箱的官方说明,链接如下:帮助系统

源代码

//To use send Email for qq to port 465 (SSL)
#include <Arduino.h>
#if defined(ESP32)
  #include <WiFi.h>
#elif defined(ESP8266)
  #include <ESP8266WiFi.h>
#endif
#include <ESP_Mail_Client.h>
/* wifi ssid和密码 */
#define WIFI_SSID "xxx"
#define WIFI_PASSWORD "xxxx"
/* qq 邮箱的 smtp 地址和端口号 */
#define SMTP_HOST "smtp.qq.com"
#define SMTP_PORT 465
/* 
你的邮箱和授权码 授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。 
如何获取授权码 https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
*/
#define AUTHOR_EMAIL "xxxx@qq.com"
#define AUTHOR_PASSWORD "xxxxxxx"
/* 接收人邮箱地址 email*/
#define RECIPIENT_EMAIL "xxxxx@qq.com"
/* 定义 smtp session 对象*/
SMTPSession smtp;
/* 获取邮件发送状态的回调函数 */
void getSmtpStatusCallback(SMTP_Status status);
void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("连接 Wifi");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(200);
  }
  Serial.println("");
  Serial.println("WiFi 连接成功.");
  Serial.println("IP 地址: ");
  Serial.println(WiFi.localIP());
  Serial.println();
  /* smtp开启debug,debug信息输出到串口 */
  smtp.debug(1);
  /* 注册回调函数,获取邮件发送状态 */
  smtp.callback(getSmtpStatusCallback);
  ESP_Mail_Session session;
  /* 设置smtp 相关参数, host, port等 */
  session.server.host_name = SMTP_HOST;
  session.server.port = SMTP_PORT;
  session.login.email = AUTHOR_EMAIL;
  session.login.password = AUTHOR_PASSWORD;
  session.login.user_domain = "";
  /* 定义smtp message消息类 */
  SMTP_Message message;
  /* 定义邮件消息类的名称,发件人,标题和添加收件人 */
  message.sender.name = "Esp8266er";
  message.sender.email = AUTHOR_EMAIL;
  message.subject = "Esp8266er Email";
  message.addRecipient("Sara", RECIPIENT_EMAIL);
  /* 设置message html 格式和内容*/
  String htmlMsg = "<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>Sent from Esp8266er</p></div>";
  message.html.content = htmlMsg.c_str();
  message.html.content = htmlMsg.c_str();
  message.text.charSet = "us-ascii";
  message.html.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
  /* 连接smtp服务器 */
  if (!smtp.connect(&session))
    return;
  /* 调用发送邮件函数,失败的话,获取失败信息 */
  if (!MailClient.sendMail(&smtp, &message))
    Serial.println("发送邮件失败,失败原因是 , " + smtp.errorReason());
}
void loop(){
}
/* 获取发送状态的回调函数 */
void getSmtpStatusCallback(SMTP_Status status){
  /* 输出邮件发送状态信息 */
  Serial.println(status.info());
  /*状态获取成功,打印状态信息 */
  if (status.success()){
    Serial.println("----------------");
    
    ESP_MAIL_PRINTF("邮件发送成功个数: %d\n", status.completedCount());
    ESP_MAIL_PRINTF("邮件发送失败个数: %d\n", status.failedCount());
    
    Serial.println("----------------\n");
    struct tm dt;
    for (size_t i = 0; i < smtp.sendingResult.size(); i++){
      /* 依次获取发送邮件状态 */
      SMTP_Result result = smtp.sendingResult.getItem(i);
      time_t ts = (time_t)result.timestamp;
      localtime_r(&ts, &dt);
      ESP_MAIL_PRINTF("收件人: %s邮件发送状态信息\n", result.recipients);
      ESP_MAIL_PRINTF("状态: %s\n", result.completed ? "success" : "failed");
      ESP_MAIL_PRINTF("发送时间: %d/%d/%d %d:%d:%d\n", dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday, dt.tm_hour, dt.tm_min, dt.tm_sec);
      ESP_MAIL_PRINTF("邮件标题: %s\n", result.subject);
    }
    
    Serial.println("----------------\n");
  }
}

串口输出

WiFi 连接成功.
IP 地址: 
192.168.10.93
Connecting to SMTP server...
> C: ESP Mail Client v1.3.1
> C: connect to SMTP server
> C: host > smtp.qq.com
> C: port > 465
> C: smtp server connected
SMTP server connected, wait for greeting...
< S: 220 newxmesmtplogicsvrsza7.qq.com XMail Esmtp QQ Mail Server.
Sending greeting response...
> C: send smtp command, HELO
< S: 250-newxmesmtplogicsvrsza7.qq.com
< S: 250-PIPELINING
< S: 250-SIZE 73400320
< S: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
< S: 250-AUTH=LOGIN
< S: 250-MAILCOMPRESS
< S: 250 8BITMIME
Logging in...
> C: send smtp command, AUTH PLAIN
> C: xxxxx@qq.com
> C: xxxxx@qq.com ****************
< S: 235 Authentication successful
Sending Email...
> C: send Email
Sending message header...
> C: send message header
< S: 250 OK.
< S: 250 OK
Sending message body...
> C: send message body
< S: 354 End data with <CR><LF>.<CR><LF>.
Finishing the message sending...
> C: Finish the message sending
< S: 250 OK: queued as.
Closing the session...
> C: terminate the SMTP session
Message sent successfully
> C: Message sent successfully
----------------
邮件发送成功个数: 1
邮件发送失败个数: 0
----------------
收件人: xxxxxx@qq.com邮件发送状态信息
状态: success
发送时间: 2021/7/14 13:50:24
邮件标题: Esp8266er Email
----------------