Yahoo blocking company mail server

**UPDATE** = 8/28/14 @ 1:54pm EST

Just received the following message from John at Yahoo Customer Care:

Hi Chris, 

I want to add some additional information to ensure you're updated on the findings of our investigation. 

It appears your domain and IP address are on 3rd party blacklists not associated with Yahoo.  Therefore, we are unable to resolve your issue.  You’ll need to address this blacklisting immediately, as it may be contributing to your delivery issues. 

I highly recommend that you begin an online research for your domain’s DNS/SMTP records.  It’s widely known that negative domain information can contribute to your mail being blocked or categorized as spam.  

Thanks for your patience. 

Regards, 

John 

Yahoo Customer Care 

Go mobile with Yahoo, so you are always in the know!

 

This is complete garbage, as I have ran NUMEROUS tests for blacklisting and EVERY one of them have come back negative. If this was the case, why didn't John provide the names of the lists that our server is supposedly on?  AND obviously he didn't read my original comments or he would know that we've been hosting websites and email since 2003.  Of course I am fully aware of the effect of "negative domain information".

Here's just ONE of the tests that we've ran: 

http://multirbl.valli.org/lookup/209.166.143.70.html

Furthermore, our server logs specifically show the IP address and a URL pointing to a Yahoo site.  In tracing the IP addresses that are listed they are all owned and registered to Yahoo Broadcast Services or Yahoo.  So how can he possibly say that it's not Yahoo that's blocking us?

Here is the server log:

 

Thu 2014-08-28 09:40:16: Attempting SMTP connection to [mta5.am0.yahoodns.net:25]
Thu 2014-08-28 09:40:16: Resolving A record for [mta5.am0.yahoodns.net] (DNS Server: 8.8.8.8)...
Thu 2014-08-28 09:40:17: *  D=mta5.am0.yahoodns.net TTL=(0) A=[98.136.217.203]
Thu 2014-08-28 09:40:17: Attempting SMTP connection to [98.136.217.203:25]
Thu 2014-08-28 09:40:17: Waiting for socket connection...
Thu 2014-08-28 09:40:17: *  Connection established (209.166.143.70:65401 -> 98.136.217.203:25)
Thu 2014-08-28 09:40:17: Waiting for protocol to start...
Thu 2014-08-28 09:40:17: <-- 220 mta1486.mail.gq1.yahoo.com ESMTP ready
Thu 2014-08-28 09:40:17: --> EHLO mail.cgdesignhosting.com
Thu 2014-08-28 09:40:17: <-- 250-mta1486.mail.gq1.yahoo.com
Thu 2014-08-28 09:40:17: <-- 250-PIPELINING
Thu 2014-08-28 09:40:17: <-- 250-SIZE 41943040
Thu 2014-08-28 09:40:17: <-- 250-8BITMIME
Thu 2014-08-28 09:40:17: <-- 250 STARTTLS
Thu 2014-08-28 09:40:17: --> STARTTLS
Thu 2014-08-28 09:40:17: <-- 220 Start TLS
Thu 2014-08-28 09:40:17: SSL negotiation successful (TLS 1.0, 256 bit key exchange, 128 bit  encryption)
Thu 2014-08-28 09:40:17: --> EHLO mail.cgdesignhosting.com
Thu 2014-08-28 09:40:17: <-- 250-mta1486.mail.gq1.yahoo.com
Thu 2014-08-28 09:40:17: <-- 250-PIPELINING
Thu 2014-08-28 09:40:17: <-- 250-SIZE 41943040
Thu 2014-08-28 09:40:17: <-- 250 8BITMIME
Thu 2014-08-28 09:40:17: --> MAIL From:<support@cgdesign.net> SIZE=3469
Thu 2014-08-28 09:40:17: <-- 421 4.7.1 [TS03] All messages from 209.166.143.70 will be permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/421-ts03.html
Thu 2014-08-28 09:40:17: --> QUIT

And here is the IP trace report.  Check it out for yourself to see that the server belongs to Yahoo:

