EthernetInterface Libraryを使ったSimpleな SMTP ClientLibraryです. LOGIN認証を追加しました.(2014.4 Update) It is SMTPClient Library which is Simple using EthernetInterface Library.

Dependents:   SimpleSMTPClient_HelloWorld USBHost-MSD_Sensors_1 IOT-GPS-SMS IOT_HW_5_websockets ... more

Committer:
sunifu
Date:
Wed Dec 12 08:37:19 2012 +0000
Revision:
2:27053679f44b
Parent:
1:58550f022776
Child:
4:7d16b08a1291
Ver1.02  added parameter domain to sendmail function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sunifu 0:3ea21ce21fe1 1 /*
sunifu 0:3ea21ce21fe1 2 *
sunifu 0:3ea21ce21fe1 3 * mbed Simple SMTP Client
sunifu 0:3ea21ce21fe1 4 * Copyright (c) 2012 Tadao Iida
sunifu 0:3ea21ce21fe1 5 * Released under the MIT License: http://mbed.org/license/mit
sunifu 0:3ea21ce21fe1 6 */
sunifu 0:3ea21ce21fe1 7
sunifu 0:3ea21ce21fe1 8 //Debug is disabled by default
sunifu 0:3ea21ce21fe1 9 #if 0
sunifu 0:3ea21ce21fe1 10 //Enable debug
sunifu 0:3ea21ce21fe1 11 #define __DEBUG__
sunifu 0:3ea21ce21fe1 12 #include <cstdio>
sunifu 2:27053679f44b 13 #define DBG(x, ...) std::printf("[DBG]"x"\r\n", ##__VA_ARGS__);
sunifu 0:3ea21ce21fe1 14
sunifu 0:3ea21ce21fe1 15 #else
sunifu 0:3ea21ce21fe1 16 //Disable debug
sunifu 0:3ea21ce21fe1 17 #define DBG(x, ...)
sunifu 0:3ea21ce21fe1 18
sunifu 0:3ea21ce21fe1 19 #endif
sunifu 0:3ea21ce21fe1 20
sunifu 0:3ea21ce21fe1 21 /** @file
sunifu 0:3ea21ce21fe1 22 * @brief Simple SMTP Client
sunifu 0:3ea21ce21fe1 23 */
sunifu 0:3ea21ce21fe1 24
sunifu 0:3ea21ce21fe1 25 #include "mbed.h"
sunifu 0:3ea21ce21fe1 26 #include "EthernetInterface.h"
sunifu 0:3ea21ce21fe1 27 #include "SimpleSMTPClient.h"
sunifu 0:3ea21ce21fe1 28
sunifu 0:3ea21ce21fe1 29 SimpleSMTPClient::SimpleSMTPClient() : smtp()
sunifu 0:3ea21ce21fe1 30 {
sunifu 0:3ea21ce21fe1 31
sunifu 0:3ea21ce21fe1 32
sunifu 0:3ea21ce21fe1 33 }
sunifu 0:3ea21ce21fe1 34
sunifu 0:3ea21ce21fe1 35
sunifu 0:3ea21ce21fe1 36 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
sunifu 0:3ea21ce21fe1 37 int SimpleSMTPClient::base64enc(const char *input, unsigned int length, char *output, int outputlen) {
sunifu 0:3ea21ce21fe1 38 static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
sunifu 0:3ea21ce21fe1 39 unsigned int c, c1, c2, c3;
sunifu 0:3ea21ce21fe1 40
sunifu 0:3ea21ce21fe1 41 if (outputlen < (((length-1)/3)+1)<<2) return -1;
sunifu 0:3ea21ce21fe1 42
sunifu 0:3ea21ce21fe1 43 for(unsigned int i = 0, j = 0; i<length; i+=3,j+=4) {
sunifu 0:3ea21ce21fe1 44 c1 = ((((unsigned char)*((unsigned char *)&input[i]))));
sunifu 0:3ea21ce21fe1 45 c2 = (length>i+1)?((((unsigned char)*((unsigned char *)&input[i+1])))):0;
sunifu 0:3ea21ce21fe1 46 c3 = (length>i+2)?((((unsigned char)*((unsigned char *)&input[i+2])))):0;
sunifu 0:3ea21ce21fe1 47
sunifu 0:3ea21ce21fe1 48 c = ((c1 & 0xFC) >> 2);
sunifu 0:3ea21ce21fe1 49 output[j+0] = base64[c];
sunifu 0:3ea21ce21fe1 50 c = ((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4);
sunifu 0:3ea21ce21fe1 51 output[j+1] = base64[c];
sunifu 0:3ea21ce21fe1 52 c = ((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6);
sunifu 0:3ea21ce21fe1 53 output[j+2] = (length>i+1)?base64[c]:'=';
sunifu 0:3ea21ce21fe1 54 c = (c3 & 0x3F);
sunifu 0:3ea21ce21fe1 55 output[j+3] = (length>i+2)?base64[c]:'=';
sunifu 0:3ea21ce21fe1 56 }
sunifu 0:3ea21ce21fe1 57 output[(((length-1)/3)+1)<<2] = '\0';
sunifu 0:3ea21ce21fe1 58 return 0;
sunifu 0:3ea21ce21fe1 59 }
sunifu 0:3ea21ce21fe1 60
sunifu 0:3ea21ce21fe1 61 // SMTP ReceiveMessage
sunifu 0:3ea21ce21fe1 62 int SimpleSMTPClient::receiveMessage(int code) {
sunifu 0:3ea21ce21fe1 63 int i;
sunifu 0:3ea21ce21fe1 64 char buf[1500];
sunifu 0:3ea21ce21fe1 65
sunifu 0:3ea21ce21fe1 66 do{
sunifu 0:3ea21ce21fe1 67 i = smtp.receive(buf, sizeof(buf));
sunifu 0:3ea21ce21fe1 68 buf[i]='\0';
sunifu 0:3ea21ce21fe1 69 printf("Recv>>%s[%d] \r\n",buf,i);
sunifu 0:3ea21ce21fe1 70 }while(atoi(buf) != code && i > 0 );
sunifu 0:3ea21ce21fe1 71
sunifu 0:3ea21ce21fe1 72 // Check return code
sunifu 0:3ea21ce21fe1 73 if (i < 0 )
sunifu 0:3ea21ce21fe1 74 return -1;
sunifu 0:3ea21ce21fe1 75
sunifu 0:3ea21ce21fe1 76 return 0;
sunifu 0:3ea21ce21fe1 77 }
sunifu 0:3ea21ce21fe1 78
sunifu 2:27053679f44b 79 int SimpleSMTPClient::sendmail (char *host, char *user, char *pwd, char *domain,char *port,SMTPAuth auth) {
sunifu 0:3ea21ce21fe1 80
sunifu 0:3ea21ce21fe1 81 int ret = -1;
sunifu 2:27053679f44b 82 char ehlo[128];
sunifu 0:3ea21ce21fe1 83
sunifu 0:3ea21ce21fe1 84 smtp.set_blocking(false, 1500);
sunifu 0:3ea21ce21fe1 85 smtp.connect(host, atoi(port)) ;
sunifu 0:3ea21ce21fe1 86 if ( !smtp.is_connected() ){
sunifu 0:3ea21ce21fe1 87 printf("Connection Error!\r\n");
sunifu 0:3ea21ce21fe1 88 smtp.close();
sunifu 0:3ea21ce21fe1 89 return -1;
sunifu 0:3ea21ce21fe1 90 }
sunifu 0:3ea21ce21fe1 91
sunifu 0:3ea21ce21fe1 92 // send request
sunifu 0:3ea21ce21fe1 93 wait_ms(100);
sunifu 2:27053679f44b 94 sprintf(ehlo,"EHLO %s\r\n",domain);
sunifu 2:27053679f44b 95 #ifdef __DEBUG__
sunifu 2:27053679f44b 96 DBG("SEND %s(%d)", ehlo,strlen(ehlo));
sunifu 2:27053679f44b 97 #endif
sunifu 2:27053679f44b 98 smtp.send(ehlo, strlen(ehlo));
sunifu 0:3ea21ce21fe1 99 if (receiveMessage(250)){
sunifu 0:3ea21ce21fe1 100 smtp.close();
sunifu 0:3ea21ce21fe1 101 return -1;
sunifu 0:3ea21ce21fe1 102 }
sunifu 0:3ea21ce21fe1 103
sunifu 0:3ea21ce21fe1 104 if ( auth == SMTP_AUTH_PLAIN ){
sunifu 0:3ea21ce21fe1 105 if ( user && pwd ) {
sunifu 0:3ea21ce21fe1 106 // SMTP auth
sunifu 0:3ea21ce21fe1 107 char tmp[80], buf[100];
sunifu 0:3ea21ce21fe1 108 int len;
sunifu 0:3ea21ce21fe1 109 snprintf(tmp, sizeof(tmp), "%s%c%s%c%s",user, 0, user, 0, pwd);
sunifu 0:3ea21ce21fe1 110 len = strlen(user)*2 + strlen(pwd) + 2;
sunifu 0:3ea21ce21fe1 111 base64enc(tmp, len, buf, sizeof(buf));
sunifu 0:3ea21ce21fe1 112 smtp.send("AUTH PLAIN ", 11);
sunifu 0:3ea21ce21fe1 113 smtp.send(buf, strlen(buf));
sunifu 0:3ea21ce21fe1 114 smtp.send("\r\n", 2);
sunifu 0:3ea21ce21fe1 115 #ifdef __DEBUG__
sunifu 0:3ea21ce21fe1 116 DBG("base64[%s]\r\n", buf);
sunifu 0:3ea21ce21fe1 117 #endif
sunifu 0:3ea21ce21fe1 118 if (receiveMessage(235)){
sunifu 0:3ea21ce21fe1 119 smtp.send("QUIT\r\n", 6);
sunifu 0:3ea21ce21fe1 120 smtp.close();
sunifu 0:3ea21ce21fe1 121 }
sunifu 0:3ea21ce21fe1 122 }
sunifu 0:3ea21ce21fe1 123 }
sunifu 0:3ea21ce21fe1 124
sunifu 2:27053679f44b 125 smtp.send("MAIL FROM: <", 12);
sunifu 0:3ea21ce21fe1 126 smtp.send(getFromAddress(), strlen(getFromAddress()));
sunifu 2:27053679f44b 127 smtp.send(">\r\n", 3);
sunifu 0:3ea21ce21fe1 128 if (receiveMessage(250)) {
sunifu 0:3ea21ce21fe1 129 smtp.close();
sunifu 0:3ea21ce21fe1 130 return -1;
sunifu 0:3ea21ce21fe1 131 }
sunifu 0:3ea21ce21fe1 132 char tmp[128],addr[128];
sunifu 0:3ea21ce21fe1 133 int i = 0;
sunifu 0:3ea21ce21fe1 134 strcpy(tmp,getToAddress());
sunifu 0:3ea21ce21fe1 135
sunifu 0:3ea21ce21fe1 136 while( tmp[i] != '\0' ){
sunifu 0:3ea21ce21fe1 137 int j = 0;
sunifu 0:3ea21ce21fe1 138 while( tmp[i] != ',' ){
sunifu 0:3ea21ce21fe1 139 addr[j] = tmp[i];
sunifu 0:3ea21ce21fe1 140
sunifu 0:3ea21ce21fe1 141 if( tmp[i] == '\0' ) break;
sunifu 0:3ea21ce21fe1 142 j++;
sunifu 0:3ea21ce21fe1 143 i++;
sunifu 0:3ea21ce21fe1 144 }
sunifu 0:3ea21ce21fe1 145 addr[j]='\0';
sunifu 0:3ea21ce21fe1 146
sunifu 0:3ea21ce21fe1 147 #ifdef __DEBUG__
sunifu 0:3ea21ce21fe1 148 DBG("ToAddress[%s]\r\n", addr);
sunifu 0:3ea21ce21fe1 149 #endif
sunifu 0:3ea21ce21fe1 150
sunifu 2:27053679f44b 151 smtp.send("RCPT TO: <", 10);
sunifu 0:3ea21ce21fe1 152 smtp.send(addr, strlen(addr));
sunifu 2:27053679f44b 153 smtp.send(">\r\n", 3);
sunifu 0:3ea21ce21fe1 154 if(tmp[i]==',') i++;
sunifu 0:3ea21ce21fe1 155
sunifu 0:3ea21ce21fe1 156 if (receiveMessage(250)) goto exit;
sunifu 0:3ea21ce21fe1 157 }
sunifu 0:3ea21ce21fe1 158 ret = makeHeader();
sunifu 0:3ea21ce21fe1 159 if ( ret == -1 ) {
sunifu 0:3ea21ce21fe1 160 printf("The headers are less than 256 characters.\r\n");
sunifu 0:3ea21ce21fe1 161 goto exit ;
sunifu 0:3ea21ce21fe1 162 }
sunifu 0:3ea21ce21fe1 163
sunifu 0:3ea21ce21fe1 164 // mail Body
sunifu 0:3ea21ce21fe1 165 smtp.send("DATA\r\n", 6);
sunifu 0:3ea21ce21fe1 166 smtp.send(getHeader(), strlen(getHeader()));
sunifu 0:3ea21ce21fe1 167 smtp.send(getMessage(), strlen(getMessage()));
sunifu 0:3ea21ce21fe1 168 if (receiveMessage(354)) goto exit;
sunifu 0:3ea21ce21fe1 169
sunifu 0:3ea21ce21fe1 170 smtp.send("\r\n.\r\n", 5);
sunifu 0:3ea21ce21fe1 171 if (receiveMessage(250)) goto exit;
sunifu 0:3ea21ce21fe1 172 #ifdef __DEBUG__
sunifu 0:3ea21ce21fe1 173 DBG("Header %s\r\n", getHeader());
sunifu 0:3ea21ce21fe1 174 DBG("Message %s\r\n", getMessage());
sunifu 0:3ea21ce21fe1 175 #endif
sunifu 0:3ea21ce21fe1 176
sunifu 0:3ea21ce21fe1 177 ret = 0;
sunifu 0:3ea21ce21fe1 178
sunifu 0:3ea21ce21fe1 179 smtp.send("QUIT\r\n", 6);
sunifu 0:3ea21ce21fe1 180 if (receiveMessage(221)) goto exit;
sunifu 0:3ea21ce21fe1 181
sunifu 0:3ea21ce21fe1 182 exit:
sunifu 0:3ea21ce21fe1 183 smtp.close();
sunifu 0:3ea21ce21fe1 184
sunifu 0:3ea21ce21fe1 185 return ret;
sunifu 0:3ea21ce21fe1 186 }
sunifu 0:3ea21ce21fe1 187
sunifu 0:3ea21ce21fe1 188 int SimpleSMTPClient::setMessage(char *sub,char *msg)
sunifu 0:3ea21ce21fe1 189 {
sunifu 0:3ea21ce21fe1 190 int n;
sunifu 0:3ea21ce21fe1 191 n = strlen(sub);
sunifu 0:3ea21ce21fe1 192 if( n >= 64 )
sunifu 0:3ea21ce21fe1 193 return -1;
sunifu 0:3ea21ce21fe1 194 n = strlen(msg);
sunifu 0:3ea21ce21fe1 195 if( n >= 1244 )
sunifu 0:3ea21ce21fe1 196 return -1;
sunifu 0:3ea21ce21fe1 197 strcpy(subject,sub);
sunifu 0:3ea21ce21fe1 198 strcpy(message,msg);
sunifu 0:3ea21ce21fe1 199 return 0;
sunifu 0:3ea21ce21fe1 200 }
sunifu 0:3ea21ce21fe1 201
sunifu 0:3ea21ce21fe1 202 int SimpleSMTPClient::addMessage(char *buf)
sunifu 0:3ea21ce21fe1 203 {
sunifu 0:3ea21ce21fe1 204 int n;
sunifu 0:3ea21ce21fe1 205 n = strlen(message);
sunifu 0:3ea21ce21fe1 206 n = n+strlen(buf);
sunifu 0:3ea21ce21fe1 207 if( n >= 1244 )
sunifu 0:3ea21ce21fe1 208 return -1;
sunifu 0:3ea21ce21fe1 209 strcat(message,buf);
sunifu 0:3ea21ce21fe1 210 return 0;
sunifu 0:3ea21ce21fe1 211 }
sunifu 0:3ea21ce21fe1 212
sunifu 0:3ea21ce21fe1 213 int SimpleSMTPClient::setFromAddress(char *fromaddr)
sunifu 0:3ea21ce21fe1 214 {
sunifu 0:3ea21ce21fe1 215 int n;
sunifu 0:3ea21ce21fe1 216 n = strlen(fromaddr);
sunifu 0:3ea21ce21fe1 217 if( n <= 0 )
sunifu 0:3ea21ce21fe1 218 return -1;
sunifu 0:3ea21ce21fe1 219 strcpy(from,fromaddr);
sunifu 0:3ea21ce21fe1 220
sunifu 0:3ea21ce21fe1 221 return n;
sunifu 0:3ea21ce21fe1 222 }
sunifu 0:3ea21ce21fe1 223 char* SimpleSMTPClient::getFromAddress()
sunifu 0:3ea21ce21fe1 224 {
sunifu 0:3ea21ce21fe1 225 return from;
sunifu 0:3ea21ce21fe1 226 }
sunifu 0:3ea21ce21fe1 227 int SimpleSMTPClient::setToAddress(char *toaddr)
sunifu 0:3ea21ce21fe1 228 {
sunifu 0:3ea21ce21fe1 229 int n;
sunifu 0:3ea21ce21fe1 230 n = strlen(toaddr);
sunifu 0:3ea21ce21fe1 231 if( n <= 0 && 128 <= n)
sunifu 0:3ea21ce21fe1 232 return -1;
sunifu 0:3ea21ce21fe1 233 strcpy(to,toaddr);
sunifu 0:3ea21ce21fe1 234
sunifu 0:3ea21ce21fe1 235 return n;
sunifu 0:3ea21ce21fe1 236 }
sunifu 0:3ea21ce21fe1 237 char* SimpleSMTPClient::getToAddress()
sunifu 0:3ea21ce21fe1 238 {
sunifu 0:3ea21ce21fe1 239 return to;
sunifu 0:3ea21ce21fe1 240 }
sunifu 0:3ea21ce21fe1 241
sunifu 0:3ea21ce21fe1 242 char* SimpleSMTPClient::getSubject()
sunifu 0:3ea21ce21fe1 243 {
sunifu 0:3ea21ce21fe1 244 return subject;
sunifu 0:3ea21ce21fe1 245 }
sunifu 0:3ea21ce21fe1 246
sunifu 0:3ea21ce21fe1 247 char* SimpleSMTPClient::getHeader()
sunifu 0:3ea21ce21fe1 248 {
sunifu 0:3ea21ce21fe1 249 return header;
sunifu 0:3ea21ce21fe1 250 }
sunifu 0:3ea21ce21fe1 251
sunifu 0:3ea21ce21fe1 252 char* SimpleSMTPClient::getMessage()
sunifu 0:3ea21ce21fe1 253 {
sunifu 0:3ea21ce21fe1 254 return message;
sunifu 0:3ea21ce21fe1 255 }
sunifu 0:3ea21ce21fe1 256
sunifu 0:3ea21ce21fe1 257 int SimpleSMTPClient::makeHeader(void)
sunifu 0:3ea21ce21fe1 258 {
sunifu 0:3ea21ce21fe1 259 strcpy(header, "From: ");
sunifu 0:3ea21ce21fe1 260 strcat(header, getFromAddress());
sunifu 0:3ea21ce21fe1 261 strcat(header, "\r\n");
sunifu 0:3ea21ce21fe1 262 strcat(header, "To: " );
sunifu 0:3ea21ce21fe1 263 strcat(header, getToAddress());
sunifu 0:3ea21ce21fe1 264 strcat(header, "\r\n");
sunifu 0:3ea21ce21fe1 265 strcat(header, "Subject: ");
sunifu 0:3ea21ce21fe1 266 strcat(header, getSubject());
sunifu 0:3ea21ce21fe1 267 strcat(header, "\r\n\r\n") ;
sunifu 0:3ea21ce21fe1 268
sunifu 0:3ea21ce21fe1 269 if ( strlen(header) > 256 )
sunifu 0:3ea21ce21fe1 270 return -1;
sunifu 0:3ea21ce21fe1 271 return 0;
sunifu 0:3ea21ce21fe1 272 }