首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用curl c++发送电子邮件

使用curl c++发送电子邮件
EN

Stack Overflow用户
提问于 2022-06-16 14:23:30
回答 2查看 291关注 0票数 0

我试着用curl c++发送电子邮件,我很好地登录了,当我运行程序时,它运行良好,不会抛出任何错误,但电子邮件永远不会来。

这是我的密码:

代码语言:javascript
复制
#include <iostream>
#include <curl/curl.h>

static const char *payload_text =
  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n"
  "To: " "mailto" "\r\n"
  "From: " "mymail" "\r\n"
  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
  "rfcpedant.example.org>\r\n"
  "Subject: SMTP example message\r\n"
  "\r\n" /* empty line to divide headers from body, see RFC5322 */
  "The body of the message starts here.\r\n"
  "\r\n"
  "It could be a lot of lines, could be MIME encoded, whatever.\r\n"
  "Check RFC5322.\r\n";

size_t read_function(char *buffer, size_t size, size_t nmemb,char *data)
{
    size_t len;
    if(size == 0 or nmemb == 0)
    {
        return 0;
    }
    if(data)
    {
        len = strlen(data);
        memcpy(buffer, data, len);
        return len;
    }
    return 0;  
}

int main()
{
    CURL *curl;
    CURLcode res = CURLE_OK;
    const char *data = payload_text;
 
    curl = curl_easy_init();
    if(curl) 
    {
        curl_easy_setopt(curl, CURLOPT_USERNAME, "mymail"); 
        curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");
        curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587");
        curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "my mail");
        curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, "mailto");
        curl_easy_setopt(curl, CURLOPT_READDATA,payload_text);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_function);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
        curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
    }
    res = curl_easy_perform(curl);
    
    if(res != CURLE_OK)
    {
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
        curl_easy_strerror(res));
        curl_easy_cleanup(curl);
    }
    return 0;
}

我认为问题在于卷曲选项READDATA和READUNCTION。在文档中,您必须将数据指针作为参数传递给READDATA。const char *data = payload_text;是数据指针,对吗?

然后,READFUNCTION将返回数据大小的函数作为参数,我认为这就是size_t read_function(char *buffer, size_t size, size_t nmemb,char *data)正在做的事情。

我是新来的,所以任何建议都会对我有好处。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-16 16:32:45

我发现这是一个有用的起点:https://curl.se/libcurl/c/smtp-mail.html

代码有两个主要问题:

  1. 您的read_function没有跟踪读取了多少有效负载,所以它会不断地给出相同的内容,反复地胡言乱语,永远不会发出消息的结束信号。
  2. 您将CURLOPT_MAIL_RCPT设置为一个字符串,而实际上它应该是一个struct curl_slist *,因为可以有多个收件人。

这是一个固定的例子,我在我的电脑上测试了它的工作。在投递之前,修改了文件顶部的私有数据。

代码语言:javascript
复制
#define USERNAME "david"
#define PASSWORD "xxxxx"
#define MAILTO "david@example.com"
#define MAILFROM "you@example.com"
#define SMTP "smtp://your.smtp.server.example.com:25"

#include <stdio.h>
#include <curl/curl.h>

const char * payload_text =
  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n"
  "To: " MAILTO "\r\n"
  "From: " MAILFROM "\r\n"
  "Subject: SMTP example message with libcurl 6\r\n"
  "\r\n"
  "Hello world!\r\n";

struct ReadData
{
  explicit ReadData(const char * str)
  {
    source = str;
    size = strlen(str);
  }

  const char * source;
  size_t size;
};

size_t read_function(char * buffer, size_t size, size_t nitems, ReadData * data)
{
  size_t len = size * nitems;
  if (len > data->size) { len = data->size; }
  memcpy(buffer, data->source, len);
  data->source += len;
  data->size -= len;
  return len;
}

int main()
{
  CURL * curl = curl_easy_init();
  if (!curl)
  {
    fprintf(stderr, "curl_easy_init failed\n");
    return 1;
  }

  curl_easy_setopt(curl, CURLOPT_USERNAME, USERNAME);
  curl_easy_setopt(curl, CURLOPT_PASSWORD, PASSWORD);
  curl_easy_setopt(curl, CURLOPT_URL, SMTP);
  curl_easy_setopt(curl, CURLOPT_MAIL_FROM, MAILFROM);

  struct curl_slist * rcpt = NULL;
  rcpt = curl_slist_append(rcpt, MAILTO);
  curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt);

  ReadData data(payload_text);
  curl_easy_setopt(curl, CURLOPT_READDATA, &data);
  curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_function);

  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
  curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
  curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);

  // If your server doesn't have a proper SSL certificate:
  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);

  CURLcode res = curl_easy_perform(curl);
  if (res != CURLE_OK)
  {
    fprintf(stderr, "curl_easy_perform() failed: %s\n",
      curl_easy_strerror(res));
    curl_easy_cleanup(curl);
  }
  return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2022-06-16 14:57:52

read_function:您正在更改不影响调用方字节缓冲区的本地指针buffer。您应该将数据复制到指定的缓冲区。

代码语言:javascript
复制
memcpy(buffer, data, len);

FYI sizeof(char)保证为1,因此不需要。

另一个问题-函数从不返回信号所有数据被发送的0,它一次又一次地发送相同的数据。您应该在第二个电话中返回0。或将长度设置为选项CURLOPT_POSTFIELDSIZE_LARGE

参见示例smtp-mail.c

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72647450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档