http://www.ip-adress.com/ip_tracer/63.250.192.46
http://www.ip-adress.com/ip_tracer/98.136.217.203

So, according to John's response, it can only be determined that Yahoo is using some 3rd party blacklist that no one knows about, or they simply don't want to deal with the issue.

At this point I'm ready to launch a campaign involving the news media and all of the major tech blogs.  This is completely uncalled for, and obviously Yahoo doesn't want to do anything about it.

**************************************************************************************

For a week now Yahoo has been blocking emails sent from our company mail server.

As most of you know I own CG Design LLC.  Since 2003 we've offered web and email hosting, and have dedicated servers in a data center in Pittsburgh, PA and recently New Jersey.  We are constantly monitoring the servers for attacks, mostly dealing with email-related issues.  We serve both personal and business customers who rely on our servers to be up and running and free of issues.

Over the last week we've had numerous complaints from our customers that they can't send email to any of their clients with Yahoo email accounts.  After looking at the server logs we discovered that Yahoo is blocking email from our server IP address.  The following is the exact messages that appears in the server logs:

Thu 2014-08-28 08:54:15: <-- 421 4.7.1 [TS03] All messages from 209.166.143.70 will be permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/421-ts03.html

As the owner, I personally took on the responsibility of handling the issue, and have reached out to Yahoo to resolve this issue.  The frustrating part is that there's no way to call Yahoo, as all of the numbers that I have found and tried I've been on hold for over an hour each time with no live person to talk to.  I can't send them an email because...well...they're blocking our mail server.  So, I took to Twitter and received a general response to use an online form that I already filled out.  I responded to their tweet, only to receive nothing in return.

At 3:55pm PST I received a response from my online form submission stating that they "made appropriate changes to this IP address in our database".  So, I logged into our mail server and attempted to re-send two of the emails that had failed.  To my dismay I received the same message that the server had been blocked.  So, I thought maybe it would take some time for the change to take effect.  This morning I made another attempt, and the above message is what I received.

The sad thing is that our server is not listed on any other spam blacklist, including SpamHaus, McAfee Trusted Source, or any other blacklist that we've been able to find.  All of the tests check out for DNS issues, MX records, etc.  There is absolutely no reason for Yahoo to be blocking us, but yet they have made it impossible for us to continue doing business with our customers who rely on us to send email to their clients with Yahoo-supported accounts.  And, this isn't just people with Yahoo.com email addresses.  It's also people with SBCGlobal addresses and a number of other domains.

Believe me when I tell you that we have spent a considerable amount of time fighting spam, both incoming and outgoing.  I am constantly adjusting the security settings for incoming mail filtering because I'm personally tired of getting 50-60 messages a day trying to get me to buy windows, switch insurance companies, or divorce my wife for a new Russian bride that it waiting for me.  And as a result I have implemented a very strict policy for any of my customers who want to initiate an email campaign for marketing purposes.  I personally approve or deny each request, and once the campaign kicks off I am glued to the server watching its every move.  If something doesn't look right, I immediately stop the campaign and notify my customer.

Only once has a spammer been able to infiltrate our server, and it was used to attempt to send 68,000 unsolicited messages before it was caught.  This was due to one of our clients giving their username and password out to someone they shouldn't have.  The server was immediately suspended, and the majority of the 68,000 emails were permanently deleted.  We adjusted the security settings to be even more stringent and haven't had an issue since.

As you can see I am extremely frustrated by this whole situation, and it's severely affecting our business.  We already lost 2 customers, and a third one is threatening to leave by the end of the week if it's not resolved.  Yahoo isn't being much help, and at this point I don't know what more I can do.

 

**UPDATE** - 8/28/14 @ 12:22pm EST

Right now we have 21 emails in the retry queue of our mail server that are waiting to be delivered to business clients of 3 of my customers.  This is completely uncalled for considering that this issue is supposedly fixed according to Yahoo.  Apparently they noticed on Twitter again, as I just got a response that they have "escalated this to out Postmaster team to review further".  I surely hope this is true because I'm waiting for a phone call that we just lost another hosting customer.

