Если у вас есть vps или выделенный сервер, вы можете запрограммировать свой собственный модуль с помощью программирования C.
para.h
/*
* File: para.h
* Author: rahul
*
* Created on 10 February, 2016, 11:24 AM
*/
#ifndef PARA_H
#define PARA_H
#ifdef __cplusplus
extern "C" {
#endif
#define From ""
#define To ""
#define From_header "Rahul"
#define TO_header "Mini"
#define UID "smtp server account ID"
#define PWD "smtp server account PWD"
#define domain "dfgdfgdfg.com"
#ifdef __cplusplus
}
#endif
#endif
/* PARA_H */
main.c
/*
* File: main.c
* Author: rahul
*
* Created on 10 February, 2016, 10:29 AM
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "time.h"
#include "para.h"
/*
*
*/
my_bool SendEmail_init(UDF_INIT *initid,UDF_ARGS *arg,char *message);
void SendEmail_deinit(UDF_INIT *initid __attribute__((unused)));
char* SendEmail(UDF_INIT *initid, UDF_ARGS *arg,char *result,unsigned long *length, char *is_null,char* error);
/*
* base64
*/
int Base64encode_len(int len);
int Base64encode(char * coded_dst, const char *plain_src,int len_plain_src);
int Base64decode_len(const char * coded_src);
int Base64decode(char * plain_dst, const char *coded_src);
/* aaaack but it's fast and const should make it shared text page. */
static const unsigned char pr2six[256] =
{
/* ASCII table */
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
};
int Base64decode_len(const char *bufcoded)
{
int nbytesdecoded;
register const unsigned char *bufin;
register int nprbytes;
bufin = (const unsigned char *) bufcoded;
while (pr2six[*(bufin++)] <= 63);
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
return nbytesdecoded + 1;
}
int Base64decode(char *bufplain, const char *bufcoded)
{
int nbytesdecoded;
register const unsigned char *bufin;
register unsigned char *bufout;
register int nprbytes;
bufin = (const unsigned char *) bufcoded;
while (pr2six[*(bufin++)] <= 63);
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
bufout = (unsigned char *) bufplain;
bufin = (const unsigned char *) bufcoded;
while (nprbytes > 4) {
*(bufout++) =
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
*(bufout++) =
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
*(bufout++) =
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
bufin += 4;
nprbytes -= 4;
}
/* Note: (nprbytes == 1) would be an error, so just ingore that case */
if (nprbytes > 1) {
*(bufout++) =
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
}
if (nprbytes > 2) {
*(bufout++) =
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
}
if (nprbytes > 3) {
*(bufout++) =
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
}
*(bufout++) = '\0';
nbytesdecoded -= (4 - nprbytes) & 3;
return nbytesdecoded;
}
static const char basis_64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int Base64encode_len(int len)
{
return ((len + 2) / 3 * 4) + 1;
}
int Base64encode(char *encoded, const char *string, int len)
{
int i;
char *p;
p = encoded;
for (i = 0; i < len - 2; i += 3) {
*p++ = basis_64[(string[i] >> 2) & 0x3F];
*p++ = basis_64[((string[i] & 0x3) << 4) |
((int) (string[i + 1] & 0xF0) >> 4)];
*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
((int) (string[i + 2] & 0xC0) >> 6)];
*p++ = basis_64[string[i + 2] & 0x3F];
}
if (i < len) {
*p++ = basis_64[(string[i] >> 2) & 0x3F];
if (i == (len - 1)) {
*p++ = basis_64[((string[i] & 0x3) << 4)];
*p++ = '=';
}
else {
*p++ = basis_64[((string[i] & 0x3) << 4) |
((int) (string[i + 1] & 0xF0) >> 4)];
*p++ = basis_64[((string[i + 1] & 0xF) << 2)];
}
*p++ = '=';
}
*p++ = '\0';
return p - encoded;
}
/*
end of base64
*/
const char* GetIPAddress(const char* target_domain) {
const char* target_ip;
struct in_addr *host_address;
struct hostent *raw_list = gethostbyname(target_domain);
int i = 0;
for (i; raw_list->h_addr_list[i] != 0; i++) {
host_address = raw_list->h_addr_list[i];
target_ip = inet_ntoa(*host_address);
}
return target_ip;
}
char * MailHeader(const char* from, const char* to, const char* subject, const char* mime_type, const char* charset) {
time_t now;
time(&now);
char *app_brand = "Codevlog Test APP";
char* mail_header = NULL;
char date_buff[26];
char Branding[6 + strlen(date_buff) + 2 + 10 + strlen(app_brand) + 1 + 1];
char Sender[6 + strlen(from) + 1 + 1];
char Recip[4 + strlen(to) + 1 + 1];
char Subject[8 + 1 + strlen(subject) + 1 + 1];
char mime_data[13 + 1 + 3 + 1 + 1 + 13 + 1 + strlen(mime_type) + 1 + 1 + 8 + strlen(charset) + 1 + 1 + 2];
strftime(date_buff, (33), "%a , %d %b %Y %H:%M:%S", localtime(&now));
sprintf(Branding, "DATE: %s\r\nX-Mailer: %s\r\n", date_buff, app_brand);
sprintf(Sender, "FROM: %s\r\n", from);
sprintf(Recip, "To: %s\r\n", to);
sprintf(Subject, "Subject: %s\r\n", subject);
sprintf(mime_data, "MIME-Version: 1.0\r\nContent-type: %s; charset=%s\r\n\r\n", mime_type, charset);
int mail_header_length = strlen(Branding) + strlen(Sender) + strlen(Recip) + strlen(Subject) + strlen(mime_data) + 10;
mail_header = (char*) malloc(mail_header_length);
memcpy(&mail_header[0], &Branding, strlen(Branding));
memcpy(&mail_header[0 + strlen(Branding)], &Sender, strlen(Sender));
memcpy(&mail_header[0 + strlen(Branding) + strlen(Sender)], &Recip, strlen(Recip));
memcpy(&mail_header[0 + strlen(Branding) + strlen(Sender) + strlen(Recip)], &Subject, strlen(Subject));
memcpy(&mail_header[0 + strlen(Branding) + strlen(Sender) + strlen(Recip) + strlen(Subject)], &mime_data, strlen(mime_data));
return mail_header;
}
my_bool SendEmail_init(UDF_INIT *initid,UDF_ARGS *arg,char *message){
if (!(arg->arg_count == 2)) {
strcpy(message, "Expected two arguments");
return 1;
}
arg->arg_type[0] = STRING_RESULT;// smtp server address
arg->arg_type[1] = STRING_RESULT;// email body
initid->ptr = (char*) malloc(2050 * sizeof (char));
memset(initid->ptr, '\0', sizeof (initid->ptr));
return 0;
}
void SendEmail_deinit(UDF_INIT *initid __attribute__((unused))){
if (initid->ptr) {
free(initid->ptr);
}
}
char* SendEmail(UDF_INIT *initid, UDF_ARGS *arg,char *result,unsigned long *length, char *is_null,char* error){
char *header = MailHeader(From_header, TO_header, "Hello Its a test Mail from Codevlog", "text/plain", "US-ASCII");
int connected_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
struct sockaddr_in addr;
memset(&addr, 0, sizeof (addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(25);
if (inet_pton(AF_INET, GetIPAddress(arg->args[0]), &addr.sin_addr) == 1) {
connect(connected_fd, (struct sockaddr*) &addr, sizeof (addr));
}
if (connected_fd != -1) {
int recvd = 0;
const char recv_buff[4768];
int sdsd;
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char buff[1000];
strcpy(buff, "EHLO "); //"EHLO sdfsdfsdf.com\r\n"
strcat(buff, domain);
strcat(buff, "\r\n");
send(connected_fd, buff, strlen(buff), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char _cmd2[1000];
strcpy(_cmd2, "AUTH LOGIN\r\n");
int dfdf = send(connected_fd, _cmd2, strlen(_cmd2), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char _cmd3[1000];
Base64encode(&_cmd3, UID, strlen(UID));
strcat(_cmd3, "\r\n");
send(connected_fd, _cmd3, strlen(_cmd3), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char _cmd4[1000];
Base64encode(&_cmd4, PWD, strlen(PWD));
strcat(_cmd4, "\r\n");
send(connected_fd, _cmd4, strlen(_cmd4), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char _cmd5[1000];
strcpy(_cmd5, "MAIL FROM: ");
strcat(_cmd5, From);
strcat(_cmd5, "\r\n");
send(connected_fd, _cmd5, strlen(_cmd5), 0);
char skip[1000];
sdsd = recv(connected_fd, skip, sizeof (skip), 0);
char _cmd6[1000];
strcpy(_cmd6, "RCPT TO: ");
strcat(_cmd6, To); //
strcat(_cmd6, "\r\n");
send(connected_fd, _cmd6, strlen(_cmd6), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char _cmd7[1000];
strcpy(_cmd7, "DATA\r\n");
send(connected_fd, _cmd7, strlen(_cmd7), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
send(connected_fd, header, strlen(header), 0);
send(connected_fd, arg->args[1], strlen(arg->args[1]), 0);
char _cmd9[1000];
strcpy(_cmd9, "\r\n.\r\n.");
send(connected_fd, _cmd9, sizeof (_cmd9), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
recvd += sdsd;
char _cmd10[1000];
strcpy(_cmd10, "QUIT\r\n");
send(connected_fd, _cmd10, sizeof (_cmd10), 0);
sdsd = recv(connected_fd, recv_buff + recvd, sizeof (recv_buff) - recvd, 0);
memcpy(initid->ptr, recv_buff, strlen(recv_buff));
*length = recvd;
}
free(header);
close(connected_fd);
return initid->ptr;
}
Чтобы настроить проект, просмотрите это видео: https: // www
Я разрешу, если появится какая-либо ошибка в вышеприведенном коде, Just Inform в комментарии
Если ваша цель - выучить свой родной язык, и вы не собираетесь стать серьезным программистом, во что бы то ни стало выучите язык, который вы собираетесь использовать.
Если вы собираетесь стать серьезным программистом, вы действительно должны когда-нибудь стать опытным в Си. Я не знаю, какой путь будет сложнее, начиная с C # или начиная с C. C будет непросто, когда вы к нему подойдете.
Если вы уже знаете некоторые языки, но не C или C #, перейдите на C # сейчас, а позже выберите C.
Ключевым моментом является то, что C является более простым языком, но для достижения значительных результатов в нем требуются более сложные структуры. Некоторые вещи, которые вы легко можете сделать в C #, будут сложными в C, хотя C является более распространенным и универсальным языком.
Конечно, C # легче понять. Конечно, знание C поможет, но если вы не знаете C, лучше начать с языка более высокого уровня, как C #.
Можно также прочитать « Язык программирования C » от K & amp; R, потому что это быстрое чтение, и оно даст вам представление, которое может помочь понять производительность, происходящую за кулисами в мусоре. язык коллекции.
Сходство между C ++ и C # заканчивается лексером.
Я обнаружил, что изучение Java для большинства ООП наиболее полезно для изучения C #, поскольку они почти идентичны по библиотекам и синтаксису.
Знание C или C ++ становится полезным только после того, как вы углубитесь в C # в такие области, как неуправляемый код.
Изучение C или C ++ было бы более трудным, но вы, вероятно, стали бы гораздо более привыкшими к основам, что никогда не было бы плохо.
При этом, я не уверен насчет "желательного", но это не будет "неправильно" ... скорее вопрос предпочтения.
Это не должно быть проблемой. Пока вы разбираетесь в объектно-ориентированном программировании, у вас все в порядке.
Мой ответ на все вопросы формы «Должен ли я изучать язык X или Y? Должен ли я изучать Z до Y и X после Y?» и т. д. то же самое: не беспокойтесь о таких вопросах. Забудь их. Если вы думаете, что изучение C # сейчас будет более полезным (может быть, есть больше рабочих мест, или вы хотите присоединиться к проекту, или, может быть, вам просто любопытно), тогда сядьте и начните учиться.
Если вы уже хорошо владеете одним языком, вам не понадобится много времени, чтобы подобрать достаточно для того, чтобы понять, сможете ли вы продуктивно использовать его. И вы не можете решить, стоит ли вам уделять много времени изучению языка, не зная его. Поэтому начните изучать C #, если хотите.
Чтобы довести это до крайности, я думаю, тот факт, что около 30 лет назад я изучил сборку Z80 еще до изучения BASIC, очень помог мне в этом. Тем не менее, я бы никогда не советовал вам изучать другие языки, пока вы не освоите сборку. (Кстати, все, что я помню, это код операции 0xc9 RET
).
Итак, начните изучать C #. Если вам любопытно, продолжайте изучать C, все время помня, что, несмотря на то, что оба имеют фигурные скобки, они совершенно разные языки. Так же, как C и C ++.
Если вы не образованный программист ООП, скорее всего, лучше избегать C (или даже C ++), если вы не большой поклонник ненависти к себе. Все остальные заявленные причины верны, но имейте в виду, что C # также управляется (посмотрите), поэтому гораздо труднее попасть в «неприятности» с .
Конечно! C # - это язык намного более высокого уровня, чем C, и он обрабатывает множество деталей для вас.
Хотя есть одна рекомендация, C # - очень хороший язык, но он имеет немного более крутой курс обучения, чем VB.NET. VB.NET НЕ Visual Basic, он просто переносит часть синтаксиса.
Синтаксис и ключевые слова VB.NET легче выучить, а затем легко переводить на C #. Помимо особых случаев, очень мало вещей, которые один язык может сделать, а другой - нет, и, поскольку VB.NET легче изучать, я большой сторонник его использования в качестве языка "welcome to .NET".
Просто для пояснения: не следует распространять клеймо «Классического» VB на VB.NET, VB6 и VB.NET - это совершенно разные языки и структуры, имеющие только поверхностное сходство.
VB.NET предлагает несколько новинок для новых разработчиков:
Чтобы быть справедливым, у меня есть один главный недостаток , который я имею с шаблонами кода VB.NET по умолчанию - они не имеют «Option Strict On» и «Option Explicit На "заявлениях наверху. Если вы попадете в VB.NET, обязательно добавьте их в каждый класс, они позволят компилятору выполнять более упреждающую проверку ошибок и приведут к более высокому качеству кода и понимания системы типов .NET
Предложить пример эквивалентного кода .NET, написанного на C # и VB.NET:
C #
interface INamedObject
{
string Name { get; set; }
}
abstract class MyBaseClass
{
void PrintType()
{
Console.WriteLine(this.GetType().Name);
}
}
class MyConcreteClass : MyBaseClass, INamedObject
{
public MyConcreteClass()
: base()
{
}
public string Name
{
get;
set;
}
}
VB.NET
Option Strict On
Option Explicit On
Interface INamedObject
Property Name() As String
End Interface
MustInherit Class MyBaseClass
Sub PrintType()
Console.WriteLine(Me.GetType.Name)
End Sub
End Class
Class MyConcreteClass
Inherits MyBaseClass
Implements INamedObject
Public Sub New()
MyBase.New()
End Sub
Private _Name As String
Public Property Name() As String Implements INamedObject.Name
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
End Class
Как и я, если вы спешите изучать новый язык, прыгайте прямо. Но если у вас много времени (студент), я думаю, что каждый, кто хочет называться кодером, должен знать C.
Это, конечно, возможно.
Знание других языков всегда полезно - хотя бы потому, что вы знакомы с программированием - но не обязательно.
Одна вещь, которую многие новые программисты не упоминают, это то, что они хотят сделать? Вы хотите сделать что-то простое, как привет мир? Или вы хотите сделать что-то более сложное, например, приложение с графическим интерфейсом или видеоигру?
Причина этого заключается в том, что не каждый язык программирования подходит для каждой задачи. Как уже упоминали другие, C - это отличный язык для систем и драйверов (или на самом деле всего, что требует низкоуровневого интерфейса или предельной производительности), а C # предназначен для создания настольных приложений - от текстовых редакторов до огромных многоуровневых корпоративных решений. Несмотря на названия этих языков, они на самом деле имеют только похожее имя и несколько общих синтаксисов.
Я бы порекомендовал начать с C # и сохранить C на потом. Вы можете быстро начать работать с множеством бесплатных инструментов, таких как Visual Studio Express C # . Если позже вы захотите начать работать с такими вещами, как ядро Linux, компиляторы или драйверы аппаратного обеспечения, вы можете быстро подобрать C. Язык C по-прежнему стоит изучать.
Да. Когда я начинал с C #, у меня не было опыта работы с C.
У меня такой вопрос: вы пытаетесь выбрать первый язык для изучения программирования? (C # является опцией) или вы знаете другой язык и думаете, что вам может потребоваться выучить C до C #?
Если вы не пытаетесь изучать программирование, я бы сказал, что вы можете пропустить C и перейти прямо к C #. Но для первого языка я бы не советовал. Попробуйте использовать язык сценариев, чтобы вы могли быстро написать код.
Я собираюсь повторить здесь много ответов, но я хотел сказать что-то более конкретное, чем говорили другие люди.
Я думаю, что это нормально - перейти на C # или любой другой объектно-ориентированный язык в качестве вашего первого языка. На самом деле многие люди утверждают, что ОО-язык должен быть вашим первым языком, если вы хотите стать успешным в ОО, потому что вы не будете застревать в процедурном мышлении.
Тем не менее, хорошие программисты, у которых нет хотя бы приличной работающей ментальной модели для того, что происходит под прикрытием, немногочисленны. Это означает, что в конечном итоге вы должны узнать, как компьютер управляет памятью, указателями, как процессор выполняет инструкции и т. Д. В конечном счете, чтение ИМС и книги по сборке было бы хорошей идеей. Я не думаю, что вам нужно стать опытным в любом; Вам просто нужно прийти к базовому пониманию того, как работают компьютер и языки программирования.
Конечно. C # использует C-подобный синтаксис, но я думаю, что вам будет легче учиться, чем C.
Хотя C является хорошим языком для изучения в целом, я не верю, что вы получите какие-то конкретные знания, которые помогут вам выучить C #.
Конечно. C # заимствует семантические соглашения из C, но, конечно, нет необходимости изучать его.
Фактически, вы пропустите фазу, когда вы пытаетесь использовать C #, как если бы это было C.
Да, язык программирования C не является обязательным условием для изучения C #. Знание некоторого C определенно поможет вам быстрее освоить синтаксис C #, но помимо этого есть немного сходств.
C # и C очень разные, у них общий синтаксис, но стиль программирования совершенно другой. Это не повредит изучению C, но если ваша цель - C #, начните с этого.
Обучение C научит вас больше о том, как работает компьютер, и даст вам низкий уровень понимания. C # - это язык высокого уровня с более низкой кривой обучения для получения графического интерфейса.
Джоэл и Джефф часто обсуждают ценность обучения C, stackcastflow подкаст № 2 является одним из примеров