If you are reading this as a Yahoo employee, the incident numbers are 140826-014905 and 140828-014342.  My contact information is included and I am eagerly waiting for you to contact me.




28. August 2014 09:27 by cglavan | Comments (0) | Permalink

Fruit Basket Frenzy

Fruit Basket Frenzy

Available now on the iTunes App Store

The sky has opened up and fruit is raining down on the land. Your mission is to catch as many fruit as you can while avoiding the bombs that are mixed in. Grabbing a PowerUp clears the board of the same kind of fruit, bombs, or if you're lucky enough to grab a star it will clear everything.

Move your basket anywhere on the field, but don't get too greedy or you'll catch a bomb instead. The longer you go, the more the fruit numbers multiply, and the faster it comes down.

Fruit Basket Frenzy is my first attempt at iOS development, and it quickly becoming a popular game for all ages. As a seasoned software engineer with 10+ years of experience in the .Net world in both Winforms and Web applications, I decided to expand my skillset to include Objective-C used by Apple for Mac OS and iOS development. Coming from a primarily C# background, the learning curve was bearable as I dove into the Apple realm to see what I could do. This initial idea was to come up with a simple game to "test the waters" of iOS development, and to familiarize myself with the XCode IDE and Objective-C language.

I started off exploring Cocos2D as the primary framework, mainly due to the cross-platform capabilities. I wanted to be able to write one code base and distribute it to both iOS and Android (my current phone of choice). In the end I chose SpriteKit for the initial development, firstly because of the documentation and tutorials that I found covering the framework, and secondly because Cocos2D for Android requires knowledge of C++...one language that I have yet to dive into full force

After a few short hours of exploring SpriteKit, I was off and coding the core parts of FBF and had a semi-working app shortly after. I went through a few iterations, trying to balance my lack of experience in game development with the fundamental aspects that make a game fun to play. The overall objective was to create a simple game that our 3-year-old could play, while keeping it challenging enough for teens and adults as well. Over a 3-day period I was able to successfully put everything together, and managed to come up with the game that is available today

As stated in the app description, the objective is simple. Move the basket to catch the falling fruit while avoiding the bombs. Various powerups are included for each type of fruit, as well as the bombs, and a star which clears the entire playing field. A powerup is visible by a rotating, flashing icon of the fruit, bomb, or star, which when caught sets off a sparkling explosion of the items that it cleared. The longer you go without catching a bomb, and the higher your score climbs, the faster the fruit falls, and the more of it there is. There is a point where the fruit stops multiplying, but the speed at which it drops continues to increase.

I decided to release FBF as a free game which is ad-supported using the iAd framework. The ads appear at the bottom of the screen, and do not interfere with the overall gameplay. I figured this would be the best option for monetizing the game, and didn't think that anyone would appreciate it if I forced them to watch a 15-second video ad after each game played.

In the end, I hope you enjoy my first attempt at iOS development, and tell others about it. You can post your scores on Facebook using the link on the Game Over screen so that others can see your accomplishments, and as a link for them to download it too.

As part of the official launch of Fruit Basket Frenzy I am holding a competition from now through April 1, 2014. The top 3 high scores will receive a gift card of their choice valued at $50 for 1st place, $25 for 2nd place, and $10 for 3rd place. To qualify you must post your high score on Facebook using the link from within the app, and then notify me on my Facebook page for verification. Only those scores which are posted through the app will be valid (i.e. no screenshot, photos, or videos will be accepted). In addition, the first person to score 1500+ points will win a 16gb iPod Touch. Again, to qualify you must post your score using the link provided in the app, and notify me for verification.

Visit the official Fruit Basket Frenzy Facebook page and tell all of your friends about it.




4. March 2014 16:07 by cglavan | Comments (0) | Permalink

Dynamically resize images in memory

Recently I was working on a project where I needed to have the ability to resize images, but not have the newly created image be saved to the filesystem.  I also didn't want to modify the original image, as the images needed to be kept in their original unmodified form.

After searching the blogs and forums, I came across some code that seemed to do exactly what I needed and then some.  Not only did it create the file in memory, but it also allowed me to specify the width and height, and maintained the aspect ratio of the original image.  What I came up with was an HTTP handler that allowed me to specify a filename, width, and height and have the server return an output stream containing the new image.  Additionally I added a key to the web.config that allowed me to specify the folder that the original images are stored (since this never changed) allowing me to only specify the filename in the calling code.  The resulting code works for both ASP.Net image controls and standard HTML image tags since the ImageUrl or SRC is set to a virtual path with 3 querystring values.

The code for my custom handler is as follows (note that my standard disclaimer found here applies as usual):

First, you need to the this to the <appSettings> section of the web.config, replacing the "Images\Test" with the folder that contains your image

<add key="ResizeHandlerInputFolder" value="Images\Test"/>

Second, add the httpHandler code to the handler section of your web.config (be sure to add it to the correct place depending on the version of IIS that you are using

<add name="PhotoResizeHandler" verb="*" path="*.image" type="PhotoHandler.Resize, PhotoHandler" />

Third, create a new class with the following code, modifying it as you see fit. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Web;
using System.Drawing;
using System.Configuration;
using System.IO;

namespace PhotoHandler
{
    public class Resize : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            try
            {
                if (context.Request.QueryString["filename"] != null)
                {
                    if (context.Request.QueryString["width"] != null && context.Request.QueryString["height"] != null)
                    {
                        Image FullsizeImage = Image.FromFile(context.Server.MapPath(context.Request.ApplicationPath) + "\\" + ConfigurationManager.AppSettings["ResizeHandlerInputFolder"] + "\\" + context.Request.QueryString["filename"].ToString());
                        int NewWidth = int.Parse(context.Request.QueryString["width"].ToString());
                        int MaxHeight = int.Parse(context.Request.QueryString["height"].ToString());
                        // Prevent using images internal thumbnail                        
                        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
                        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

                        if (FullsizeImage.Width  MaxHeight)
                        {
                            NewWidth = FullsizeImage.Width * MaxHeight / FullsizeImage.Height;
                            NewHeight = MaxHeight;
                        }

                        System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero);

                        using (MemoryStream ms = new MemoryStream()) 
                        {
                            if (Path.GetExtension(context.Request.QueryString["filename"].ToLower()) == ".jpg")
                            {
                                context.Response.ContentType = "image/jpg";
                                NewImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                            }
                            else if (Path.GetExtension(context.Request.QueryString["filename"].ToLower()) == ".gif")
                            {
                                context.Response.ContentType = "image/gif";
                                NewImage.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                            }
                            else if (Path.GetExtension(context.Request.QueryString["filename"].ToLower()) == ".png")
                            {
                                context.Response.ContentType = "image/png";
                                NewImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                            }
                            ms.WriteTo(context.Response.OutputStream); 
                        }
                        
                        FullsizeImage.Dispose();
                        NewImage.Dispose();
}
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}

To use the new handler, create a standard HTML image with the SRC set as a call to the .image extension. You'll need to pass in the 3 querystring parameters as well. An example of this is as follows:

<img src="Resize.image?filename=mypic.jpg&width=100&height=50" alt="" />

The result should be as seen below with my logo. The top image is the full-size image, and the bottom is the newly resize version:

Full-size logo

One last note is that the height that you specify isn't necessarily going to be the final height of the image, but the maximum height that the final image can be.  The code adjusts the height to maintain the aspect ratio depending on the width that you specify.  In my above example I specified a width of 200px and a height of 100px.  The resulting image is actually 200px wide by 48px high because the code also maintains the aspect ratio.

I hope this code helps someone.  Feel free to modify it as needed and use it in your own projects.




14. August 2013 16:44 by cglavan | Comments (0) | Permalink